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

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

相关文章

  • CSS两列布局实现方式总结

    下面我将为您详细讲解“CSS两列布局实现方式总结”的完整攻略。 一、简介 在网站的设计中,布局是一个非常重要的部分。其中,CSS两列布局是较为常见的一种布局方式。CSS两列布局可以将页面的内容分成两个主要部分,一般用于展示页面的主要内容和辅助信息,或者是左右导航菜单等。 二、实现方式总结 针对CSS两列布局,能够使用的实现方式还是比较多的。以下是几种比较常见…

    css 2023年6月10日
    00
  • 利用jQuery实现可输入搜索文字的下拉框

    实现可输入搜索文字的下拉框是前端开发中常见的需求,下面我将分享一份利用jQuery实现该功能的攻略。 步骤一:编写HTML结构 首先,我们需要在HTML中定义一个搜索输入框和一个下拉框,具体的结构如下: <input id="search-input" type="text" placeholder="…

    css 2023年6月10日
    00
  • Bootstrap导航条可点击和鼠标悬停显示下拉菜单

    下面我将详细讲解如何使用Bootstrap实现导航条可点击和鼠标悬停显示下拉菜单。 准备工作 在使用Bootstrap实现导航条下拉菜单功能时,需要先引入Bootstrap的CSS和JS文件。这里我以Bootstrap 4为例,可以在HTML文件的头部加入以下代码: <link rel="stylesheet" href=&quot…

    css 2023年6月10日
    00
  • css 解决表格边框不显示的问题

    对于表格边框不显示的问题,我们可以通过 CSS 来解决。以下是一些解决表格边框不显示问题的方式: 1. 设置 border-collapse 属性 当表格的边框不显示时,我们可以在 table 元素中添加 border-collapse: collapse; 属性来解决此问题。例如: table { border-collapse: collapse; } …

    css 2023年6月10日
    00
  • CSS3径向渐变radial-gradient实现波浪边框和内倒角的方法

    本文将为大家详细讲解“CSS3径向渐变radial-gradient实现波浪边框和内倒角的方法”的完整攻略。 1. 什么是径向渐变? 径向渐变(radial-gradient)是CSS3新增的一种渐变方式,它是从一个圆形、椭圆形或球形的中心开始改变颜色的过渡效果。径向渐变可以用来创建许多不同的特效,例如波浪边框和内倒角。 2. 实现径向渐变波浪边框的方法: …

    css 2023年6月9日
    00
  • C# MVC 微信支付教程系列之公众号支付代码

    下面是对“C# MVC 微信支付教程系列之公众号支付代码”的完整攻略,包括安装微信支付SDK、生成订单、调用微信支付API等步骤。 安装微信支付SDK 在进行微信支付开发之前,需要下载并安装微信支付SDK,推荐使用官方提供的.NET版SDK。在官方网站(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chap…

    css 2023年6月10日
    00
  • 使用CSS实现盒子水平垂直居中的方法(8种)

    当我们需要将一个盒子水平垂直居中时,可以使用CSS来实现。下面介绍8种常用的方法,详细攻略如下: 1. 使用flex布局 通过CSS中的display: flex可以实现盒子的水平垂直居中。 .container { display: flex; justify-content: center; align-items: center; } 示例代码: &l…

    css 2023年6月10日
    00
  • 在Layui中实现开关按钮的效果实例

    我们先来了解一下Layui是什么。 什么是Layui Layui(类库名字称呼为layui)是一个模块化前端UI框架,适合于大型复杂的Web应用程序。它是由一群热爱Web前端的朋友们所创建的,遵循“基于模块化组织,松耦合,高可维护”的设计原则。 既然了解了Layui,我们就可以通过Layui来实现开关按钮的效果了。 实现步骤 首先,我们需要先引入Layui的…

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