js+jquery+css3

(原生js+jquery+css3)

前言

项目需求要弄个瀑布流的页面,用的是waterfall这个插件,感觉还是可以的,项目赶就没自己的动手写。最近闲来没事,就自己写个。大致思路理清楚,还是挺好实现的...

原生javascript版

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>瀑布流-javascript</title>
    <style>
        *{margin:0;padding:0;}
        #content{position: relative;margin:0 auto;}
        .box{padding:10px;float: left;}/*首行浮动,第二行开始绝对定位*/
        .box img{width: 180px;height:auto;display: block;}
    </style>
    <script>
        window.onload=function(){
            waterfall(‘content‘,‘box‘);

            //改变窗口大小时,重新排列
            window.onresize = function(){
                waterfall(‘content‘,‘box‘);
            }

            //如果数据不够,没出现滚动条,自动加载数据
            var time=setInterval(function(){
                if(checkscrollside()){
                    addDate();//插入数据
                    waterfall(‘content‘,‘box‘);//加载完数据从新排列
                }else{
                    clearInterval(time);
                    window.onscroll=function(){
                        if(checkscrollside()){
                            addDate();
                            waterfall(‘content‘,‘box‘);
                        };
                    }
                }
            },1000) 

        }
        // 数据插入
        function addDate(){
            var dataInt=[‘1.jpg‘,‘2.jpg‘,‘3.jpg‘,‘4.jpg‘,‘5.jpg‘,‘6.jpg‘,‘7.jpg‘,‘8.jpg‘];//模拟数据,也可以是对象
            var oParent = document.getElementById(‘content‘);
            for(var i=0;i<dataInt.length;i++){//循环插入数据
                var oBox=document.createElement(‘div‘);
                oBox.className=‘box‘;
                oParent.appendChild(oBox);
                var oImg=document.createElement(‘img‘);
                oImg.src=‘./img/‘+dataInt[i];
                oBox.appendChild(oImg);
            }
        }
        //主函数
        function waterfall(parentID,childClass){
            var oParent=document.getElementById(parentID);
            var arrBox=getClassObj(parentID,childClass);// getClassObj()获取子class的数组
            var iBoxW=arrBox[0].offsetWidth;// 获取瀑布流块的宽度
            var num=Math.floor(document.documentElement.clientWidth/iBoxW);//计算窗口能容纳几列
            oParent.style.width=iBoxW*num+‘px‘;//设置父级宽度
            var arrBoxH=[];//数组,用于存储每列中的所有块框相加的高度
            for(var i=0;i<arrBox.length;i++){//遍历数组瀑布流 块
                var boxH=arrBox[i].offsetHeight;//获取当前块的高度
                if(i<num){
                    arrBox[i].style.cssText="";//防止用户改变窗口大小,到时样式出错
                    arrBoxH[i]=boxH; //第一行中的num个块box 先添加进数组arrBoxH
                }else{
                    var minH=Math.min.apply(null,arrBoxH);//获取数组arrBoxH中的最小值minH
                    var minHIndex=getminHIndex(arrBoxH,minH);//遍历数组获取最小值minH的索引
                    arrBox[i].style.position=‘absolute‘;//设置绝对位移
                    arrBox[i].style.top=minH+‘px‘;
                    arrBox[i].style.left=minHIndex*iBoxW+‘px‘;//也可以直接获取arrBox[minHIndex].offsetLeft
                    arrBoxH[minHIndex]+=arrBox[i].offsetHeight;//添加后,更新最小列高
                }
            }
        }
        //获取子class的数组
        function getClassObj(parentID,childClass){
            var oParent=document.getElementById(parentID);
            var allChildObj=oParent.getElementsByTagName(‘*‘);//获取父级下的所有子集
            var childObj=[];//创建一个数组 用于收集子元素
            for (var i=0;i<allChildObj.length;i++) {//遍历子元素、判断类别、压入数组
                if (allChildObj[i].className==childClass){
                    childObj.push(allChildObj[i]);
                }
            };
            return childObj;
        }
        //获取数组最小值的索引
        function getminHIndex(arr,minH){
            for(var i in arr){
                if(arr[i]==minH){
                    return i;
                }
            }
        }
        // 判断滚动条是否到底部
        function checkscrollside(){
            var arrBox=getClassObj("content",‘box‘);
            //获取最后一个瀑布流块的高度:距离网页顶部(实现未滚到底就开始加载)
            var lastBoxH=arrBox[arrBox.length-1].offsetTop;
            var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//获取滚动条卷走的高度
            var documentH=document.documentElement.clientHeight;//显示页面文档的高
            return (lastBoxH<scrollTop+documentH)?true:false;//到达指定高度后 返回true,触发waterfall()函数
        }
    </script>
