HTML+CSS+JS实现图片的瀑布流布局的示例代码

yizhihongxing

以下是HTML+CSS+JS实现图片瀑布流布局的攻略:

什么是图片瀑布流布局

图片瀑布流布局是一种网页排版方式,通过不规则的排列方式,在多个列上交错放置图片,看起来像瀑布一样流动。瀑布流布局时常用于展示图片等内容的的网站,比如国内的花瓣网。

实现步骤

1.编写HTML结构

首先,需要在HTML文件中编写好图片布局的基础结构,即一组div元素,每个div元素包含一张图片。

<div id="main">
    <div class="box">
        <img src="image1.jpg"/>
    </div>
    <div class="box">
        <img src="image2.jpg"/>
    </div>
    <div class="box">
        <img src="image3.jpg"/>
    </div>
    <div class="box">
        <img src="image4.jpg"/>
    </div>
    ...
</div>

2.编写CSS样式

接着,需要为图片布局编写CSS样式,其中包括每个box元素的样式(包含图片宽高),以及main容器的宽度等样式。

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

#main {
    width: 100%; /*容器宽度*/
}

.box {
    width: 23%; /*图片盒子宽度*/
    margin: 10px; /*盒子间距*/
    float: left; /*浮动*/
}

.box img {
    width: 100%; /*图片宽度*/
    height: auto; /*高度自适应*/
}

3.编写JS代码

最后,需要利用JS代码来实现图片瀑布流的布局效果。这里我们可以使用jQuery库来帮助我们实现。

$(window).on('load', function() {
    waterfall();
});

function waterfall() {
    var $boxArr = $('#main .box');
    var boxWidth = $boxArr.eq(0).outerWidth(); /*第一个图片盒子的宽度*/
    var windowWidth = $(window).width(); /*当前窗口宽度*/

    var cols = Math.floor(windowWidth / boxWidth); /*计算列数*/
    $('#main').width(boxWidth * cols); /*设置#main宽度*/

    var heightArr = [];
    $boxArr.each(function(index, value) {
        var boxHeight = $(this).outerHeight(); /*获取当前box盒子高度*/
        if (index < cols) { /*处理第一行*/
            heightArr[index] = boxHeight;
        } else { /*处理其它行*/
            var minHeight = Math.min.apply(null, heightArr);
            var minIndex = $.inArray(minHeight, heightArr);
            $(value).css({ /*设置图片盒子位置*/
                'position': 'absolute',
                'top': minHeight + 'px',
                'left': $boxArr.eq(minIndex).position().left + 'px'
            });
            heightArr[minIndex] += $(this).outerHeight(); /*更新列高*/
        }
    });
}

上述JS代码,先通过window的load事件来触发函数调用,运行waterfall()函数。在waterfall函数中,我们首先获取.box元素,并计算第一个.box元素的宽度,以及当前浏览器窗口的宽度。然后我们算出需要多少列,让main容器宽度恰好能够容纳cols列图片盒子。

接着我们通过一个“heightArr”数组来存储每列的高度。对于第一行的图片盒子,我们直接存到数组中。对于后面的所有图片盒子,我们需要先找到最小的height,然后把该盒子放到height值最小的那一列中,同时更新该列的高度。

示例1:美团外卖首页

下面我们就以美团外卖的首页为例,来演示如何实现图片瀑布流布局。

同样,我们也需要先编写html和css样式来搭建基础结构。但是美团的图片瀑布流布局略有不同,它是分为两栏的。我们可以通过一个类名.discern来为两栏图片区分开。下面我们来看一下HTML和CSS代码:

<div id="main">
    <div class="discern left">
        <img src="1.png" width="100%" alt="麻辣烫"/>
    </div>
    <div class="discern right">
        <img src="2.png" width="100%" alt="肉夹馍"/>
    </div>
    <div class="discern left">
        <img src="3.png" width="100%" alt="粉丝汤"/>
    </div>
    <div class="discern right">
        <img src="4.png" width="100%" alt="石锅拌饭"/>
    </div>
    ...
</div>
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

#main {
    width: 1200px;
    margin: 0 auto;
    overflow: hidden;
}

.discern {
    position: relative;
    float: left;
    width: 575px;
    margin: 0 12px 18px 0;
    overflow: hidden;
    border-radius: .2rem;
}

.discern img {
    display: block;
    width: 100%;
    border-radius: inherit;
}

最后,我们只需要按照上述JS攻略来写JS代码,并在windown.onload事件中调用函数,即可实现美团外卖的图片瀑布流布局效果。

示例2: 懒加载

很多网站上的图片都是很大的,为了加快网页的访问速度,通常都需要采用图片懒加载技术。下面我们来说一下如何在图片瀑布流布局中实现图片懒加载。

我们可以使用jQuery的lazyload插件来实现图片的懒加载。该插件的使用很简单,只需要在图片元素上添加data-src属性,并在JS文件中调用lazyload函数,即可实现懒加载。

下面是示例代码:

<div id="main">
    <div class="box">
        <img data-src="image1.jpg"/>
    </div>
    <div class="box">
        <img data-src="image2.jpg"/>
    </div>
    <div class="box">
        <img data-src="image3.jpg"/>
    </div>
    <div class="box">
        <img data-src="image4.jpg"/>
    </div>
    ...
