js实现瀑布流以及加载效果

摘要:
瀑布流是一种流行的网站页面布局。它在视觉上表现为异构多列布局。当页面滚动条向下滚动时,此布局将继续加载数据块并将其附加到当前尾部。瀑布流对于图片的显示是高效且有吸引力的。用户可以在短时间内通过使用快速阅读模式一目了然地获得更多信息,瀑布流中的自动加载避免了用户单击鼠标的翻页操作。

一、瀑布流是个啥?

  瀑布流,是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。

  最早采用瀑布流布局的网站是Pinterest,逐渐在国内流行开来,比如我们熟知的百度图片的布局,在“很久”以前,百度图片还是需要一页一页的点击进行查看更多图片,而现在的瀑布流布局使用户查找图片更加方便。

  js实现瀑布流以及加载效果第1张

二、瀑布流的优缺点

  优点:

    1.节省了页面的空间,不再需要导航和页码按钮。

    2.增强了用户的体验,使用户的体验更多的是在于浏览图片上,而不是在寻找怎么找下一页和切换的操作上。

  缺点:

    1.使用的网页类型有限:

    这种瀑布流布局只适用于某些特定类型产品中一部分特定类型的内容。

    比如我们在某宝买东西时,我们就需要记住第几页的哪个商品是我们想买的,然后再回头购买,这时候就需要我们的页面按钮来帮忙记忆,瀑布流反而更加麻烦。

    2.永远看不到的页脚:

    如果我们使用瀑布流无限滚动加载模式,那就是说我们永远也无法看到我们的页脚,当用户一次次的浏览到页面底部,看到页脚,却因为自动加载的内容的突然出现,无论怎样都无法点击到页脚中的链接或登录时,那么用户的体验是极为糟糕的,他们可能会愤怒的关掉你的网页。

    3.关于页面数量:

    对于用户来说,使用瀑布流自动加载来替代传统的换页其实是很方便的,而对于开发者的网站来说,页面的减少可能就无法展示更多地相关信息,最明显的就是广告减少。

  

  三、瀑布流写法及原理

  瀑布流到底长什么样子呢,那我们现在就来默写一个简单的瀑布流布局。先把乱七八糟的基础样式和布局稍微的敲一下~这里我们为了节省空间,就不缩进啦~

  CSS:

*{margin: 0;padding: 0;}    
#wrap{width: 840px;margin: 0 auto;border: 1px solid black;overflow: hidden;}
#wrap ul{width: 200px;margin: 0 5px;float: left;}
#wrap ul li{width: 200px;list-style: none;margin: 10px 0;background: palegreen;font-size: 50px;color: white;text-align: center;}

  HTML:

<div id="wrap">
    <ul></ul>
    <ul></ul>
    <ul></ul>
    <ul></ul>
</div>

  以下是简单的JS代码:

var wrap=document.querySelector("#wrap");
var ul=document.querySelectorAll("#wrap ul");//声明元素块
//先创建一个随机数的函数
function ranDom(min,max){
    return Math.random()*(max-min+1)+min;
}
//再创建一个添加li的函数
function createLi(num){
    for(var i=0;i<num;i++){
        var newLi=document.createElement("li");//创建li
        newLi.style.height=ranDom(100,400)+"px";//使用随机数函数创建高度不同的li
        var arrul=[];
//将ul的高度进行储存和比较
        for(var j=0;j<ul.length;j++){
            arrul.push(ul[j].offsetHeight);//储存ul的高度
        }
        var minHeight=arrul[0];
        var minIndex=0;
        for(var k=0;k<arrul.length;k++){
            if(minHeight>arrul[k]){
                minHeight=arrul[k];//比较出高度最短的ul然后赋值给minHeight
                minIndex=k;//把高度最短的ul所在下标赋值给minIndex
            }
        }
    ul[minIndex].appendChild(newLi);//向高度最短的ul里添加li
    }    
}
createLi(15);//执行函数,添加15个li,
//创建一个滚动事件
window.onscroll=function(){  
// html总高度-可视化窗口高度=body的滚动高度
//兼容写法  
    var scrollTop=document.body.scrollTop;  
    var clientHeight=document.documentElement.clientHeight||document.body.clientHeight||window.innerHeight;  
    if(document.documentElement.offsetHeight-clientHeight<=scrollTop){  
        createLi(15);  
    }  
}
//当滚动快要到达底部,还没有到达的时候,再去执行函数,创建新的li 

  这样我们就实现了永远也看不到页脚的自动加载瀑布流布局。

  

四、总结

  瀑布流简单来讲就是页面容器内的多个高度不固定的容器之间参差不齐的添加内容,鼠标滚动时不断在容器内的尾部加载数据,且自动加载到空缺位置,也就是例子中的高度最短的位置,不断循环。

  瀑布流对于图片的展现,是高效而具有吸引力的,用户一眼扫过的快速阅读模式可以在短时间内获得更多的信息量,而瀑布流里自动加载又避免了用户鼠标点击的翻页操作。

  瀑布流的主要特性便是错落有致,定宽而不定高的设计让页面区别于传统的矩阵式图片布局模式,巧妙的利用视觉层级,视线的任意流动又缓解了视觉疲劳,同时给人以不拘一格的感觉。

免责声明:文章转载自《js实现瀑布流以及加载效果》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇国外著名作家年代表Vue cdn导入第三方库下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

jquery和js的几种页面加载函数的方法以及执行顺序

参考博客:http://www.cnblogs.com/itslives-com/p/4646790.html        https://www.cnblogs.com/james641/p/7838373.html 执行顺序:A>B>C>D>E $(function() { alert("A"); }); $(doc...

js import的几种用法

最近昨天公司小朋友离职,临时接收其负责的vue前端项目。vue好久没做了,很多东西都忘记或以前也没接触,几天开始慢慢写点vue的小知识,算是历程或备忘吧。 import在js、ts中用了不知多少次,但没总结过,现在总结一下: import x from 'abc..js' 这种导入要求 abc.js模块中有 export default 默认导出,x作为消...

js,jq,php使用正则方法

1.js使用正则表达式案例: <script> var str=”543535364565@qq.com”; var res=“/^d*@(QQ|qq|136).(com|cn)$/”; var result=res.exec(str); alert(result); </script> 2.php使用正则表达式案例: $em...

.Net魔法堂:史上最全的ActiveX开发教程——ActiveX与JS间交互篇

一、前言                             经过上几篇的学习,现在我们已经掌握了ActiveX的整个开发过程,但要发挥ActiveX的真正威力,必须依靠JS。下面一起来学习吧! 二、JS调用ActiveX方法                     只需在UserControl子类中(即自定义的ActiveX控件中),编写公共方法即可...

js、jq对象互转

1.js对象转jq对象:    $() $('#kw') $(document.getElementById("kw")) 2.jq对象转js对象: $(this).get(0) 、$(this)[0] $('#kw').get(0) $('#kw').[0] 3.封装自己的‘jq’ 思路: 依据现有api(当然那要考虑各种兼容性)、 定义输入与输出(包括...

Round() 四舍五入 js银行家算法

首先问一下round(0.825,2) 返回的结果,大家猜一猜, 首先SQL server 返回的是 0.83 js的返回结果 是0.83,code 如下:   var b = 0.825;         alert(Math.round(b * 100) / 100); 其实js中可以 直接用toFixed函数的,   var b = 0.825;...