JavaScript日记——实现图片的瀑布流和底部刷新

瀑布流现在基本上是图片显示网页的标配,主要是为了适配图片和文字块的大小,使显示出的效果没有那么呆板
实现这个功能首先要有html,css和js基础

首先先实现瀑布流

即下一行的图片放在上一行的凹下去的地方

基本的html代码如下

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>瀑布流</title>
    <link rel="stylesheet" type="text/css" href="css/style.css">
    <!--script不能用<script/>-->
    <script src="js/app1.js"></script>
</head>
<body>
<div id="container">
    <div class="box">
        <div class="img_box">
            [站外图片上传中……(2)]
        </div>
    </div>
    <div class="box">
        <div class="img_box">
            [站外图片上传中……(3)]
        </div>
    </div>
    <div class="box">
        <div class="img_box">
            [站外图片上传中……(4)]
        </div>
    </div>
    <div class="box">
        <div class="img_box">
            [站外图片上传中……(5)]
        </div>
    </div>
    <div class="box">
        <div class="img_box">
            [站外图片上传中……(6)]
        </div>
    </div>
    <div class="box">
        <div class="img_box">
            [站外图片上传中……(7)]
        </div>
    </div>
    <div class="box">
        <div class="img_box">
            [站外图片上传中……(8)]
        </div>
    </div>
    <div class="box">
        <div class="img_box">
            [站外图片上传中……(9)]
        </div>
    </div>
    <div class="box">
        <div class="img_box">
            [站外图片上传中……(10)]
        </div>
    </div>
    <div class="box">
        <div class="img_box">
            [站外图片上传中……(11)]
        </div>
    </div>
    <div class="box">
        <div class="img_box">
            [站外图片上传中……(12)]
        </div>
    </div>
</div>
</body>
</html>

然后再写一下css

*{
    margin: 0px;
    padding: 0px;
}
/*container为相对布局*/
#container{
    position:relative;
}
/*box向左浮动*/
.box{
    padding:5px;
    float: left;
}
/*加一些边框*/
.img_box{
    padding: 5px;
    border:1px solid #ccc;
    box-shadow:0 0 5px #ccc;
    border-radius: 5px;
}
/*宽度固定,高度自适应,使图片不变形*/
.img_box img{
    width: 150px;
    height: auto;
}

接下来就是这次的核心,写js

//开始加载要执行的方法
window.onload=function(){
    imgLocation("container","box")
}
function imgLocation(parent,content){
    var cparent=document.getElementById(parent);
    var ccontent=getChildElement(cparent,content)
    //图片宽度
    var imgWidth=ccontent[0].offsetWidth;
    //每一行图片个数
    var cols= Math.floor(document.documentElement.clientWidth/imgWidth);
    //使宽度一定,内容居中
    cparent.style.cssText="width:"+imgWidth *cols+"px;margin:0 auto";

    var BoxHeightArr=[];
    for(var i=0;i<ccontent.length;i++){
        //获取第一行图片的高度
        if (i<cols){
            BoxHeightArr[i]=ccontent[i].offsetHeight;
        }else {
            //Math.min对数组要加上apply
            var minheight=Math.min.apply(null,BoxHeightArr);
            var minIndex=getminheightLocation(BoxHeightArr,minheight)
            //设为绝对布局使内容不随屏幕大小改变
            ccontent[i].style.position="absolute";
            ccontent[i].style.top=minheight+"px";
            ccontent[i].style.left=ccontent[minIndex].offsetLeft+"px";
            //该列的高度加上后添加进去图片高度
            BoxHeightArr[minIndex]=BoxHeightArr[minIndex]+ccontent[i].offsetHeight

        }
    }
}
//获取最小高度的位置
function getminheightLocation(BoxHeightArr,minHeight){
    for(var i in BoxHeightArr){
        if (BoxHeightArr[i]==minHeight){
            return i;
        }
    }
}
function getChildElement(parent,content){
    var contentArr=[];
    //获取所有子Element
    var allcontent=parent.getElementsByTagName("*")
    for(var i=0;i<allcontent.length;i++){
        //如果className是box就添加进去
        if (allcontent[i].className==content){
            contentArr.push(allcontent[i]);
        }
    }
    return contentArr
}

这样就简单实现了瀑布流效果

接下来是下拉到底部自动刷新

主要是在滚动时监听是否到底部,到达差不多底部的位置就加载
添加以下代码即可

window.onscroll=function(){
    //模拟数据
    var imgData={"data":[{"src":"2.jpg"},{"src":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"}]}
    if (checkFlag()){
        var cparent=document.getElementById("container");
        for(var i =0;i<imgData.data.length;i++){
            var ccontent=document.createElement("div");
            ccontent.className="box";
            cparent.appendChild(ccontent);
            var boximg=document.createElement("div");
            boximg.className="img_box";
            ccontent.appendChild(boximg);
            var img=document.createElement("img");
            img.src="images/"+imgData.data[i].src;
            boximg.appendChild(img);
        }
        //按照之前规则排列
        imgLocation("container","box")
    }
}
function  checkFlag(){
    var cparent=document.getElementById("container");
    var ccontent=getChildElement(cparent,"box");
    //最后一张图片距离顶部距离
    var lastContentHeight=ccontent[ccontent.length-1].offsetTop;
    //当前距离
    var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
    //该页面显示的高度
    var pageHeight=document.documentElement.clientHeight||document.body.clientHeight;
    //如果差不多到达底部则返回true
    if (lastContentHeight<scrollTop+pageHeight){
        return true;
    }
}

效果图如下

效果图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,737评论 1 92
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,066评论 4 62
  • 某天,母上回到家,看到洗碗池堆满了碗,就各种暗示诱导我主动洗碗,“我都工作一天了回到家还要忙家务,你身为一个女孩子...
    猫空滨海路阅读 149评论 0 1
  • 深夜回到家,回想自己这一个月的经历,太多的模式在自己身上体现,不被认同、保护自己的脆弱就会自动启发自己的模式,掉入...
    徐恺嵘阅读 180评论 0 0
  • 傻傻的女孩 在人生的岔路 茫然四顾 水墨画的志向 怎奈浓墨重彩 霓虹闪烁
    晓看冬日雪阅读 127评论 0 0