瀑布流的实现方式(原生js+jquery+css3)

yizhihongxing

瀑布流是一种常见的页面布局方式,它会随着内容的不断加载,自动填充页面的空白区域,达到良好的视觉效果和用户体验。下面我来详细介绍一下瀑布流的实现方式(原生JS + jQuery + CSS3)。

HTML 结构

首先要有一个类似于如下的 HTML 结构:

<div class="waterfall">
  <div class="item">
    <img src="image1.jpg"/>
    <div class="description">some text here</div>
  </div>
  <div class="item">
    <img src="image2.jpg"/>
    <div class="description">some text here</div>
  </div>
  ...
</div>

其中包含一个父容器 .waterfall,它的宽度应该为固定值。每个子项 .item 包含一张图片和图片上方一段文字说明的 .description。正如此处所说, .item 的宽度也应该为固定值。

CSS 样式

再次给出 HTML 结构,我们需要为它添加 CSS 样式。首先,我们需要设置父容器 .waterfall 的样式:

.waterfall {
  column-count: 3;
  column-gap: 15px;
  margin: 15px 0;
  width: 1170px;
}

这里提到了 CSS3 的 column-count,可以将一个元素分割成多个列,同时将子元素列在一起填充每列。column-gap 则是列之间的间距,可以自定义。

接下来就是为 .item 的图片和文字内容设置样式:

.item {
  width: 350px;
  margin-bottom: 20px;
  display: inline-block;
  background-color: #fff;
  box-sizing: border-box;
  border-radius: 6px;
  overflow: hidden;
  box-shadow: 0 3px 8px rgba(0,0,0,0.16);
  -webkit-transition: all .3s ease-out;
  transition: all .3s ease-out;
}

.item img {
  width: 100%;
  display: block;
  vertical-align: top;
  border-radius: 6px 6px 0 0;
}

.description {
  padding: 20px;
  font-size: 14px;
  color: #666;
  text-align: center;
  max-height: 80px;
  overflow: hidden;
  margin-top: -1px;
  position: relative;
}

这里的样式包含了一些比较常规的设置,比如给 .item.description 设置了背景色、圆角和阴影等。

JS 实现

有了基本的 HTML 结构和 CSS 样式,接下来就需要使用 JS 实现瀑布流的效果。

首先需要获取 .waterfall 的宽度,然后根据每个 .item 的宽度和间距,计算出实际的列数。比如,我们可以这样实现:

var waterfall = document.querySelector('.waterfall');
var items = document.querySelectorAll('.item');

var waterfallWidth = waterfall.offsetWidth;
var itemWidth = items[0].offsetWidth;
var columnNum = parseInt(waterfallWidth / (itemWidth + 15));

这里使用了 offsetWidth 来获取元素的实际宽度,parseInt() 将计算出的列数转为整数。需要注意的是,间距的值 15 需要与 CSS 样式中的 column-gap 一致。

然后,需要定义一个数组用来存储每一列的高度,初始值都设置为 0:

var columnHeights = new Array(columnNum).fill(0);

接下来就可以开始为每个 .item 设置位置了。由于要达到瀑布流的效果,需要先找到当前列中最短的高度,然后将当前 .item 放在相应的位置上,最后更新当前列的高度。这个操作可以使用以下代码实现:

for (var i = 0; i < items.length; i++) {
  var item = items[i];
  var itemHeight = item.offsetHeight;
  var minHeight = Math.min.apply(null, columnHeights);
  var minIndex = columnHeights.indexOf(minHeight);
  item.style.left = (itemWidth + 15) * minIndex + 'px';
  item.style.top = minHeight + 'px';
  columnHeights[minIndex] += itemHeight + 20;
}

其中,offsetHeight 用来获取元素的高度,Math.min.apply(null, columnHeights) 找到了当前列中最短的高度值,indexOf() 找到了这个最短值的索引。

最后,为了让页面能够实现自动加载,需要监听滚动事件,在滚到页面底部时触发加载事件。比如:

window.addEventListener('scroll', function () {
  var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
  var viewPortHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
  var bottomHeight = 100;
  var pageHeight = document.documentElement.scrollHeight || document.body.scrollHeight;
  if (scrollTop + viewPortHeight >= pageHeight - bottomHeight) {
    // 加载新内容
  }
});

这里的 scrollTopviewPortHeightbottomHeightpageHeight 都是计算滚动条位置、窗口高度和页面高度的常用方法。在滚动条滑到底部处时,可以对服务器发出请求,获取新的数据并在页面上渲染。

示例说明

以下是两个示例说明,演示了瀑布流的实现和自动加载的效果。

示例一

