HTML5应用开发:神奇的动态布局库isotope教程

1. isotope介绍

Isotope 是一个jQuery的插件,用来实现精美的动态元素布局。可以到http://isotope.metafizzy.co/demos/elements-complete.html了解一下大概情况。

Isotope可以实现仅仅依靠CSS3无法实现的动态布局方式,可以动态添加,删除,排序,筛选元素。Isotope的动画引擎可以充分使用现代浏览器CSS动画中GPU硬件加速性能,。

实例我已经上传到CSDN资源中,敬请下载。

2. 简单的isotope例子

Isotope要求jQuery1.4.3版本以上。首先需要在HTML页面中加载jQuery和isotope。

  1. <script src="../js/jquery-1.7.1.min.js"></script>
  2. <script src="../jquery.isotope.min.js"></script>

Isotope可以工作在一个包含很多类似item的container中,如下面所示:在div container中,声明了很累类似的div item。.

  1. <div id="container">
  2. <div class="item">...</div>
  3. <div class="item">...</div>
  4. <div class="item">...</div>
  5. ...
  6. </div>

在JavaScript中,添加如下代码:

  1. $('#container').isotope({
  2. // options
  3. itemSelector : '.item',
  4. layoutMode : 'fitRows'
  5. });

itemSelector 用来指定container中用来动态排版的元素。

运行效果如下图所示:

调整窗口大小后,排列效果图。

3. Sorting and Filtering

在isotope中,可以动态地对元素进行排序和筛选。

排序的方式很多样化,可以按照元素的不同属性进行排序。首先在HTML页面中添加相应的option:

  1. <section id="options" class="clearfix">
  2. <h3>Sort</h3>
  3. <ul id="sort-by" class="option-set clearfix" data-option-key="sortBy">
  4. <li><a href="#sortBy=original-order" data-option-value="original-order" class="selected" data>original-order</a></li>
  5. <li><a href="#sortBy=name" data-option-value="name">name</a></li>
  6. <li><a href="#sortBy=symbol" data-option-value="symbol">symbol</a></li>
  7. <li><a href="#sortBy=number" data-option-value="number">number</a></li>
  8. <li><a href="#sortBy=weight"  data-option-value="weight">weight</a></li>
  9. <li><a href="#sortBy=category" data-option-value="category">category</a></li>
  10. <li><a href="#sortBy=random" data-option-value="random">random</a></li>
  11. </ul>
  12. <h3>Sort direction</h3>
  13. <ul id="sort-direction" class="option-set clearfix" data-option-key="sortAscending">
  14. <li><a href="#sortAscending=true" data-option-value="true" class="selected">sort ascending</a></li>
  15. <li><a href="#sortAscending=false" data-option-value="false">sort descending</a></li>
  16. </ul>
  17. </section> <!-- #options -->

我们看到,排序的方式包含了element所有的属性。可以进行升序排列也可以降序排列。

Element代码:

  1. <div class="element transition metal   " data-symbol="Hg" data-category="transition">
  2. <p class="number">80</p>
  3. <h3 class="symbol">Hg</h3>
  4. <h2 class="name">Mercury</h2>
  5. <p class="weight">200.59</p>
  6. </div>

