用原生态的JavaScript实现瀑布流布局

以前我们讲过一篇:JavaScript AJAX stream 瀑布流式显示实例 http://www.111cn.net/wy/js-ajax/69592.htm,现在我们再来多加练习一下。

 HTML(注意包裹关系,方便js调用)

 代码如下 复制代码
<body>
    <div id="main">
        <div class="box">
            <div class="pic">
                <img src="images/0.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/1.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/2.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/3.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/4.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/2.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/3.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/4.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/5.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/6.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/7.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/3.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/4.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/5.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/3.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/4.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/5.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/6.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/7.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="images/3.jpg" alt="">
            </div>
        </div>
       
    </div>
</body>

LESS(less预编译)

 代码如下 复制代码
* {
    margin: 0;
    padding: 0;
}
#main {
    position: relative;

}
.box {
    padding:15px 0 0 15px;
    float:left;
}
.pic {
    padding: 10px;
    border: 1px solid #ccc;
    border-radius: 5px;
    box-shadow: 0px 0px 5px #ccc;
    img {
        width:165px;
        height:auto;
    }
}

JavaScript(自己理解的注解)

(函数存在一定瑕疵,仅用于学习理解)

 代码如下 复制代码
window.onload = function () {
    waterfall("main","box");
    //调用自定义函数;作用于main下的每一个box元素;

    var dataInt = { "data":[{"src":"7.jpg"},{"src":"8.jpg"},{"src":"9.jpg"},{"src":"6.jpg"}]}
    //模拟json数据;
    window.onscroll = function () {
        if (checkScrollSlide) {
        //调用自定义函数;根据函数返回值确定滚动是否超出范围;
            var oParent = document.getElementById("main");

            for (var i = 0; i < dataInt.data.length; i++) {
                var oBox = document.createElement("div");
                oBox.className = "box";
                oParent.appendChild(oBox);
                //创建box块

                var oPic = document.createElement("div");
                oPic.className = "pic";
                oBox.appendChild(oPic);
                //创建pic块

                var oImg = document.createElement("img");
                //创建img元素
                oImg.src = "images/"+dataInt.data[i].src;
                //设置图片引用;
                oPic.appendChild(oImg);

            };
            waterfall("main","box");
            //将动态生成的数据块进行流式布局;
        };
    };
};

//流式布局主函数,自动调整数据块的位置;
function waterfall (parent,box) {
    //将main下的所有box元素取出;"parent"代表父级,box代表box元素;
    var oParent = document.getElementById(parent);
    //将父级元素赋值给变量oParent;
    var oBoxs = getByClass(oParent,box);
    //通过自定义函数,获取父级下的每一个box元素;得到的是所有box元素的集合;
    //再次将这个得到的box元素的集合赋值给oBoxs;(因为作用域问题,变量不共用);
    // console.log(oBoxs.length);
    //在控制台中打印出box元素的数量,用于调试;

    var oBoxW = oBoxs[0].offsetWidth;
    //计算出每一列的宽度;offsetWidth包含内边距在内的宽度;
    // console.log(oBoxW);测试;
    var cols = Math.floor(document.documentElement.clientWidth/oBoxW);
    //计算整个页面显示的列数(页面宽/box的宽);

    oParent.style.cssText = "width:"+oBoxW*cols+"px;margin:0 auto";
    //父元素main的宽度=每一列的宽*列数;并且左右居中;

    var hArr = [];
    //存放每一列高度的数组;
    for (var i = 0; i < oBoxs.length; i++) {
    //遍历oBoxs数组;
        if (i<cols) {
        //这里符合条件的是第一行的每列的第一个;
            hArr.push(oBoxs[i].offsetHeight);
            //得出每一列的高度放入数组中;
        }else{
        //这里的box元素已经不是第一行的元素了;
            var minH = Math.min.apply(null,hArr);
            //得出第一行的最小高度并赋值给变量;
            // console.log(minH);

            var index = getMinhIndex(hArr,minH);
            //调用自定义函数获取这个变量的index值;

            oBoxs[i].style.position = "absolute";
            oBoxs[i].style.top = minH+"px";
            oBoxs[i].style.left = oBoxW*index+"px";
            //设置当前元素的位置;
            //当前元素的left值=顶上的元素的index值*每列的宽度;
            //oBoxs[i].style.left = oBoxs[index].offsetLeft+"px";
            //第二种获取当前元素的left值;
            //此时在第index列添加了一个box元素;

            hArr[index]+=oBoxs[i].offsetHeight;
            //每一列更新后的高度=每一列原来的高度+后来添加的box元素的高度;
        };
    };
};

//js原生通过Class获取元素;
function getByClass (parent,claName) {
    //通过class获取元素;(在父级parent的容器下获取claName的元素;)
    var boxArr = new Array();
    //声明数组,用来存储获取到的所有class为box的元素;
    var oElements = parent.getElementsByTagName("*")
    //声明变量用来存储此父元素下的所有子元素(*);
    for (var i = 0; i < oElements.length; i++) {
    //遍历数组oElements;
        if (oElements[i].className==claName) {
        //如果数组中的某一个元素的calss类与参数claName相同;
            boxArr.push(oElements[i]);
            //则把遍历到的这个box元素归类到boxArr数组;
        };
    };
    return boxArr;
    //调用数组后,经过一系列函数,遍历;将得到的数组返回给调用的函数;
};

