码迷,mamicode.com
首页 > 其他好文 > 详细

瀑布流布局(1)

时间:2018-02-13 17:51:41      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:位置   完成   col   取图   offset   order   宽度   style   显示   

前言

完成一个动漫人物的瀑布流布局,分别通过原生JavaScript、Css3和Jquery方式实现。
首先是使用JavaScript。

一、创建基本框架

1 HTML结构

<main>                    //便于以后进行 相对定位
    <div class="wrap">    //为了方便设置图片和图片之间样式+绝对定位
      <div class="pic">   //包裹图片,设置单个图片的样式
        <img src="img/1.jpg" alt="图片1">
      </div>
    </div> 
</main>

2 CSS基本样式

*{                       /* 简单全局重置 */
  margin: 0;
  padding: 0;
}

main{
  position: relative;    /*相对布局*/
}

.wrap{
  padding: 15px 0 0 15px;  /*设置内边距,便于以后JS计算高度*/
}

.pic{
  border: 1px solid #ccc;
  padding: 10px;
  border-radius: 5px;          /*设置边框圆角 */
  box-shadow: 0 0 6px #ccc;  /*水平、垂直偏移;模糊度;颜色*/
}

.pic img{
  width: 162px;    /*瀑布流特点,图片等宽不等高 */
  height: auto;
}

二、设置图片的定位 和 排序

1 设置列数和main的宽度

window.onload=function(){
  waterfall("main",".wrap");
}

function waterfall(parent,box){
  var oneparent = document.querySelector(parent);   //获取main元素
  
  //S1 获取main元素里面的所有 类warp元素
  var boxs = oneparent.querySelectorAll(box);    
  
  //S2 计算整个页面显示的列数;(页面宽/每列的盒子wrap宽)
  var oneboxwidth = boxs[0].offsetWidth;    //每列的盒子wrap宽
  var cols = Math.floor(document.documentElement.clientWidth / oneboxwidth) ; //获取 整数列数
  
  //S3 设置main的 固定宽度
  oneparent.style.cssText = ‘width:‘ + (oneboxwidth * cols)+‘px; margin:0 auto‘;
}

2 获取第一列图片的高度

window.onload=function(){
  waterfall("main",".wrap");
}

function waterfall(parent,box){
  var oneparent = document.querySelector(parent);   //获取main元素
  
  // 获取main元素里面的所有 类warp元素
  var boxs = oneparent.querySelectorAll(box);    
  ......
  ......
  //获取第一列图片的高度
  //S1 存放数据的 数组
  var boxsHeightArry = [];
  //S2 获取图片高度并存放
  for (var i=0; i<boxs.length; i++){
    if(i < cols){
      boxsHeightArry.push(boxs[i].offsetHeight);
    }
  }
  console.log(boxsHeightArry);
}

3 绝对定位,把以后的图片,都放到第一行最矮的下方

 //S1 存放数据的 数组
  var boxsHeightArry = [];
  //S2 获取图片高度并存放
  for (var i=0; i<boxs.length; i++){
    if(i < cols){
      boxsHeightArry.push(boxs[i].offsetHeight);
    }else{
      //S1 获取第一行的最小值&索引值
      minBoxHeight = Math.min.apply(null,boxsHeightArry);
      minBoxHeightIndex = boxsHeightArry.indexOf(minBoxHeight);
      //S2 调试   console.log( minBoxHeightIndex);
      //S3 设置第二行及以后行 图片的绝对定位位置
       boxs[i].style.position = "absolute";
      boxs[i].style.top = minBoxHeight + ‘px‘;
      boxs[i].style.left = oneboxwidth * minBoxHeightIndex + ‘px‘;
    }
  }

4 每次循环时都增加后放的图片的高度,从而改变数组里最矮的值

else{ 
      //S1 获取第一行的最小值&索引值
      minBoxHeight = Math.min.apply(null,boxsHeightArry);
      minBoxHeightIndex = boxsHeightArry.indexOf(minBoxHeight);
      //S2 调试 console.log( minBoxHeightIndex);

      //S3 设置第二行及以后行图片的 绝对定位位置
      boxs[i].style.position = "absolute";
      boxs[i].style.top = minBoxHeight + ‘px‘;
 // boxs[i].style.left = oneboxwidth * minBoxHeightIndex + ‘px‘;
    boxs[i].style.left = boxs[minBoxHeightIndex].offsetLeft + ‘px‘;

 //从第二行开始,每次循环时都增加后放的图片的高度,从而改变数组里最矮的值
      boxsHeightArry[minBoxHeightIndex] += boxs[i].offsetHeight;
}

四 Reference

??1 js改变css样式的三种方法;

瀑布流布局(1)

标签:位置   完成   col   取图   offset   order   宽度   style   显示   

原文地址:https://www.cnblogs.com/ygming/p/8446850.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!