在JavaScript中,对每个sorting的方法进行实现:

  1. $(function(){
  2. var $container = $('#container');
  3. $container.isotope({
  4. itemSelector : '.element',
  5. getSortData : {
  6. symbol : function( $elem ) {
  7. return $elem.attr('data-symbol');
  8. },
  9. category : function( $elem ) {
  10. return $elem.attr('data-category');
  11. },
  12. number : function( $elem ) {
  13. return parseInt( $elem.find('.number').text(), 10 );
  14. },
  15. weight : function( $elem ) {
  16. return parseFloat( $elem.find('.weight').text().replace( /[\(\)]/g, '') );
  17. },
  18. name : function ( $elem ) {
  19. return $elem.find('.name').text();
  20. }
  21. }
  22. });
  23. var $optionSets = $('#options .option-set'),
  24. $optionLinks = $optionSets.find('a');
  25. $optionLinks.click(function(){
  26. var $this = $(this);
  27. // don't proceed if already selected
  28. if ( $this.hasClass('selected') ) {
  29. return false;
  30. }
  31. var $optionSet = $this.parents('.option-set');
  32. $optionSet.find('.selected').removeClass('selected');
  33. $this.addClass('selected');
  34. // make option object dynamically, i.e. { filter: '.my-filter-class' }
  35. var options = {},
  36. key = $optionSet.attr('data-option-key'),
  37. value = $this.attr('data-option-value');
  38. // parse 'false' as false boolean
  39. value = value === 'false' ? false : value;
  40. options[ key ] = value;
  41. if ( key === 'layoutMode' && typeof changeLayoutMode === 'function' ) {
  42. // changes in layout modes need extra logic
  43. changeLayoutMode( $this, options )
  44. } else {
  45. // otherwise, apply new options
  46. $container.isotope( options );
  47. }
  48. return false;
  49. });
  50. });

筛选的实现:isotope可以筛选不同属性的元素,需要对每个element属性通过class进行标记,如一个典型的element定义如下:

  1. <div class="element transition metal   " data-symbol="Hg" data-category="transition">
  2. <p class="number">80</p>
  3. <h3 class="symbol">Hg</h3>
  4. <h2 class="name">Mercury</h2>
  5. <p class="weight">200.59</p>
  6. </div>

在class中表明该元素是transition 而且是metal和
sorting类似,在HTML中添加筛选的option:

  1. <section id="options" class="clearfix">
  2. <h3>Filters</h3>
  3. <ul id="filters" class="option-set clearfix" data-option-key="filter">
  4. <li><a href="#filter" data-option-value="*" class="selected">show all</a></li>
  5. <li><a href="#filter" data-option-value=".metal">metal</a></li>
  6. <li><a href="#filter" data-option-value=".transition">transition</a></li>
  7. <li><a href="#filter" data-option-value=".post-transition">post-transition</a></li>
  8. <li><a href="#filter" data-option-value=".nonmetal">nonmetal</a></li>
  9. <li><a href="#filter" data-option-value=".inner-transition">inner-transition</a></li>
  10. <li><a href="#filter" data-option-value=".alkali, .alkaline-earth">alkali and alkaline-earth</a></li>
  11. <li><a href="#filter" data-option-value=":not(.transition)">not transition</a></li>
  12. <li><a href="#filter" data-option-value=".metal:not(.transition)">metal but not transition</a></li>
  13. </ul>
  14. </section> <!-- #options -->

对应的JavaScript function实现如下:

  1. $(function(){
  2. var $container = $('#container');
  3. $container.isotope({
  4. itemSelector : '.element'
  5. });
  6. var $optionSets = $('#options .option-set'),
  7. $optionLinks = $optionSets.find('a');
  8. $optionLinks.click(function(){
  9. var $this = $(this);
  10. // don't proceed if already selected
  11. if ( $this.hasClass('selected') ) {
  12. return false;
  13. }
  14. var $optionSet = $this.parents('.option-set');
  15. $optionSet.find('.selected').removeClass('selected');
  16. $this.addClass('selected');
  17. // make option object dynamically, i.e. { filter: '.my-filter-class' }
  18. var options = {},
  19. key = $optionSet.attr('data-option-key'),
  20. value = $this.attr('data-option-value');
  21. // parse 'false' as false boolean
  22. value = value === 'false' ? false : value;
  23. options[ key ] = value;
  24. if ( key === 'layoutMode' && typeof changeLayoutMode === 'function' ) {
  25. // changes in layout modes need extra logic
  26. changeLayoutMode( $this, options )
  27. } else {
  28. // otherwise, apply new options
  29. $container.isotope( options );
  30. }
  31. return false;
  32. });
  33. });