一个使用原生 JS 实现瀑布流布局的示例,请参考这里。这个示例使用了前面介绍的方法,通过 JS 计算每一列的高度值,并将后面的图片等元素设置在高度最小的列上。同时,添加了滚动事件监听,当用户滚动到底部时加载新的内容。

示例二

一个使用 jQuery 和无限滚动插件(Infinite Scroll)实现的瀑布流布局的示例,请参考这里。使用无限滚动插件可以实现用户下拉时自动加载新内容的效果,不需要手动监听滚动事件。同时,将操作封装在插件中,大大减少了代码量。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:瀑布流的实现方式(原生js+jquery+css3) - Python技术站

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

相关文章

  • 浏览器渲染文本过程分析

    浏览器渲染文本过程分析 在浏览器中,文本渲染是网页渲染的一个重要部分,本文将详细介绍浏览器渲染文本的过程。 文本渲染过程 文本解析 浏览器会将HTML和CSS文本进行解析,找出所有的文本内容,并为这些内容建立相应的文本节点,同时确定文本的样式。 字体处理 确定文本的样式之后,浏览器会根据这些样式来选择合适的字体进行渲染。如果该字体没有下载,浏览器会从服务器端…

    css 2023年6月10日
    00
  • CSS3教程:边框属性border的极致应用

    让我详细为您讲解“CSS3教程:边框属性border的极致应用”的完整攻略。 简介 CSS3边框属性border是一个常用的样式属性,在网站设计中广泛应用。本篇教程将介绍一些边框属性的高级应用,帮助您更好地掌握这一属性的使用。 基本属性 边框属性border有三个基本属性:border-width、border-color和border-style。其中,b…

    css 2023年6月10日
    00
  • 兼做美工之导航条制作过程分享

    以下是兼做美工之导航条制作过程分享的完整攻略: 第一步:确定导航条的设计和功能 在制作导航条之前,首先需要明确导航条的设计和功能,包括导航条的样式、布局、字体、颜色、功能等。可以根据网站的整体设计和需求来确定导航条的设计和功能,确保其与网站整体风格一致,并且能够满足用户需求。 第二步:编写HTML和CSS代码 在确定导航条的设计和功能之后,可以开始编写HTM…

    css 2023年6月9日
    00
  • JavaScript实现选项卡效果的分析及步骤

    JavaScript实现选项卡效果的分析及步骤需要涉及以下几个方面: HTML代码结构的设计 CSS的样式设置 JavaScript的操作逻辑 接下来我们来逐一分析: HTML代码结构的设计 在进行选项卡效果实现之前,我们需要事先设计好HTML的整体结构。一般来说,选项卡组成需要一个选项卡标题部分和一个选项卡内容部分,可以采用div+ul的组合方式,如下所示…

    css 2023年6月10日
    00
  • jQuery 打造动态渐变按钮 详细图文教程

    jQuery打造动态渐变按钮详细图文教程 简介 本教程将带您详细了解如何使用jQuery和CSS打造一个动态渐变按钮。该按钮拥有鼠标悬停、点击等交互效果,并且可以自定义按钮的颜色和渐变方式。 准备工作 在开始之前,请确保您已经了解了以下知识: HTML / CSS 基础 JavaScript / jQuery 基础 了解如何使用CSS3渐变 HTML结构 首…

    css 2023年6月9日
    00
  • html+css+js实现别踩白板小游戏

    下面是“HTML+CSS+JS实现别踩白板小游戏”的完整攻略: 一、游戏介绍 “别踩白板”是一款非常流行的益智小游戏,通过点击黑色方块,随着时间的推移,地图会逐渐向下移动,游戏难度也会逐渐增加。但是,如果玩家点击到了白色方块,则游戏失败。本文将介绍如何使用HTML、CSS和JavaScript实现这款小游戏。 二、页面布局 2.1 创建HTML布局 首先,我…

    css 2023年6月10日
    00
  • JS实现图片局部放大或缩小的方法

    当我们需要展示一张图片,常常需要提供局部放大或缩小的功能,以便用户能够更好地查看细节。下面是实现JavaScript图片局部放大或缩小的方法: 实现方法 实现图片局部放大或缩小的方法有多种,以下是两种示例: 示例1:鼠标悬停局部放大 首先需要在HTML中定义一个图片元素,并设置一个容器元素将其包裹起来。 接下来,我们需要通过JavaScript获取图片和容器…

    css 2023年6月10日
    00
  • animation和transition的区别

    当我们在进行页面设计时,常常需要添加动画效果来提高页面视觉体验,其中比较常用的就是animation和transition两种CSS属性。虽然它们都可以实现动画效果,但它们之间也有很大的不同,下面将详细讲解它们的区别。 1. transition的含义 transition是CSS3中的属性,它可以在一段时间内平滑地过渡或变化元素的某些属性值。它的作用是从一…

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