</div>
$(function() {
    $("img").lazyload();
});

在以上示例代码中,我们可以看到每个图片元素上都添加了data-src属性,这是表示图片的真实地址。然后我们在JS文件中调用了lazyload函数,可以自动实现图片的懒加载。

此外,需要注意的是,在使用lazyload函数时,需要事先引入jQuery和lazyload插件。可以使用以下代码:

<head>
    <script src="jquery-3.6.0.min.js"></script>
    <script src="jquery.lazyload.min.js"></script>
</head>

总结

综上所述,实现图片瀑布流布局需要以下几步:

  1. 编写HTML结构,包含图片元素盒子。
  2. 编写CSS样式,包括容器宽度、图片盒子宽度、以及图片样式等。
  3. 编写JS代码,包括计算列数、设置宽度、设置图片位置、以及懒加载等。

相信通过上面的攻略,大家已经能够快速上手实现图片瀑布流布局了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:HTML+CSS+JS实现图片的瀑布流布局的示例代码 - Python技术站

(0)
上一篇 2023年6月9日
下一篇 2023年6月9日

相关文章

  • css样式实现整个页面背景使用一张图片

    当我们需要让整个页面的背景使用一张图片时,可以通过CSS样式来实现,具体步骤如下: 创建一个包含背景图片的CSS样式 将下面的代码复制到样式表中,将”background-image”属性的值改为你想要使用的图片路径。 body { background-image: url(‘path/to/background-image.jpg’); backgrou…

    css 2023年6月9日
    00
  • 使用JS前端技术实现静态图片局部流动效果

    首先,实现静态图片局部流动效果需要使用JavaScript前端技术配合CSS样式来完成功能。主要的步骤如下: 第一步:准备图片素材 首先需要准备需要实现效果的图片素材,最好是比较鲜明的颜色区分明显的照片或图案,例如宣传海报、卡通人物、拼图等。 第二步:将图片处理为相对较小的片段 将图片处理成相对较小片段,可以使用PhotoShop等工具完成这个操作。具体步骤…

    css 2023年6月9日
    00
  • 解决移动端跳转问题(CSS过渡、target伪类)

    解决移动端跳转问题可以通过多种方式实现,其中比较常用的两种方式分别是使用CSS过渡和target伪类。下面将分别进行详细讲解,并提供示例说明。 使用CSS过渡解决移动端跳转问题 原理 CSS过渡是一种能够为元素添加从一种样式到另一种样式的平滑过渡效果的方法。通常情况下,我们使用CSS过渡可以优雅地解决移动端跳转问题。 具体而言,我们需要为需要跳转的元素添加样…

    css 2023年6月10日
    00
  • CSS设计之页面滚动条出现时防止页面跳动的方法

    标题:CSS设计之页面滚动条出现时防止页面跳动的方法 当页面内容过多,超出浏览器可视范围时,会出现滚动条。但是在实际应用中,页面滚动条出现时,页面的布局可能会因为滚动条的出现而发生跳动,影响用户的体验。本文将介绍两种方法,来防止页面出现滚动条时的跳动问题。 方法一:使用vw作为单位 在CSS中使用vw作为单位,将CSS中的所有尺寸都定义为vw,可以确保页面布…

    css 2023年6月10日
    00
  • 深入解析HTML的table表格标签与相关的换行问题

    当我们使用HTML来制作表格时,table标签是必不可少的。在table标签中,我们可以使用tr标签来表示一行,td标签来表示单元格。但是在实际使用中,还存在一些与换行相关的问题。 换行问题的背景 当我们使用HTML来制作表格时,表格中的内容可能会超过单元格的宽度,因此会自动换行。但是,如果我们希望在单元格内手动控制换行,该怎么办呢? 问题的解决 使用br标…

    css 2023年6月9日
    00
  • 详解overflow-scrolling解决滚动卡顿问题

    来详细讲解一下“详解overflow-scrolling解决滚动卡顿问题”的攻略。 什么是 overflow-scrolling? overflow-scrolling是一个CSS属性,它被用于控制元素的滚动方式。它的值是 auto 和 touch。当我们需要滚动一个元素时,overflow-scrolling属性控制该元素是否使用硬件加速来滚动,而不是使用…

    css 2023年6月10日
    00
  • html5+css如何实现中间大两头小的轮播效果

    HTML5+CSS如何实现中间大两头小的轮播效果 在 HTML5+CSS 中,我们可以使用 flexbox 布局和 transform 属性来实现中间大两头小的轮播效果。下面是完整攻略,包含了如何使用这两种方法实现轮播效果的过程和两个示例说明。 方法一:使用 flexbox 布局 我们可以使用 flexbox 布局来实现中间大两头小的轮播效果。例如: &lt…

    css 2023年5月18日
    00
  • 通过seajs实现JavaScript的模块开发及按模块加载

    通过seajs实现JavaScript的模块开发及按模块加载,主要包含以下几个步骤: 引入seajs模块: 在HTML页面中引入seajs模块,可以从官网seajs.org下载。 <script src="seajs/sea.js"></script> 定义模块: // 定义一个模块 define(function…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部