Filter demo演示,全部显示:

筛选所有metal的元素:

4. 动态添加元素

在isotope中,可以对container中的元素进行动态的删除和添加。

首先还是在HTML页面中添加相应的操作option:

  1. <section id="options">
  2. <ul class="clearfix">
  3. <li id="insert"><a href="#insert">Insert new elements</a></li>
  4. <li id="append"><a href='#append'>Append new elements</a></li>
  5. <li id="prepend"><a href='#prepend'>Prepend</a></li>
  6. </ul>
  7. </section>

在对应的JavaScript中,添加对function的实现:

   
  1. $(function(){
  2. var $container = $('#container');
  3. $('#insert a').click(function(){
  4. var $newEls = $( fakeElement.getGroup() );
  5. $container.isotope( 'insert', $newEls );
  6. return false;
  7. });
  8. $('#append a').click(function(){
  9. var $newEls = $( fakeElement.getGroup() );
  10. $container.append( $newEls ).isotope( 'appended', $newEls );
  11. return false;
  12. });
  13. $('#prepend a').click(function(){
  14. var $newEls = $( fakeElement.getGroup() );
  15. $container
  16. .prepend( $newEls ).isotope('reloadItems').isotope({ sortBy: 'original-order' })
  17. // set sort back to symbol for inserting
  18. .isotope('option', { sortBy: 'symbol' });
  19. return false;
  20. });
  21. $container.isotope({
  22. itemSelector : '.element',
  23. filter: '*',
  24. getSortData : {
  25. symbol : function( $elem ) {
  26. return $elem.attr('data-symbol');
  27. }
  28. },
  29. sortBy : 'symbol'
  30. });
  31. });

   

5. 不同的布局机制

在本例中,我们来尝试isotope中非常神奇的布局机制。

首先在HTML页面中,添加布局机制的选项:

  1. <section id="options" class="clearfix">
  2. <h3>Layout modes</h3>
  3. <ul id="layouts" class="option-set clearfix" data-option-key="layoutMode">
  4. <li><a href="#masonry" data-option-value="masonry" class="selected">masonry</a></li>
  5. <li><a href="#fitRows" data-option-value="fitRows">fitRows</a></li>
  6. <li><a href="#cellsByRow" data-option-value="cellsByRow">cellsByRow</a></li>
  7. <li><a href="#straightDown" data-option-value="straightDown">straightDown</a></li>
  8. <li><a href="#masonryHorizontal" data-option-value="masonryHorizontal" class="horizontal">masonryHorizontal</a></li>
  9. <li><a href="#fitColumns" data-option-value="fitColumns" class="horizontal">fitColumns</a></li>
  10. <li><a href="#cellsByColumn" data-option-value="cellsByColumn" class="horizontal">cellsByColumn</a></li>
  11. <li><a href="#straightAcross" data-option-value="straightAcross" class="horizontal">straightAcross</a></li>
  12. </ul>
  13. </section> <!-- #options -->

