jQuery+HTML5美女瀑布流布局实现方法

下面是详细的"jQuery+HTML5美女瀑布流布局实现方法"攻略:

概述

瀑布流布局是近年来非常流行的一种网页布局方式,它可以将页面上的数据以瀑布流的方式呈现出来,形式非常美观。本文将介绍如何使用jQuery和HTML5实现一个简单的美女瀑布流布局。

实现步骤

第一步:HTML结构

首先,我们需要构建一个基本的HTML结构,该结构包含"container"、"box"两个基本元素:

<div class="container">
  <div class="box">
    <img src="#">
  </div>
  <div class="box">
    <img src="#">
  </div>
  ...
</div>

其中,每一个.box元素中包含一张图片,这些图片将被排列在container中。

第二步:CSS样式

接下来,我们需要定义一些CSS样式来让这些元素排列起来。下面是一些基础的CSS样式:

.container {
  width: 100%;
  overflow: hidden;
}
.box {
  width: 23%;
  margin: 1%;
  float: left;
  background: #eee;
  position: relative;
}
.box img {
  width: 100%;
  height: auto;
  display: block;
}

以上样式,将所有.box元素按照23%的宽度和1%的margin进行排列。同时,我们需要在.box元素中添加一个相对定位的position属性(position: relative),以便后面进行绝对定位操作。

第三步:实现定位

接下来,我们需要通过jQuery来实现这些.box元素的定位。首先,我们需要获取每一个.box元素,并为其设置绝对定位:

var boxs = $('.box');
var containerWidth = $('.container').width();
var boxWidth = boxs.eq(0).outerWidth();
var cols = Math.floor(containerWidth / boxWidth);

$('.box').each(function(index) {
  if (index < cols) {
    $(this).css({
      'top': 0,
      'left': (boxWidth + 2) * index
    });
  } else {
    var minHeight = Math.min.apply(null, boxHeight);
    var minIndex = $.inArray(minHeight, boxHeight);

    $(this).css({
      'position': 'absolute',
      'top': minHeight + 2,
      'left': boxs.eq(minIndex).position().left
    });

    boxHeight[minIndex] += boxs.eq(index).outerHeight() + 2;
  }
});

以上代码通过计算容器宽度和每个.box元素的宽度,算出一共可以容纳多少列(cols);针对每一个.box元素,判断它是在第一行,还是在第二行之后。在第一行(index小于cols)的.box元素,直接设置top和left即可;在第二行之后的.box元素,计算出当前列的高度,设置为当前.box元素的top,而left则采用最小高度的列的left属性。

第四步:瀑布流加载更多

最后,我们将实现瀑布流的"加载更多"功能。这需要通过监听scroll事件来实现:

$(window).on('scroll', function() {
  if (checkScrollSlide()) {
    //TODO
  }
});

function checkScrollSlide() {
  var lastBox = $('.box').last();
  var lastBoxDis = lastBox.offset().top + Math.floor(lastBox.outerHeight() / 2);
  var scrollTop = $(window).scrollTop();
  var documentH = $(window).height();

  return (lastBoxDis < scrollTop + documentH) ? true : false;
}

以上代码监听scroll事件,当滚动到距离最后一个.box元素的一半之后,触发加载更多的事件。

示例说明

示例1

下面是一个基于以上攻略实现的简单示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>瀑布流布局示例</title>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <style type="text/css">
        .container {
            width: 100%;
            overflow: hidden;
        }
        .box {
            width: 23%;
            margin: 1%;
            float: left;
            background: #eee;
            position: relative;
        }
        .box img {
            width: 100%;
            height: auto;
            display: block;
        }
    </style>
    <script type="text/javascript">
        $(function() {
            var boxs = $('.box');
            var containerWidth = $('.container').width();
            var boxWidth = boxs.eq(0).outerWidth();
            var cols = Math.floor(containerWidth / boxWidth);

            var boxHeight = [];
            boxs.each(function(index, value) {
                var boxHeight = boxs.eq(index).outerHeight() + 2;
                if (index < cols) {
                    boxHeight[index] = boxs.eq(index).outerHeight() + 2;
                } else {
                    var minHeight = Math.min.apply(null, boxHeight);
                    var minIndex = $.inArray(minHeight, boxHeight);

                    $(this).css({
                        'position': 'absolute',
                        'top': minHeight + 2,
                        'left': boxs.eq(minIndex).position().left
                    });

                    boxHeight[minIndex] += boxs.eq(index).outerHeight() + 2;
                }
            });

            $(window).on('scroll', function() {
                if (checkScrollSlide()) {
                    $('.container').append($('.box').clone(true, true));
                    $(window).trigger('resize');      // 触发resize事件,重新布局
                }
            });

            function checkScrollSlide() {
                var lastBox = $('.box').last();
                var lastBoxDis = lastBox.offset().top + Math.floor(lastBox.outerHeight() / 2);
                var scrollTop = $(window).scrollTop();
                var documentH = $(window).height();

                return (lastBoxDis < scrollTop + documentH) ? true : false;
            }
        });
    </script>
