修改瀑布流插件PointerestGrid

我本来是想找一款使用的瀑布流插件,基本要求就是要支持响应式,也要兼容IE8,Github里有一个Masnory插件,看上去高大上,可是好像不兼容IE8,我看蛮多瀑布流插件都是响应式的,但是兼容IE8的蛮少的,估计这种浏览器在国外快绝版了吧。

PINTERESTGUID插件

这是我在JQuery之家看到的插件,他可以兼容IE8,而且用起来好简单。

  看起来蛮不错的,可是不支持响应式,我就想帮它加一个响应式的功能。在Github上没看到这个项目,所以我就下载下来直接改动一下。

原版本
  原版的引用参数是这样的:

$("#gallery-wrapper").pinterest_grid({
                no_columns: 5,
                padding_x: 10,
                padding_y: 10,
                margin_bottom: 50,
                single_column_breakpoint: 700
            });
padding_x,padding_y就是各个卡片之间的右间距和下间距,
no_columns就是制定每行显示多少个卡片,默认是5
single_column_breakpoint是指屏幕宽度低于这个数值的时候就变成单列显示(好像也算是个简单的响应式吧)。

修改版本

思路就是模仿owl-carousel插件,做一个二维数组:

[[0,1],[480,2],[640,3],[960,4],[1280,5]]
意思不难理解,解释为:

当屏幕宽大于0,列数设为1
当屏幕宽大于480,列数设为2
当屏幕宽大于640,列数设为3
当屏幕宽大于960,列数设为4
当屏幕宽大于1280,列数设为5

我直接把原来的single_column_breakpoint参数删除掉,添加了一个breakpoint参数,在做Dom节点样式修改的时候,做一个for循环,判断当前的屏幕宽处于哪一个区间,然后做一个瀑布流绘制。

Plugin.prototype.make_layout_change = function(_self) {
    _width = $(window).width();
    if (_self.options.breakpoint) {
        var _arr = _self.options.breakpoint;
        var end = _arr.length - 1;
        if (_width > _arr[end][0]) {
            _self.calculate(_arr[end][1])
        } else {
            for (i = 0; i < end; i++) {
                if (_width > _arr[i][0] && _width < _arr[i+1][0]){
                    _self.calculate(_arr[i][1]);
                }
            }
        }
    } else {
        _self.calculate(_self.options.no_columns)
    }
};

这一段就是我做的for循环,calculate为绘制函数,用来绘制瀑布流,参数是设置的列数。

花了我好大的功夫,功能还是实现了,心里有点小开心,但是不可以真的拿来用在项目中,因为这插件本身的执行效率就非常的卡,卡片一多就非常的卡,所以这个插件也只能这样拿来看看代码,练练手而已。

最后,我把它改名为Pinterest_responsive_grid发布在了我的Github项目里,还有我做的DEMO