Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

响应式与瀑布流

  前几篇文章中介绍了照片墙的设计在响应式中的使用。实际上还有一个和照片墙类似的设计,那就是瀑布流。它们的实现原理都基本相同,所以同样可以用于响应式布局中。这篇再继续偷个懒,还是使用和之前类似的代码,只是在算法部分上改变了一下。

<style>
body {overflow-y:scroll;}
#wall {
  position:relative;
  overflow:hidden;
  background:#FAFAFA;
  text-align:justify;
  font-size:0px;
  padding:0px;
}
#wall>li {
  position:absolute;
  display:inline-block;
  overflow:hidden;
  color:#333;
  background:#F5F5F5;
  border:1px solid #CCC;
  padding:8px;
  margin:5px;
  text-align:center;
  font:14px/1 Simsun;
  text-decoration:none;
  transition:all 1000ms ease;
}
#wall>li img {
  border:none;
  background:#EEE;
  display:block;
  margin-bottom:8px;
  width:100%;
}
</style>
<ul id="wall"></ul>
<script>
//生成随机项
(function(){
  for(var i=0;i<100;i++){
    var li=document.createElement("li");
    //随机图片尺寸
    li.w=Math.random()*300+300|0;
    li.h=Math.random()*200+200|0;
    //宽度增量只按会缩放的图片来计算
    li.k=li.w/li.h;
    //添加图片
    var img=document.createElement("img");
    li.appendChild(img);
    //添加超连接诶
    var a=document.createElement("a");
    a.textContent=li.w+"x"+li.h;
    a.href="JavaScript:";
    li.appendChild(a);
    //放入文档中
    wall.appendChild(li);
    wall.appendChild(document.createTextNode(" "));
  };
  format();
})();

//调整布局
function format(){
  var COLUMNS=wall.offsetWidth/130|0,MARGIN=10,EXTENSION=18,
      WIDTH=wall.offsetWidth/COLUMNS-EXTENSION-MARGIN;
  var i,j,s=wall.children,columns=new Float32Array(COLUMNS);
  //遍历元素
  for(i=0;i<s.length;i++){
    s[i].scaledHeight=WIDTH/s[i].w*s[i].h;
    //寻找高度最短的列
    var item=Array.prototype.reduce.call(columns,function(a,b,c){
      return a[0]<b?a:[b,c];
    },[columns[0],0]);
    //将新元素添加到高度最短的列上
    s[i].children[0].style.width=WIDTH+"px";
    s[i].children[0].style.height=s[i].scaledHeight+"px";
    s[i].style.top=item[0]+"px";
    s[i].style.left=item[1]*(WIDTH+MARGIN+EXTENSION)+"px";
    //增加列高度
    columns[item[1]]+=s[i].scaledHeight+MARGIN+EXTENSION+14+8;
  };
  //计算容器高度
  wall.style.height=Math.max.apply(Math,columns)+"px";
};

//绑定事件
window.onresize=format;
</script>
  以上只是示例代码,懒得对低版本浏览器做兼容,所以有些地方直接使用了现代浏览器的特性。比如使用Float32Array代替普通数组省去了对数组元素的初始化步骤;使用Array.prototype.reduce方法来搜索数组中的东西。这些都是低版本浏览器不支持的,如果需要兼容可以手动改写为低版本浏览器兼容的写法,这篇就暂不介绍了。
网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^