在JavaScript代码中实现相应的布局机制:

  
  1. $(function(){
  2. var $container = $('#container');
  3. // add randomish size classes
  4. $container.find('.element').each(function(){
  5. var $this = $(this),
  6. number = parseInt( $this.find('.number').text(), 10 );
  7. if ( number % 7 % 2 === 1 ) {
  8. $this.addClass('width2');
  9. }
  10. if ( number % 3 === 0 ) {
  11. $this.addClass('height2');
  12. }
  13. });
  14. $container.isotope({
  15. itemSelector : '.element',
  16. masonry : {
  17. columnWidth : 120
  18. },
  19. masonryHorizontal : {
  20. rowHeight: 120
  21. },
  22. cellsByRow : {
  23. columnWidth : 240,
  24. rowHeight : 240
  25. },
  26. cellsByColumn : {
  27. columnWidth : 240,
  28. rowHeight : 240
  29. }
  30. });
  31. // change layout
  32. var isHorizontal = false;
  33. function changeLayoutMode( $link, options ) {
  34. var wasHorizontal = isHorizontal;
  35. isHorizontal = $link.hasClass('horizontal');
  36. if ( wasHorizontal !== isHorizontal ) {
  37. // orientation change
  38. // need to do some clean up for transitions and sizes
  39. var style = isHorizontal ?
  40. { height: '80%', width: $container.width() } :
  41. { width: 'auto' };
  42. // stop any animation on container height / width
  43. $container.filter(':animated').stop();
  44. // disable transition, apply revised style
  45. $container.addClass('no-transition').css( style );
  46. setTimeout(function(){
  47. $container.removeClass('no-transition').isotope( options );
  48. }, 100 )
  49. } else {
  50. $container.isotope( options );
  51. }
  52. }
  53. var $optionSets = $('#options .option-set'),
  54. $optionLinks = $optionSets.find('a');
  55. $optionLinks.click(function(){
  56. var $this = $(this);
  57. // don't proceed if already selected
  58. if ( $this.hasClass('selected') ) {
  59. return false;
  60. }
  61. var $optionSet = $this.parents('.option-set');
  62. $optionSet.find('.selected').removeClass('selected');
  63. $this.addClass('selected');
  64. // make option object dynamically, i.e. { filter: '.my-filter-class' }
  65. var options = {},
  66. key = $optionSet.attr('data-option-key'),
  67. value = $this.attr('data-option-value');
  68. // parse 'false' as false boolean
  69. value = value === 'false' ? false : value;
  70. options[ key ] = value;
  71. if ( key === 'layoutMode' && typeof changeLayoutMode === 'function' ) {
  72. // changes in layout modes need extra logic
  73. changeLayoutMode( $this, options )
  74. } else {
  75. // otherwise, apply new options
  76. $container.isotope( options );
  77. }
  78. return false;
  79. });
  80. );

显示效果:

选择fitRows后排列效果:

完整demo代码:https://github.com/DaweiCheng/isotope-tutorial/blob/master/layout.html

Isotope中同样可以实现点击element,其中元素动态扩展的效果,即,在运行时,动态改变每个element尺寸;参见代码:https://github.com/DaweiCheng/isotope-tutorial/blob/master/relayout.html

运行显示效果:

点中Li元素之后显示效果:

6. 标记#Hash历史记录

至此,相信读者已经领略到了Isotope显示的动态布局的神奇之处,使用isotope可以实现你意向不到的绚丽的布局和动画效果。但是可否每次记住布局方式,当点击浏览器返回按钮的时候,返回上次观看的布局方式呢?

答案是可以的,借助jQuery另一个插件JQuery BBQ来实现。

jQuery BBQ的官方介绍:jQuery BBQ leverages the HTML5 hashchange event to allow simple, yet powerful bookmarkable #hash history..

首先在HTML页面中加载需要的JavaScript文件

- collapse sourceview plaincopy to clipboardprint?
  1. <script src="js/jquery-1.7.1.min.js"></script>
  2. <script src="js/jquery.isotope.min.js"></script>
  3. <script src="js/jquery.ba-bbq.min.js"></script>

然后我们在option中,将sorting, filtering,layout modes全部添加进来:

- collapse sourceview plaincopy to clipboardprint?
  1. <section id="options" class="clearfix">
  2. <h3>Filters</h3>
  3. <ul class="option-set clearfix">
  4. <li><a href="#filter=*" class="selected">show all</a></li>
  5. <li><a href="#filter=.metal">metal</a></li>
  6. <li><a href="#filter=.transition">transition</a></li>
  7. <li><a href="#filter=.post-transition">post-transition</a></li>
  8. <li><a href="#filter=.nonmetal">nonmetal</a></li>
  9. <li><a href="#filter=.inner-transition">inner-transition</a></li>
  10. <li><a href="#filter=.alkali%2C+.alkaline-earth">alkali and alkaline-earth</a></li>
  11. <li><a href="#filter=%3Anot(.transition)">not transition</a></li>
  12. <li><a href="#filter=.metal%3Anot(.transition)">metal but not transition</a></li>
  13. </ul>
  14. <h3>Sort</h3>
  15. <ul class="option-set clearfix">
  16. <li><a href="#sortBy=original-order" class="selected">original-order</a></li>
  17. <li><a href="#sortBy=name">name</a></li>
  18. <li><a href="#sortBy=symbol">symbol</a></li>
  19. <li><a href="#sortBy=number">number</a></li>
  20. <li><a href="#sortBy=weight">weight</a></li>
  21. <li><a href="#sortBy=category">category</a></li>
  22. <li><a href="#sortBy=random">random</a></li>
  23. </ul>
  24. <h3>Sort direction</h3>
  25. <ul class="option-set clearfix">
  26. <li><a href="#sortAscending=true" class="selected">sort ascending</a></li>
  27. <li><a href="#sortAscending=false">sort descending</a></li>
  28. </ul>
  29. <h3>Layout modes</h3>
  30. <ul class="option-set clearfix">
  31. <li><a href="#layoutMode=masonry" class="selected">masonry</a></li>
  32. <li><a href="#layoutMode=fitRows">fitRows</a></li>
  33. <li><a href="#layoutMode=cellsByRow">cellsByRow</a></li>
  34. <li><a href="#layoutMode=straightDown">straightDown</a></li>
  35. </ul>
  36. </section> <!-- #options -->

对应的JavaScript代码中,Hash bookmark history部分代码如下,由于篇幅限制,全部JavaScript代码请参见Github中的文件:

- collapse sourceview plaincopy to clipboardprint?
  1. var hashChanged = false;
  2. $(window).bind( 'hashchange', function( event ){
  3. // get options object from hash
  4. var hashOptions = window.location.hash ? $.deparam.fragment( window.location.hash, true ) : {},
  5. // do not animate first call
  6. aniEngine = hashChanged ? 'best-available' : 'none',
  7. // apply defaults where no option was specified
  8. options = $.extend( {}, defaultOptions, hashOptions, { animationEngine: aniEngine } );
  9. // apply options from hash
  10. $container.isotope( options );
  11. // save options
  12. isotopeOptions = hashOptions;
  13. // if option link was not clicked
  14. // then we'll need to update selected links
  15. if ( !isOptionLinkClicked ) {
  16. // iterate over options
  17. var hrefObj, hrefValue, $selectedLink;
  18. for ( var key in options ) {
  19. hrefObj = {};
  20. hrefObj[ key ] = options[ key ];
  21. // convert object into parameter string
  22. // i.e. { filter: '.inner-transition' } -> 'filter=.inner-transition'
  23. hrefValue = $.param( hrefObj );
  24. // get matching link
  25. $selectedLink = $optionSets.find('a[href="#' + hrefValue + '"]');
  26. changeSelectedLink( $selectedLink );
  27. }
  28. }
  29. isOptionLinkClicked = false;
  30. hashChanged = true;
  31. })
  32. // trigger hashchange to capture any hash data on init
  33. .trigger('hashchange');

至此就实现了可标记的#hash历史记录,可以记住所有的排版方式,依次进行返回观看前几次的排版样式。

本篇全部示例代码:https://github.com/DaweiCheng/isotope-tutorial 欢迎贡献更多的示例代码。

isotope自动布局相关推荐

  1. iOS 标签自动布局

    导入SKTagFrame SKTagFrame *frame = [[SKTagFrame alloc] init];frame.tagsArray = self.bigModel.Tags;// 添 ...

  2. iOS 自动布局框架 – Masonry 详解

    来源:伯乐在线 - 刘小壮 如有好文章投稿,请点击 → 这里了解详情 如需转载,发送「转载」二字查看说明 目前iOS开发中大多数页面都已经开始使用Interface Builder的方式进行UI开发了 ...

  3. ios snapkit m_如何使用自动布局和SnapKit在iOS上创建漂亮的拉伸布局

    ios snapkit m by Enabled Solutions 由Enabled Solutions 如何使用自动布局和SnapKit在iOS上创建漂亮的拉伸布局 (How to create ...

  4. 自动布局的 弊端 (后续)

    自动布局 比 直接写 frame 会慢很多 具体以后再说吧 转载于:https://www.cnblogs.com/Ionatan/p/5109211.html

  5. $portfolio.isotope is not a function

    2019独角兽企业重金招聘Python工程师标准>>> $portfolio.isotope is not a function 转载于:https://my.oschina.net ...

  6. 开始iOS 7中自动布局教程(一)

    2019独角兽企业重金招聘Python工程师标准>>> 发布于:2013-12-03 13:53阅读数:85091 到目前为止,如果你的设计相当的复杂,那么你必须编写大量的代码来适应 ...

  7. ios自动布局(1)

    本文转载与 :http://blog.csdn.net/pucker/article/details/41832939 今年如约放出了新的iPhone 6与iOS 8系统,SDK针对新的设备和系统的界 ...

  8. iOS自动布局框架-Masonry详解

    目前iOS开发中大多数页面都已经开始使用Interface Builder的方式进行UI开发了,但是在一些变化比较复杂的页面,还是需要通过代码来进行UI开发的.而且有很多比较老的项目,本身就还在采用纯 ...

  9. 更加优雅的iOS自动布局

    因为懒,所以之前几乎不用代码进行自动布局.但是使用xib和storyboard,总是有那么一些局限性.使用代码布局在某些时候就成了必须了?  . iOS原生的布局方式太过麻烦.要么使用VFL(Visu ...

最新文章

  1. 阿里p8呕心沥血整理出来的,APP UI自动化测试思路总结,速看
  2. CloudStack 制作window模板
  3. 网站推广专员浅析如何做好网站推广与运营?
  4. 8、 IS NULL:空值查询
  5. 看似无参却有参-----JS中的函数传参
  6. Nginx使用brotli代替gzip
  7. 鲲鹏服务器php性能,对鲲鹏服务器的内存进行性能优化后的前后数据对比
  8. oracle 拼接_老品牌福建泉州49寸液晶拼接屏多少钱品质
  9. wolfssl 何如 https post_干货:手把手教你优化关键词|亚马逊|流量|搜索量|长尾词|https...
  10. PHP 基础知识测试题
  11. oracle存储格式化时间,ORACLE日期时间的格式化参数大全
  12. 面试被问高并发流量控制,我脸都绿了...
  13. wamp 服务器安装问题 及cmd常用命令 和 php mysql数据库常用cmd命令集
  14. chr() 、ord()
  15. QT入门引导 及其 案例讲解
  16. ipxspx协议linux,三大协议 TCPIP NETBIOS IPX (转)
  17. Django order by 高级用法
  18. 网段划分 特殊网段(localhost0.0.0.01.1.1.1127.0.0.1)
  19. 蓝桥杯:调和级数————Python
  20. Dell计算机装Win8,超简单戴尔重装win7/win8系统完整教程

热门文章

  1. 如何减小Ubuntu 16.04系统下VMware虚拟机硬盘空间占用过大问题
  2. break和continue区别及使用场合
  3. 做了一款 TCP/IP 调试工具
  4. plc和单片机哪个更有前途?为什么本科生都不搞plc?
  5. window.open document.write ie6拒绝访问
  6. Web前端学习笔记(十五)---四色花瓣
  7. Bios工程师手边事—ACPI电源管理
  8. 优秀网站源码、编程源码下载网站大集中
  9. 用java实现的文本编辑器可以媲美windows自带的编辑器吗?(功能全,超详细)
  10. WIN7环境下debug的使用