</head>
<body>
    <div class="container">
        <div class="box"><img src="http://placehold.it/350x350"></div>
        <div class="box"><img src="http://placehold.it/320x450"></div>
        <div class="box"><img src="http://placehold.it/300x300"></div>
        <div class="box"><img src="http://placehold.it/450x450"></div>
        <div class="box"><img src="http://placehold.it/300x300"></div>
        <div class="box"><img src="http://placehold.it/200x450"></div>
        <div class="box"><img src="http://placehold.it/410x280"></div>
        <div class="box"><img src="http://placehold.it/350x350"></div>
        <div class="box"><img src="http://placehold.it/300x300"></div>
        <div class="box"><img src="http://placehold.it/450x450"></div>
        <div class="box"><img src="http://placehold.it/300x300"></div>
    </div>
</body>
</html>

该示例中,我们可以看到一排排排列的图片瀑布流布局。

示例2

下面是一个使用ajax获取数据的示例:


<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Ajax瀑布流</title>
    <style>
        *{
            padding: 0;
            margin: 0;
            list-style: none;
        }
        a{
            text-decoration: none;
        }
        .box{
            position: absolute;
            margin: 15px;
        }
        .box img{
            vertical-align: top;
        }
        #loading{
            position: absolute;
            top: 0;
            left: 50%;
            margin-left: -20px;
            width: 40px;
            height: 40px;
            display: none;
            background: url(./images/loading.gif) no-repeat center center;
        }
        #loadMore{
            text-align: center;
            margin: 10px 0;
            padding: 10px;
            background: #ccc;
            color: #fff;
            cursor: pointer;
        }
        #loadMore:hover{
            background: #666;
        }
    </style>
    <script src="http://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>
<div id="container">
    <div class="box"><a href="#"><img src="./images/1.jpg" alt=""></a></div>
    <div class="box"><a href="#"><img src="./images/2.jpg" alt=""></a></div>
    .......
</div>
<div id="loading"></div>
<div id="loadMore">Load More</div>
<script>
    var pageIndex = 0;
    var imgData = {"data":[{"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"},{"src":"7.jpg"},{"src":"8.jpg"},{"src":"9.jpg"},{"src":"10.jpg"},{"src":"11.jpg"},{"src":"12.jpg"},{"src":"13.jpg"},{"src":"14.jpg"},{"src":"15.jpg"},{"src":"16.jpg"},{"src":"17.jpg"},{"src":"18.jpg"},{"src":"19.jpg"},{"src":"20.jpg"},{"src":"21.jpg"},{"src":"22.jpg"},{"src":"23.jpg"},{"src":"24.jpg"},{"src":"25.jpg"},{"src":"26.jpg"},{"src":"27.jpg"},{"src":"28.jpg"},{"src":"29.jpg"},{"src":"30.jpg"}]};
    imgLocation();
    // 监听滚动条,新的图片load出来再重新排列图片
    window.onscroll = function(){
        if(checkScrollSlide){
            $("#loading").show();

            $.ajax({
                url: './data/data.json',
                type: 'GET',
                dataType: 'json',
                data: {pageIndex: pageIndex},
            })
            .done(function(data) {
                pageIndex ++;
                $.each(data.data,function(key, value){
                    var oBox = $("<div>").addClass("box").appendTo($("#container"));
                    var oPic = $("<div>").addClass("pic").appendTo($(oBox));
                    $("<img>").attr("src","./images/"+$(value).attr("src")).appendTo($(oPic));
                });
                imgLocation();
            })
            .fail(function() {
                console.log("error");
            })
            .always(function() {
                console.log("complete");
                $("#loading").hide();
            });
        }
    }
    // 计算出新load图片的位置
    function imgLocation(){
        var box = $(".box");
        var boxW = box.eq(0).width();
        var num = Math.floor($("#container").width()/boxW); 
        var boxArr = []; 
        box.each(function(index,value){
           var boxH = box.eq(index).height(); 
           if (index < num){

               boxArr[index] = boxH;
           }else{
               var minH = Math.min.apply(null, boxArr);  
               console.log(minH);
               var minHIndex = $.inArray(minH, boxArr);
               // console.log(minHIndex);
               $(value).css({
                   "position":"absolute",
                   "top":minH+"px",
                   "left":box.eq(minHIndex).position().left+"px"
               })
               boxArr[minHIndex] += box.eq(index).height();
           }
        });
    }

    function checkScrollSlide(){
        var lastBox = $('.box').last();
        var lastBoxH = lastBox.offset().top + Math.floor(lastBox.height()/2);
        var scrollTop = $(window).scrollTop();
        console.log(lastBoxH,scrollTop,documentH)
        var documentH = $(window).height();
        return (lastBoxH < scrollTop + documentH) ? true : false;
    }