</head>
<body>
    <div id="content">
        <div class="box"><img src="img/0.jpg" ></div>
        <div class="box"><img src="img/1.jpg" ></div>
        <div class="box"><img src="img/2.jpg" ></div>
        <div class="box"><img src="img/3.jpg" ></div>
        <div class="box"><img src="img/4.jpg" ></div>
        <div class="box"><img src="img/5.jpg" ></div>
        <div class="box"><img src="img/6.jpg" ></div>
        <div class="box"><img src="img/7.jpg" ></div>
        <div class="box"><img src="img/8.jpg" ></div>
        <div class="box"><img src="img/9.jpg" ></div>
        <div class="box"><img src="img/10.jpg" ></div>
    </div>
</body>
</html>

jquery版本

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>瀑布流-jquery</title>
    <style>
        *{margin:0;padding:0;}
        #content{position: relative;margin:0 auto;}
        .box{padding:10px;float: left;}
        .box img{width: 180px;height:auto;display: block;}
    </style>
    <script src="js/jquery-1.11.1.min.js"></script>
    <script>
        $(function(){
            waterfall();

            //改变窗口大小时,重新排列
            $(window).resize(function(){
                waterfall();
            })

            //如果数据不够,没出现滚动条,自动加载数据
            var time=setInterval(function(){
                if(checkscrollside()){
                    addDate();//插入数据
                    waterfall();//加载完数据从新排列
                }else{
                    clearInterval(time);
                    $(window).scroll(function(){
                        if(checkscrollside()){
                            addDate();
                            waterfall();
                        };
                    })
                }
            },1000) 

        })
        // 数据插入
        function addDate(){
            var dataInt=[‘1.jpg‘,‘2.jpg‘,‘3.jpg‘,‘4.jpg‘,‘5.jpg‘,‘6.jpg‘,‘7.jpg‘,‘8.jpg‘];//模拟数据,也可以是对象
            var oParent = $(‘#content‘);
            for(var i=0;i<dataInt.length;i++){//循环插入数据
                oParent.append(‘<div class="box"><img src="./img/‘+dataInt[i]+‘" ></div>‘);
            }
        }
        //主函数
        function waterfall(){
            var arrBox=$(‘#content‘).children(‘.box‘);// box对象
            var iBoxW=arrBox.eq(0).innerWidth();// 获取瀑布流块的宽度,注意width(),跟innerWidth()的区别
            var num=Math.floor($(window).width()/iBoxW);//计算窗口能容纳几列
            $(‘#content‘).css(‘width‘,iBoxW*num);//设置父级宽度
            var arrBoxH=[];//数组,用于存储每列中的所有块框相加的高度
            for(var i=0;i<arrBox.length;i++){//遍历数组瀑布流 块
                var boxH=arrBox.eq(i).innerHeight();//获取当前块的高度
                if(i<num){
                    arrBox.eq(i).attr(‘style‘,‘‘);//防止用户改变窗口大小,到时样式出错
                    arrBoxH[i]=boxH; //第一行中的num个块box 先添加进数组arrBoxH
                }else{
                    var minH=Math.min.apply(null,arrBoxH);//获取数组arrBoxH中的最小值minH
                    var minHIndex=$.inArray(minH,arrBoxH);//使用jquery提供的工具
                    arrBox.eq(i).css({‘position‘:‘absolute‘,‘top‘:minH,‘left‘:minHIndex*iBoxW});//设置定位
                    arrBoxH[minHIndex]+=arrBox.eq(i).innerHeight();//添加后,更新最小列高
                }
            }
        }
        // 判断滚动条是否到底部
        function checkscrollside(){
            var arrBox=$(‘#content‘).children(‘.box‘);
            //获取最后一个瀑布流块的高度:距离网页顶部(实现未滚到底就开始加载)
            var lastBoxH=arrBox.eq(arrBox.length-1).offset().top;
            var scrollTop=$(window).scrollTop()//获取滚动条卷走的高度
            var documentH=$(window).height();;//显示页面文档的高
            return (lastBoxH<scrollTop+documentH)?true:false;//到达指定高度后 返回true,触发waterfall()函数
        }
    </script>
</head>
<body>
    <div id="content">
        <div class="box"><img src="img/0.jpg" ></div>
        <div class="box"><img src="img/1.jpg" ></div>
        <div class="box"><img src="img/2.jpg" ></div>
        <div class="box"><img src="img/3.jpg" ></div>
        <div class="box"><img src="img/4.jpg" ></div>
        <div class="box"><img src="img/5.jpg" ></div>
        <div class="box"><img src="img/6.jpg" ></div>
        <div class="box"><img src="img/7.jpg" ></div>
        <div class="box"><img src="img/8.jpg" ></div>
        <div class="box"><img src="img/9.jpg" ></div>
        <div class="box"><img src="img/10.jpg" ></div>
    </div>
</body>
</html>

大致思路

1.先让第一行的浮动

2.计算第一行的每个块的高度

3.遍历第一行之后的每一个块,逐个放在最小高度的下面

4.加载数据插入最后,再重新计算

注意点

a.原生js

1.定义了getClassObj()函数用于获取class类的对象,方便调用。考虑了兼容性 getElementsByClassName

2.定义了getminHIndex()函数用户获取最小值的索引

3.设置块与块之间的距离最好用padding,这样的话offsetHeight可以直接获取得到高度。如果设置margin则得多加个外边距的距离

4.代码中设置了定时器加载数据,其实可以省略,只要保证第一次加载的数据能满屏就可以。如果没出现滚动条的话onscroll事件是不会执行到的。也就没办法加载数据了

5.代码中的计算宽度也可以修改,设计的页面是定宽的瀑布流的话。这里主要是做了响应式的处理

var arrBox=getClassObj(parentID,childClass);// getClassObj()获取子class的数组
var iBoxW=arrBox[0].offsetWidth;// 获取瀑布流块的宽度
var num=Math.floor(document.documentElement.clientWidth/iBoxW);//计算窗口能容纳几列
oParent.style.width=iBoxW*num+‘px‘;//设置父级宽度

6.每设置一块位移,都要在列高的数组上增加数值,防止块重叠

arrBox[i].style.position=‘absolute‘;//设置绝对位移
arrBox[i].style.top=minH+‘px‘;
arrBox[i].style.left=minHIndex*iBoxW+‘px‘;//也可以直接获取arrBox[minHIndex].offsetLeft
arrBoxH[minHIndex]+=arrBox[i].offsetHeight;//添加后,更新最小列高

b.jquery

1.思路是跟js一样的,只是jquery封装了很多方法,让我们简便的就实现了

2.注意width(),跟innerWidth()的区别。前者只能获取宽度值(不包括补白padding)

css3版本

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>瀑布流-css3</title>
    <style>
        *{margin:0;padding:0;}
        #content{margin:0 auto;position: relative;width:1200px;column-count:6;-moz-column-count:6;-webkit-column-count:6;}
        .box{padding:10px;width: 180px;}
        .box img{width: 180px;height:auto;display: block;}
    </style>
    <script>
        window.onload=function(){
            //如果数据不够,没出现滚动条,自动加载数据
            var time=setInterval(function(){
                if(checkscrollside()){
                    addDate();//插入数据
                }else{
                    clearInterval(time);
                    window.onscroll=function(){
                        if(checkscrollside()){
                            addDate();
                        };
                    }
                }
            },1000) 

        }
        // 数据插入
        function addDate(){
            var dataInt=[‘1.jpg‘,‘2.jpg‘,‘3.jpg‘,‘4.jpg‘,‘5.jpg‘,‘6.jpg‘,‘7.jpg‘,‘8.jpg‘];//模拟数据,也可以是对象
            var oParent = document.getElementById(‘content‘);
            for(var i=0;i<dataInt.length;i++){//循环插入数据
                var oBox=document.createElement(‘div‘);
                oBox.className=‘box‘;
                oParent.appendChild(oBox);
                var oImg=document.createElement(‘img‘);
                oImg.src=‘./img/‘+dataInt[i];
                oBox.appendChild(oImg);
            }
        }
        //获取子class的数组
        function getClassObj(parentID,childClass){
            var oParent=document.getElementById(parentID);
            var allChildObj=oParent.getElementsByTagName(‘*‘);//获取父级下的所有子集
            var childObj=[];//创建一个数组 用于收集子元素
            for (var i=0;i<allChildObj.length;i++) {//遍历子元素、判断类别、压入数组
                if (allChildObj[i].className==childClass){
                    childObj.push(allChildObj[i]);
                }
            };
            return childObj;
        }
        // 判断滚动条是否到底部
        function checkscrollside(){
            var arrBox=getClassObj("content",‘box‘);
            //获取最后一个瀑布流块的高度:距离网页顶部(实现未滚到底就开始加载)
            var lastBoxH=arrBox[arrBox.length-1].offsetTop;
            var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//获取滚动条卷走的高度
            var documentH=document.documentElement.clientHeight;//显示页面文档的高
            return (lastBoxH<scrollTop+documentH)?true:false;//到达指定高度后 返回true,触发waterfall()函数
        }
    </script>
</head>
<body>
    <div id="content">
        <div class="box"><img src="img/0.jpg" ></div>
        <div class="box"><img src="img/1.jpg" ></div>
        <div class="box"><img src="img/2.jpg" ></div>
        <div class="box"><img src="img/3.jpg" ></div>
        <div class="box"><img src="img/4.jpg" ></div>
        <div class="box"><img src="img/5.jpg" ></div>
        <div class="box"><img src="img/6.jpg" ></div>
        <div class="box"><img src="img/7.jpg" ></div>
        <div class="box"><img src="img/8.jpg" ></div>
        <div class="box"><img src="img/9.jpg" ></div>
        <div class="box"><img src="img/10.jpg" ></div>
    </div>
</body>
</html>

注意点

1.滚动加载还是得另外加js

2.加载的数据,是竖向排列的。体验不是很友好

3.有兼容性问题,Internet Explorer 10 +

时间: 2024-08-09 06:32:13

js+jquery+css3的相关文章

分享一款jquery+css3实现的手风琴效果代码【js插件】

代码适用于大部分浏览器 演示Demo地址:请猛戳 效果图片 程序吧下载地址 分享一款jquery+css3实现的手风琴效果代码[js插件],布布扣,bubuko.com

Arctext.js - 基于 CSS3 &amp; jQuery 的文本弯曲效果

Arctext.js 是基于 Lettering.js 的文本旋转插件,根据设置的旋转半径准确计算每个字母的旋转弧度并均匀分布.虽然 CSS3 也能够实现字符旋转效果,但是要让安排每个字母都沿着弯曲路径排布相当的复杂,结合 Arctext.js 则可以轻松实现这个效果. 效果演示     插件下载 您可能感兴趣的相关文章 Web 开发中很实用的10个效果[源码下载] 精心挑选的优秀jQuery Ajax分页插件和教程 12个让人惊叹的的创意的 404 错误页面设计 让网站动起来!12款优秀的 j

整屏滚动效果 jquery.funnPage.js插件+CSS3实现

最近很流行整屏滚动的效果,无论是在PC端还是移动端,本人也借机学习了一下,主要通过jquery.funnPage.js插件+CSS3实现效果. 本人做的效果: 首先使用要引入插件 <link rel="stylesheet" href="../c/jquery.fullPage.css" media="all"/> <script type="text/javascript" src="../j/l

分享jQuery&amp;CSS3导航标签切换效果

jquery+css3完成的菜单导航特效 引入代码: <link rel="stylesheet" type="text/css" href="css/style.css"/> <script type="text/javascript" src="http://www.google.com/jsapi"></script> <script type="t

js和CSS3炫酷3D相册展示

<!doctype html> <html> <head> <meta charset="UTF"> <title>js和CSS3炫酷3D相册展示</title> <style> *{margin:0;padding:0;} body{background:url(img/bg.jpg);width:100%;height:100%;overflow:hidden;}; h1{width:277;hei

10款jQuery+CSS3实现的多种图片切换焦点图

1.js实现的七屏百叶窗焦点图动态特效 可以实现可以同时显示很多找竖行百叶窗效果的缩略图,代码,鼠标悬浮在一张缩略图上时,该图片就在原位置变亮并慢慢展开,同时两边的缩略图就往两边缩小靠近,需要此种焦点图效果的朋友们可以前来下载使用. 在线演示 源码下载 2.jQuery+CSS3实现的多种图片切换方式简易焦点图 今天要来分享一款简易的jQuery+CSS3焦点图应用,这款焦点图应用的图片切换方式非常丰富,而且焦点图的切换按钮比较小,图片篇幅占据比较大,因此总体比较大气. 在线演示 源码下载 3.

打造简易可扩展的jQuery/CSS3 Tab菜单

原文:打造简易可扩展的jQuery/CSS3 Tab菜单 今天我们利用jQuery和CSS3来打造一款简易而且扩展性强的Tab菜单,这款Tab菜单在切换时也有滑块的效果,先来看看效果图: 由与Tab菜单比较假单,你也可以用CSS代码定制你自己需要的外观. 我们可以在这里看到这款Tab菜单的DEMO演示. 看完演示,再来解读一下这款Tab菜单的源代码,主要由CSS代码和jQuery代码两块. 先是上简单的HTML代码: <figure class="tabBlock"> &l

jQuery+CSS3文字跑马灯特效

jQuery+CSS3文字跑马灯特效是一款将跑马灯背景制作为3D立方体效果,文字在上面移动时,就像是文字投影到墙壁上,在转角出会改变运动方向. 效果展示 http://hovertree.com/texiao/jquery/83/ 效果图如下: 完整HTML代码如下: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta http

jQuery+css3 弹幕

写了个基于jQuery+css3的弹幕功能,此功能面向手机wap,利用改变位移做弹幕功能会使一些性能低的手机浏览器卡,所以用了css3,此功能不支持非webkit内核浏览器 html部分 自己设置样式,定义#danmu 的长宽,区域等 <div id="danmu"></div> js引用 $("#danmu").danmu({ minSpeed : 3000, maxSpeed: 5000, _text : [//不设置color和font