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实现检测浏览器及版本的脚本代码

    使用jQuery可以很方便地检测用户浏览器及版本信息,下面是示例代码及详细说明: 1. 检测浏览器名称 $(function () { var browserName = getBrowserName(); alert(browserName); }); function getBrowserName() { var userAgent = navigato…

    jquery 2023年5月28日
    00
  • 如何禁用jQuery动画

    以下是禁用jQuery动画的攻略。 一、为什么要禁用jQuery动画 在网页开发中,动画效果能够提升用户体验,但是大量的动画效果会导致页面加载时间过长,影响用户的访问体验。对于一些性能较低的设备,动画效果可能会导致卡顿,甚至崩溃。因此,在一些情况下,我们需要禁用jQuery动画。 二、禁用jQuery动画的方法 1. 使用jQuery.fx.off属性 可以…

    jquery 2023年5月12日
    00
  • jQuery :lt() 选择器

    以下是关于jQuery中的:lt()选择器的完整攻略: 什么是jQuery中的:lt()选择器? jQuery中的:lt()选择器是一种用于选择某个元素的前几个元素的语法。使用这个选择器可以轻松选择某个元素的前几个元素对其进行操作。 如何使用jQuery中的:lt()选择器? 可以使用以下代码来选择某个素的前几个元素: $("parent-elem…

    jquery 2023年5月12日
    00
  • jQuery中复合属性选择器用法实例

    接下来我将为大家详细讲解“jQuery中复合属性选择器用法实例”的完整攻略。 什么是复合属性选择器? 复合属性选择器是jQuery中的一种选择器,是通过多个选择条件(多个属性名和属性值的组合)来筛选元素的方法。其中,多个选择条件之间用“,”隔开,表示满足其中任意一个条件即可。具体语法如下: [attributeName1][attributeValue1],…

    jquery 2023年5月18日
    00
  • javascript与jquery动态创建html元素示例

    前言 JavaScript 是一门强大的脚本语言,可以用来直接操作 HTML 和 CSS,实现动态更新 Web 页面。而 jQuery 是 JavaScript 库中最常用的工具之一,它为开发者提供了方便易用的 API,可以很方便地完成诸如增删改查等操作。 在本文中,我将详细介绍如何使用 JavaScript 和 jQuery 动态创建 HTML 元素。我将…

    jquery 2023年5月27日
    00
  • jQuery $.extend()用法总结

    jQuery $.extend()用法总结 $.extend() 函数是 jQuery 中常用的函数之一,主要功能是将多个对象合并成一个对象。它的基本语法如下: $.extend(target, object1, object2, … , objectN) 其中 target 是目标对象,object1 到 objectN 是需要合并的对象,合并后的结果…

    jquery 2023年5月27日
    00
  • jQWidgets jqxToolBar minimizeWidth属性

    以下是关于 jQWidgets jqxToolBar 组件中 minimizeWidth 属性的详细攻略。 jQWidgets jqxToolBar minimizeWidth 属性 jQWidgets jqxToolBar 组件 minimizeWidth 属性用于设置工具栏最小化时的宽度。该属性接受数字或字符串值,表示工具栏最小化时的宽度。默认值为 30…

    jquery 2023年5月11日
    00
  • 使用jQuery操作Cookies的实现代码

    要使用jQuery操作Cookies的实现代码,可以按照以下步骤进行: 一、设置cookie值 要设置cookie值,可以使用 $.cookie() 函数。该函数的第一个参数是cookie名称,第二个参数是cookie值,第三个参数是可选的配置对象,用于设置cookie的参数(如过期时间、作用域等)。 示例代码: $.cookie(‘username’, ‘…

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