Masonry是最流行的瀑布流插件之一,配置简单,功能强大,在Github上收获了1w+ stars。若是你想使用瀑布流提高网站体验,Masonry将是不错的选择。css
瀑布流,又称瀑布流式布局。是比较流行的一种网站页面布局,视觉表现为良莠不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。最先采用此布局的网站是Pinterest,逐渐在国内流行开来。国内大多数清新站基本为这类风格,像花瓣网、蘑菇街、美丽说等。html
须要注意的是,若是你须要加载图片,Masonry不会在图片加载完后从新布局,这可能会影响你的布局效果,建议配合使用imagesloaded插件。
imagesloaded配置与使用npm
Bowersegmentfault
bower install masonry --save
Npmapp
npm install masonry-layout
加载布局
<script src="/path/to/masonry.pkgd.min.js"></script>
<div class="grid"> <div class="grid-item"></div> <div class="grid-item"></div> ... </div>
// jQuery方式 $('.grid').masonry({ columnWidth: 200, itemSelector: '.grid-item' }); // Vanilla方式 var msnry = new Masonry( '.grid', { columnWidth: 200, itemSelector: '.grid-item' }); <!-- HTML方式,不推荐 --> <div class="grid" data-masonry='{ "columnWidth": 200, "itemSelector": ".grid-item" }'>
columnWidth: 80 columnWidth: elements columnWidth: '.grid-sizer' .grid-item { width: 20%; }
$('.grid').masonry({ columnWidth: 200, itemSelector: '.grid-item', // 要布局的网格元素 gutter:10, // 网格间水平方向边距,垂直方向边距使用css的margin-bottom设置 percentPosition:true, // 使用columnWidth对应元素的百分比尺寸 stamp:'.grid-stamp', // 网格中的固定元素,不会因从新布局改变位置,移动元素填充到固定元素下方 fitWidth: true, // 设置网格容器宽度等于网格宽度,这样配合css的auto margin实现居中显示 originLeft: true, // 默认true网格左对齐,设为false变为右对齐 originTop: true, // 默认true网格对齐顶部,设为false对齐底部 containerStyle: { position: 'relative' }, // 设置容器样式 transitionDuration: '0.8s', // 改变位置或变为显示后,重布局变换的持续时间,时间格式为css的时间格式 stagger: '0.03s', // 重布局时网格并非一块儿变换的,排在后面的网格比前一个延迟开始,该项设置延迟时间 resize: false, // 改变窗口大小将不会影响布局 initLayout: true, // 初始化布局,设未true可手动初试化布局 });
// jQuery方式。从新布局,添加元素,另外一种方式添加元素,从新布局 $grid.masonry().append( elem ).masonry( 'appended', elem ).masonry(); // vanilla方式。同上 var msnry = new Masonry( '.grid', {...}); gridElement.appendChild( elem ); msnry.appended( elem ); msnry.layout();
$grid.masonry(); // 从新布局 $grid.masonry( options ); // 修改设置,再从新布局 $grid.masonry( 'layoutItems', items, isStill ); // 重布局指定元素,isStill接受布尔值,表示是否变换 $grid.masonry( 'stamp', $stamp ); // 固定元素 $grid.masonry( 'unstamp', $stamp ); // 解除固定 $grid.masonry( 'appended', elements ); // 在最后添加元素 $grid.masonry( 'prepended', elements ); // 在最前添加元素 $grid.masonry( 'addItems', elements ); // 添加元素,但不布局 $grid.masonry( 'remove', elements ); // 删除元素
// jQuery方式 var msnry = $grid.masonry( 'on', eventName, listener ); var msnry = $grid.masonry( 'off', eventName, listener ); var msnry = $grid.masonry( 'once', eventName, listener ); // vanilla方式 msnry.on( eventName, listener ); msnry.off( eventName, listener ); msnry.once( eventName, listener ); // jQuery,布局完成事件和移除完成事件 $grid.on( 'layoutComplete', function( event, items ) { console.log( items.length ); }); $grid.on( 'removeComplete', function( event, removedItems ) {...} ) // vanilla,同上 msnry.on( 'layoutComplete', function( event, items ) { console.log( items.length ); }); msnry.on( 'removeComplete', function( event, removedItems ) {...} )
$grid.masonry('reloadItems'); // 从新载入元素,适用Angular和React被改变DOM元素后 $grid.masonry('destroy'); // 移除Masonry,元素返回初试化前状态 var elems = $grid.masonry('getItemElements'); // 返回网格元素 var msnry = $('.grid').data('masonry'); // 返回Masonry实例 var msnry = Masonry.data( $('.grid')[0] ); // 根据网格,返回Masonry实例