This is a plugin for laying out a dynamic grid of elements.
See the documentation page for examples.
The repository also includes many functional examples. All images used in the example are copyrighted by their respective owners and only included for showcasing plugin functionality.
Do you like this project? Buy us a beer
First download or clone this repository.
Because we use the bower
package manager for jQuery
and other libraries you currently have to
to install bower
first.
After that you can run bower install
and all necessary libraries for the examples will be installed.
We will provide a special download in the future which contains all necessary packages.
We are currently creating a new and better documentation at readthedocs.
Its automatically created by the sources in the doc
directory.
The documentation can be rendered locally by installing sphinx
and sphinx-autobuild
and running sphinx-autobuild . _build
in the doc
directory.
Since version 2.0 of Wookmark, the plugin doesn't depend on jQuery anymore. This allows you to use Wookmark without the overhead of the jQuery library.
Because this meant a big change to the plugin, we also changed a lot in the code and tried to make it easier to use. The way you initialize the plugin is now different and a few options have changend. So if you upgrade you have to adapt your code. See the examples and this readme on how to do this.
bower install wookmark-jquery
npm install wookmark
- jQuery - 1.5.3 or better
Copy wookmark.js
or the minified version wookmark.min.js
to your javascript folder.
There are some styles for tiles-wrap
in css/main.css
you might want to use.
The plugin can be intialized in different ways. options
are optional.
var wookmark = new Wookmark('#myElementContainer'[, options ]);
$('#myElementContainer').wookmark(options);
Where myElementContainer
is the class or id of the element or elements wrapping your tiles. A Wookmark instance will be created for each element.
{
align: 'center',
autoResize: false,
comparator: null,
container: $('body'),
direction: undefined,
ignoreInactiveItems: true,
itemWidth: 0,
fillEmptySpace: false,
flexibleWidth: 0,
offset: 2,
onLayoutChanged: undefined,
outerOffset: 0,
possibleFilters: [],
resizeDelay: 50,
verticalOffset: undefined
}
See the documentation page for details on available options.
These values can be given as numbers which will be interpreted as pixels or you can use percentage strings like '20%'.
You can also provide a function which should return either a number or a percentage string.
When flexibleWidth
is set and itemWidth
is not 0 itemWidth
used as minimum item width.
As example using a flexibleWidth
of 40% will result in two columns with 10% space to the sides of the container.
offset
is the horizontal and vertical space between two tiles.
outerOffset
is the space between the outer tiles and the parent container.
verticalOffset
is optional and can be set to achieve a vertical offset between two tiles which is different from offset
.
This creates placeholders at the bottom of each column to create an even layout. See example-placeholder
on how to use it.
These placeholders use the css class wookmark-placeholder
. You can overwrite it in your own css to fit your needs.
When set to false
inactive items will still be shown when filtered. This can be used to fade out filtered items.
See the example-filter/fade.html example.
You can use this option to provide a custom comparator function which the plugin will use to sort the tiles. See example-sort or example-stamp on how to use it.
Elements which are hidden have cannot be laid out until they are visible. If you use wookmark on a hidden tab layout will not be immediately performed. When the tab is made visible you can manually refresh Wookmark using a trigger on your container.
wookmark.layout(true);
or
document.getElementById('container').dispatchEvent(new Event('refreshWookmark'));
or with jQuery
$('#container').trigger('refreshWookmark');
A relayout happens then the viewport is resized, you can also trigger this manually via
window.dispatchEvent(new Event('resize'));
or with jQuery
$(window).trigger('resize');
You can filter all items of the handler when they have filters specified. See example-filter
for details how to do this.
The call to filter will also return the resulting list of items.
wookmark.filter([filters=[]][,mode='or'][,dryRun=false]);
If you just want to check if there would be a resulting list of items you can call filter with the dryRun
option set to true
.
See our docco.
Some of the examples need the jQuery or imagesLoaded plugins. Be sure to run bower install to have them working.
Is the preferred setup. In this scenario the width and height of all images is set in the HTML img attributes. The grid layout can be performed as soon as the document is rendered, BEFORE images are loaded.
In this example, the width and height of the images is not known. Via Paul Irish's imagesLoaded plugin (slightly modified by desandro). The grid layout is performed after all images are loaded and their dimensions can be retrieved. This approach is much slower. The imagesLoaded plugin can also be found on github right here: https://github.com/desandro/imagesloaded
This example shows how to load and initialize the plugin when using require.js
or a different amd loading method.
This example shows how to load the tile data from a remote api and layout it.
This example shows how to add new tiles at runtime and refresh the layout.
This example shows to use the filter
feature of the plugin to show just the tiles the user wants.
This example shows how to use the flexibleWidth
option. This option allows your tiles to grow a certain amount, as long as there is room. When using percentage values for the width options you can create a fixed column count layout.
This example shows you how to include a lightbox.
This example shows you how to enable placeholders at the bottom of the tile layout to create an even footer.
This example shows how the sort
feature works. This option allows you to specify a sorting function which will rearrange your tiles.
For example you can use it to sort your tiles containing products by price, popularity or name.
You should use the 'imagesloaded' plugin. Most the examples in this package include the code how to use it.
Use the 'finished'-callback of your animation/effect to trigger 'refreshWookmark' on the container element supplied to the plugin.
Set 'position: relative' on your container element and check if there are other elements in the container before your tiles.
Send us some feedback or create an issue on github.
Beware: These links lead to sites which are not necessarily related to the authors of the Wookmark plugin so we don't have any control over their content.
- Customize the plugin online with bitconfig
- TYPO3 extension for YAG
- Drupal Wookmark plugin
- Tumblr template example
Send a message if you want to be included with your site on this list!
Please send code specific questions and feedback to Sebastian or contact him on twitter.
If you have other questions and feedback which is for example related to Wookmark send a mail to Christoph or contact him on twitter.
Contribute!