//获取数组元素的index值;
function getMinhIndex (arr,val) {
//arr是父级数组;val是当前元素;
    for(var i in arr){
    //从0开始遍历;
        if(arr[i]==val){
        //找到当前元素在数组中对应的index值;
            return i;
            //函数返回值即是当前元素的index值;
        };
    };
};

//检测是否具备了滚动加载数据块的条件;
function checkScrollSlide () {
    var oParent = document.getElementById("main");
    var oBoxs = getByClass(oParent,"box");
    var lastBoxH = oBoxs[oBoxs.length-1].offsetTop+Math.floor(oBoxs[oBoxs.length-1].offsetHeight/2);
    //最后一个box元素距离页面顶部的高度(找到最后一个box(oBoxs.lenght-1)的offsetTop)+自身的一半;
    var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
    //浏览器滚动条滚动的距离;
    // console.log(scrollTop);

    var height = document.body.clientHeight || document.documentElement.clientHeight;
    //浏览器视口的高度;
    // console.log(height);
    return (lastBoxH<scrollTop+height)?true:false;
    //页面滚动的距离是否大于最后一个box元素的offsetTop;
};

时间: 2024-09-28 01:45:22

用原生态的JavaScript实现瀑布流布局的相关文章

基于JavaScript实现瀑布流布局_javascript技巧

本文实例讲解了原生JavaScript实现瀑布流布局详细代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <link rel="stylesheet" type="

原生JavaScript实现瀑布流布局_javascript技巧

本文实例讲解了原生JavaScript实现瀑布流布局详细代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: window.onload=function(){ waterfall('main','pin'); var dataInt={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]}; window.onscroll=function(){ if(checkscrollside()){

基于JavaScript实现瀑布流布局(二)_javascript技巧

本文实例讲解了JavaScript实现瀑布流布局详细代码,分享给大家供大家参考,具体内容如下 1.建立Html模版 想法是先用一个div container承载所有内容,然后div box用来放置图片,最后div box_border来当图片框,代码如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>瀑布流</title> </head

javascript瀑布流布局实现方法详解_javascript技巧

本文实例讲述了javascript瀑布流布局实现方法.分享给大家供大家参考,具体如下: html结构: <div id="waterfall"> <div class="mod-box"> <div class="mod-img">...</div> </div> <div class="mod-box"> <div class="mod-

jQuery Wookmark瀑布流布局

文章简介:jQuery Wookmark 瀑布流布局. 版本: jQuery v1.4.4+ Wookmark v0.5注意事项: 1.项目中的 img 元素的 width 和 height 属性需要写,否则定位会不准确.(可以用 JavaScript 即时获取图片的宽高,但图片数量过多时,这将是一件不靠谱的事情,如果你执意要这么做,可以参考这个 Demo) 查看Demo:http://code.ciaoca.com/jquery/wookmark/demo/example.html 中文文档:

瀑布流布局的两种实现方式:传统多列浮动和绝对定位布局

瀑布流布局想必大家对它并不陌生吧,在一些网站上都会有这种效果的出现,下面为大家介绍下使用两种方式实现传统多列浮动和绝对定位布局,具体的实现代码如下,感兴趣的朋友可以参考下,希望对大家有所帮助   传统多列浮动 各列固定宽度,并且左浮动: 一列中的数据块为一组,列中的每个数据块依次排列即可: 更多数据加载时,需要分别插入到不同的列上: 优点: (1)布局简单,应该说没啥特别的难点: (2)不用明确知道数据块高度,当数据块中有图片时,就不需要指定图片高度. 缺点: (1)列数固定,扩展不易,当浏览器

瀑布流布局代码一例

 提起瀑布流布局想必大家并不陌生吧,其实呢?原理也就那样,下面有个小例子,与大家分享  代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml"&

jquery瀑布流布局(masonry.js)

这样参差不齐的多栏布局,叫"方砖石布局",和"瀑布流布局",很多网站都有使用这样的布局,比如:淘宝的哇哦.花瓣网.蘑菇街 这里,我们仅使用瀑布流插件实现当页内容的排列. 那这插件到底有什么用呢?请看看下面的图片:右图是左图使用了插件之后的效果.具体例子 引用插件实例: <style type="text/css"> img { border:none; } .wrapper { width:1000px; margin:0 auto;

解析瀑布流布局:JS+绝对定位的实现_javascript技巧

绝对定位方式的瀑布流布局: 一.布局 1.包围块框的容器: 复制代码 代码如下: <div id="main">    ... ...<div> 2.一个块框: 复制代码 代码如下: <div class="pin">    <div class="box">        <img src="./images/g (1).jpg"/>    </div>