</script>
</body>
</html>

该示例中采用了ajax获取数据,每次滚动至底部时,触发Ajax请求,并渲染新数据至页面上。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jQuery+HTML5美女瀑布流布局实现方法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • jQuery UI的Selectable create事件

    jQuery UI 的 Selectable 组件提供了一个 create 事件,该事件在 Selectable 实例创建时触发。在本教程中,我们将详细介绍 Selectable 的 create 事件的使用方法。 事件基本法如下: $( ".selector" ).selectable({ create: function( event…

    jquery 2023年5月11日
    00
  • jQWidgets jqxScheduler showLegend属性

    jQWidgets是一个基于jQuery的UI组件库,其中的jqxScheduler插件可以用于创建日程安排、预定等功能的日历视图控件。其中,showLegend属性用于控制是否在jqxScheduler控件中显示详细的时间图例信息。 showLegend属性的取值可以为布尔类型或者函数类型。下面是showLegend属性的详细讲解: showLegend属…

    jquery 2023年5月11日
    00
  • jQWidgets jqxButtonGroup 主题属性

    jQWidgets 的 jqxButtonGroup 组件提供了 rtl 属性,用于设置按钮组的文本方向。本文将详细介绍 rtl 属性的使用方法,包括概述、示例以及注意项。 rtl 属性概述 rtl 属性用于设置按钮组的文本方向。当 rtl 属性设置为 true 时,按钮组的文本方向为从右到左;否则,按钮组的文本方向为从左到右。 rtl 属性示例 下面是两个…

    jquery 2023年5月11日
    00
  • JavaScript与jQuery实现的闪烁输入效果

    实现闪烁输入效果,可以使用JavaScript和jQuery两种方式。下面分别介绍这两种方式的实现方法。 一、JavaScript实现闪烁输入效果 实现原理 JavaScript可以通过设置定时器,定时修改文本的样式来实现闪烁效果。例如,可以通过设置文字的颜色或者背景色进行闪烁。具体实现步骤如下: 获取需要闪烁的输入框或者文本节点。 设置定时器,定时修改输入…

    jquery 2023年5月27日
    00
  • jQWidgets jqxTree clear()方法

    当您需要清空 jQWidgets jqxTree 中的所有节点时,可以使用 clear() 方法。以下是 jQWidgets jqxTree clear() 方法的完整攻略: jQWidgets jqxTree clear() 方法 clear() 方法用于清空树形结构中的所有节点。 语法 $(‘#tree’).jqxTree(‘clear’); 参数 无参…

    jquery 2023年5月11日
    00
  • jQWidgets jqxFileUpload cancelFile()方法

    jQWidgets jqxFileUpload cancelFile() 方法 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI组件和工具包表格等。jqxFileUpload是jQWidgets的一个组件,用于实现上传功能。cancelFile()是jqxFileUpload的一个方法,用于取消上传文件。本文将详细介绍cancelFile…

    jquery 2023年5月9日
    00
  • jQWidgets jqxDropDownList openDelay属性

    jQWidgets jqxDropDownList openDelay属性详解 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI组件和工具包。jqxDropDownList是Widgets组件,用于实现下拉列表。openDelay属性是jqxDropDownList的一个属性,用于设置下拉列表打开的延迟时间。本文将详细介绍openDela…

    jquery 2023年5月10日
    00
  • Jquery中map函数的用法

    以下是关于Jquery中map函数的用法的完整攻略: 1. 简介 Jquery 中的 map() 函数是一种遍历函数,它能够将一个数组或对象中的每个元素传递给指定的回调函数进行处理,并将所有回调函数返回值组合成一个新的数组或对象返回。它与 forEach() 和 each() 函数类似,但是不同之处在于它可以设置回调函数的返回值,并将这些返回值组合成一个新的…

    jquery 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部