Skip to content

Instantly share code, notes, and snippets.

@mariovalney
Created November 9, 2018 17:54
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mariovalney/b6e56f061698031f1684edee43a2dc1e to your computer and use it in GitHub Desktop.
Save mariovalney/b6e56f061698031f1684edee43a2dc1e to your computer and use it in GitHub Desktop.
Filter a Slick carousel when using grid mode (rows).
(function( $ ) {
$.fn.slickFilterable = function( options ) {
/**
* A plugin to create a slick we can filter.
*
* If you are not using Rows you can use slickFilter
* (check documentation) otherwise we can provide a valid filter.
*
* options {
* slideSelector string jQuery selector to get slides. Imetiate children by default.
* filterName string We will search for data-{filterName} clickable elements.
* slick object The slick settings. Check Slick doc.
* beforeFilter function A fuction called before filter slider. Receives the trigger element
* as this and 3 params: category (string), slider and slides (jQuery objects).
* filter mix A valid parameter to jQuery filter() function. If it's a functio we will wrap
* it and it receives the trigger element as this and 3 params: category (string),
* slider (jQuery object) and a copy of settings (extended).
* }
*/
var settings = $.extend({
slideSelector: '> *',
filterName: 'filter-slick',
slick: {},
beforeFilter: function() {},
filter: function( element, category, slider, settings ) { return true; },
}, options );
return this.each(function() {
var slider = $(this),
slides = slider.find( settings.slideSelector ),
slickObj;
/**
* Create Slick
*
* TIP: you should you 'slidesPerRow' instead 'slidesToShow' in grid mode (with rows)
* to avoid slick break layout when there are less slides than on "page".
*/
slickObj = slider.slick( settings.slick );
// Handle Filter Click
$('[data-' + settings.filterName + ']').on('click', function(event) {
event.preventDefault();
var category = $(this).data(settings.filterName),
newSlides = $.extend(true, {}, slides),
newSlickOptions;
if ( ! category ) return;
// Before Filter Slides
if ( typeof settings.beforeFilter == 'function' ) {
settings.beforeFilter.call(this, category, slider, slides);
}
// Destroy and empty
slider.slick('unslick');
// Recreate All Slides
if ( category === 'all' ) {
slider.find( settings.slideSelector ).remove();
slider.append( newSlides );
slider.slick( settings.slick );
return;
}
/**
* Filter Slides
*
* If settings.filter is a function we pass the category, slider and a copy of settings
* expecting a true or false return to pass it to jQuery.filter();
*
* If not, we just pass it directly.
*/
if ( typeof settings.filter !== 'function' ) {
newSlides = newSlides.filter( settings.filter );
} else {
newSlides = newSlides.filter( function() {
return settings.filter.call( this, category, slider, $.extend( true, {}, settings ) );
} );
}
slider.find( settings.slideSelector ).remove();
slider.append( newSlides );
slider.slick( settings.slick );
});
});
};
}(jQuery));
@mariovalney
Copy link
Author

mariovalney commented Nov 9, 2018

A working example: https://jsfiddle.net/mariovalney/L8b2d0ox

This is a plugin to simple cases.
Do not tested against add/remove features.

EDIT: improved example

@n0xx
Copy link

n0xx commented Jan 17, 2020

Looks promising and working, thanks a lot for Your work.
Im trying to use Your example but instead of searching by tags (h1/h2 etc etc) like You:
var tag = $(this).children()[0].tagName;
I would like to search by title or data-name of a children.
So i was thinking that this:
var category = $(this).children().attr('title');
going to be work but unfortunately it's not.
Could You help me out ?

@mariovalney
Copy link
Author

mariovalney commented Jan 17, 2020

There is a syntax error on your code (a missing ' after title).

Anyway, I improved the example to use classes.
Can you check? Maybe it can help you.

@n0xx
Copy link

n0xx commented Jan 17, 2020

Wow man, You are amazing, thank You so much, finally someone who found out how to deal with filtering rows in slick slider.
Thanks a lot Mario - You save my day.

@shabanov3552
Copy link

@mariovalney Thank you man for your work))
Everything works perfectly.

@leandreSL
Copy link

@mariovalney Thank you for your work !
I have a question, can this plugin do multiple filter, like on your example, a button that filter by category-1 and gategory-2 ?

@mariovalney
Copy link
Author

Yes.

If settings.filter is a function we pass the category, slider and a copy of settings expecting a true or false return.
This way you can check, for example, a attribute with two categories.

Or you can change the implementation to allow multiple filters, for example, checking the class of a filter (as active or something like that).

@devmadaan
Copy link

Can we use this filter function for 2 different slider on a same page as i am using this function and if I select one filter it's effect reflect on both the slider

@mariovalney
Copy link
Author

Sure. But you should use different filters: https://jsfiddle.net/te9rw2mf/3/

@devmadaan
Copy link

Thanks for the help mario valney it's working now

@ivanhoe-taox
Copy link

You save my .... Thank you very much ( there is small issue with slick, when vertical mode is used, so I just turn on fade effect and it looks perfect :) )

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment