javascript实现瀑布流效果(固定宽度)

HTML代码:

<div id="content">
    <div class="box">
        <div class="imgBox">
            <a href="###"><img src="images/01.jpg" alt="" /></a>
        </div>
    </div>
    <div class="box">
        <div class="imgBox">
            <a href="###"><img src="images/02.jpg" alt="" /></a>
        </div>
    </div>
    <div class="box">
        <div class="">
            <a href="###"><img src="images/03.jpg" alt="" /></a>
        </div>
    </div>
    <div class="box">
        <div class="imgBox">
            <a href="###"><img src="images/04.jpg" alt="" /></a>
        </div>
    </div>
    <div class="box">
        <div class="imgBox">
            <a href="###"><img src="images/05.jpg" alt="" /></a>
        </div>
    </div>
    <div class="box">
        <div class="imgBox">
            <a href="###"><img src="images/06.jpg" alt="" /></a>
        </div>
    </div>
    <div class="box">
        <div class="imgBox">
            <a href="###"><img src="images/07.jpg" alt="" /></a>
        </div>
    </div>
    <div class="box">
        <div class="imgBox">
            <a href="###"><img src="images/08.jpg" alt="" /></a>
        </div>
    </div>
    <div class="box">
        <div class="imgBox">
            <a href="###"><img src="images/09.jpg" alt="" /></a>
        </div>
    </div>
    <div class="box">
        <div class="imgBox">
            <a href="###"><img src="images/10.jpg" alt="" /></a>
        </div>
    </div>
</div>

CSS样式:

*{ margin:0; padding:0;}
body{ background-color:#f2f2f2;}
#content{ padding: 10px 0px; margin:0 auto; position:relative;}
.box{ padding:10px; width:310px; height:auto; float:left;}
.imgBox{ border:solid 1px #dcdcdc; width:310px;}
.imgBox img{ width:310px; height:auto;}

JS代码:

window.onload=function(){
    setPosition(‘content‘,‘box‘);
    //通过json字符串模拟加载内容
    var imgArray={‘date‘:[{‘src‘:‘05.jpg‘},{‘src‘:‘06.jpg‘},{‘src‘:‘07.jpg‘},{‘src‘:‘08.jpg‘}]}    

    //滚动到页面底部(最后一张图片的顶部)时开始加载json内容
    window.onscroll=function(){
        if(getFlag()){ //判断是否滚动到最后一张
            var oContent=document.getElementById(‘content‘); //获取外部容器
            for(var i=0;i<imgArray.date.length;i++){
                var oDiv=document.createElement(‘div‘);
                oDiv.className=‘box‘;
                oContent.appendChild(oDiv);
                var oImgDiv=document.createElement(‘div‘);
                oImgDiv.className=‘imgBox‘;
                oDiv.appendChild(oImgDiv);
                var oImg=document.createElement(‘img‘);
                oImg.src=‘images/‘+imgArray.date[i].src;
                oImgDiv.appendChild(oImg);
            }
            setPosition(‘content‘,‘box‘);
        }
    }
}

//元素排列
function setPosition(parents,content){
    var oContent=document.getElementById(‘content‘); //获取外部容器
    var aBox=getByClass(oContent,content); //获取classname为box的元素集合
    var oneWidth=aBox[0].offsetWidth;      //获取单个box的宽度
    var docWidth=document.documentElement.clientWidth||document.body.clientWidth; //获取窗口可视区域宽度
    var num=Math.floor(docWidth/oneWidth);
    oContent.style.width=num*oneWidth+‘px‘;  //设置外部容器的宽度
    var result=[];
    for(var i=0;i<aBox.length; i++){
        if(i<num){
            result[i]=aBox[i].offsetHeight; //判断是否为第一行,然后把第一行中每个aBox的高度存入定义的result数组中
        }else{
            var minHeight=Math.min.apply(null,result);  //获取result数组中最小的值
            var minIndex=getIndex(result,minHeight);  //获取result数组中最小值的索引
            aBox[i].style.position=‘absolute‘;
            aBox[i].style.top=minHeight+10+‘px‘;
            aBox[i].style.left=aBox[minIndex].offsetLeft+‘px‘;
            result[minIndex]=result[minIndex]+aBox[i].offsetHeight;
        }
    }
}
//获取当前索引值
function getIndex(parents,name){
    for(var i=0;i<parents.length;i++){
        if(parents[i]==name){
            return i;
        }
    }
}
//通过class选取元素方法
function getByClass(oParent,name){
    var result=[];
    var aArr=oParent.getElementsByTagName(‘*‘);
    for(var i=0; i<aArr.length; i++){
        if(aArr[i].className==name){
            result.push(aArr[i]);
        }
    }
    return result;
}
//判断是否滚动到最后
function getFlag(){
    var oContent=document.getElementById(‘content‘);
    var aBox=getByClass(oContent,‘box‘);
    var lastTop=aBox[aBox.length-1].offsetTop;
    var clientHeight=document.documentElement.clientHeight||document.body.clientHeight;
    var scorllTop=document.documentElement.scrollTop||document.body.scrollTop;
    if((clientHeight+scorllTop)>lastTop){
        return true;
    }else{
    return false;
    }
}
时间: 2024-08-29 18:35:11

javascript实现瀑布流效果(固定宽度)的相关文章

【前端】用jQuery实现瀑布流效果

jQuery实现瀑布流效果 何为瀑布流: 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早采用此布局的网站是Pinterest,逐渐在国内流行开来.国内大多数清新站基本为这类风格. 瀑布流的应用: 瀑布流对于图片的展现,是高效而具有吸引力的,用户一眼扫过的快速阅读模式可以在短时间内获得更多的信息量,而瀑布流里懒加载模式又避免了用户鼠标点击的翻页操作,瀑布流的主要特性便是错落有致,定宽而不

jQuery+HTML5图片瀑布流效果

JavaScript与HTML5实现美女瀑布流布局,本方法是把图片的路径写在了JS的数组里,不过重点好像不是在这里,而是在图片如何自动排列的问题,你可以运行本实例后,点击“加载瀑布流布局”按钮,即可看到图片的瀑布流排列效果,现在很流行这个,希望您从本代码中能找到一些灵感. <!DOCTYPE HTML> <html> <head> <title>jQuery+HTML5图片瀑布流效果丨河北电动叉车|石家庄苗木</title> <style

Jquery瀑布流效果(下篇)

接着上篇瀑布流效果说(上篇地址为http://www.cnblogs.com/jiaojiaome/articles/4123586.html). 第一个文件myself实现了瀑布流的效果,但是存在可以优化的地方. 比如initial方法,第一次刚加载的时候调用initial方法从第一张慢慢布局是没有问题的. but,后面拖动滚动后,如果满足条件,继续加载其他的,加载毕后再次调用initial()方法, 这里是可以优化的,因为之前的元素已经布局好了,不需要重新布局.所以可以从后面的元素开始 本篇

利用JS实现简单的瀑布流效果

哈哈, 我又来啦, 在这一段时间里, 我简单的学习了一下javascript(JS), 虽然不是很懂啦, 但是我也简单的尝试着做了点小东西, 就比如现在流行的瀑布流效果, 经过我的努力终于成功的完成了, 虽然中间非常的坎坷, 并不是一帆风顺但是最终我还是实现了个简单的效果, 下面就为大家简单的介绍下, 不知道的友友们, 有兴趣的话, 可以来参考下, 欢迎指出缺点和不足! 一.瀑布流之准备工作   首先声明下, 为了方便演示和联系, 我使用的是本地图片, 如果大家有需要的话可以尝试着写下网络的,

自定义实现带文字标题的瀑布流效果

在网上能找到的大部分资料中的瀑布流效果都是单纯的照片实现,现在我来实现一个带文字标题的.效果如下: 每个item都是由图片和文字标题两部分组成. 布局方式为ScrollView里面嵌套一个水平方向的LinearLayout,里面再嵌套两个竖直方向的LinearLayout,然后判断竖直方向的两个LinearLayout的高度,向比较低的那个Linearlayout里面添加item. 下面是代码 <ScrollView xmlns:android="http://schemas.androi

瀑布流效果的一些收获

瀑布流效果已经流行了很久,之前在项目中做了一次,今天页面改版又做了一次瀑布流的效果,中间又有了一些收获,谨记于此. 这个瀑布流效果是借鉴的网上一位大神写的代码,然后正好在项目中得到了应用. 1 function waterFall(mr, mb) { //mr水平方向的间距,mb垂直方向的间距 2 var ocontainer = document.getElementById("container"); 3 if (ocontainer) { 4 var pageWidth = oc

一步步教你js原生瀑布流效果实现

一步步教你js原生瀑布流效果实现 什么是瀑布流效果 首先,让我们先看一段动画: 在动画中,我们不难发现,这个动画有以下特点: 1.所有的图片的宽度都是一样的 2.所有的图片的高度是不一样的 3.图片一张挨着一张竖直排列 4.鼠标向下滚动,一直不停的加载图片 5.浏览器的宽度改变,图片的列数会进行相应的更改 那么这种效果类似现实生活中的瀑布,所以我们叫它瀑布流的效果. Js原生瀑布流效果的实现 从上述分析中,我们可以把整个效果分为以下四个部分: html+css界面搭建 瀑布流效果 浏览器向下滚动

一种瀑布流效果的实现

最近一个项目使用到了瀑布流效果,在这里总结一下.使用jquery框架. 最终效果: 思路: 使用五个并列的div:     首次加载n条数据:     之后由scroll触发ajax数据加载:     加载每条数据时,判断5个div的高度,把数据加载到高度最短的div里. 数据加载代码: $(document).bind('scroll',(function(){     //离底部100px时触发加载     var closeToBottom = ($(window).scrollTop()

RecyclerView实现瀑布流效果(二)

在上篇中我们知道RecyclerView中默认给我们提供了三种布局管理器,分别是LinearLayoutManager.GridLayoutManager.StaggeredGridLayoutManager.其中StaggeredGridLayoutManager可实现交错式网格布局,正好可以用来实现瀑布流. 下面先看看效果图吧,再贴代码: 其中大部分内容实现其实是和上篇文章是一样的,就不多叙述了,就一个地方不同,就是我们在适配器中绑定ViewHolder的方法中需要重新给我们的itemVie