瀑布流的实现方式(原生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日

相关文章

  • 使用CSS3的appearance属性改变任何元素的浏览器默认风格

    使用CSS3的appearance属性可以改变任何元素的浏览器默认风格。这个属性可以用来修改一些标准控件的样式,或者改变一些HTML元素的默认外观,从而打造独特的用户体验。 修改标准控件的样式 如果想要修改标准控件的样式,可以使用appearance属性。下面以修改按钮的样式为例: button { appearance: none; background-…

    css 2023年6月10日
    00
  • 使用display:none时隐藏DOM元素无法获取实际宽高的解决方法

    当使用display:none隐藏DOM元素时,无法获取元素的实际宽高。这对于一些需要对元素进行计算和布局的情况非常不方便。在这里,我将分享使用visibility:hidden替代display:none、使用querySelector获取隐藏元素的方法和使用clientWidth和clientHeight获取隐藏元素实际宽高的方法。 使用visibili…

    css 2023年6月10日
    00
  • 使用CSS3配合IE滤镜实现渐变和投影的效果

    使用CSS3来实现渐变和投影的效果相对于使用传统的背景图片或者JS实现更加高效、简洁。但是由于IE浏览器的兼容性问题,我们需要使用IE滤镜来实现这些特效。 以下是实现渐变效果的完整攻略: 首先,我们需要用CSS3属性来实现渐变效果。下面是一个简单的渐变代码示例: background: linear-gradient(to right, #987cb9, #…

    css 2023年6月13日
    00
  • 手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)

    以下是手写兼容各种浏览器获取元素样式的JavaScript getStyle 函数的攻略,希望对您有用。 1. 函数定义 首先需要定义函数名称和参数,如下: function getStyle(obj,attr){ //函数体 } 其中 obj 是需要获取样式的元素节点对象;attr 是需要获取的样式属性名称。 2. 获取样式 由于在IE浏览器中,obj.s…

    css 2023年6月11日
    00
  • 举例详解CSS3中的Transition

    下面我将根据您的需求,为您详细讲解“举例详解CSS3中的Transition ”的完整攻略。 一、什么是CSS3中的Transition Transition是CSS3中新增的一个属性,用于实现CSS动画效果,可以控制HTML元素从一种样式逐渐转变为另一种样式的过程。 二、Transition的语法 以下是Transition的语法: transition:…

    css 2023年6月10日
    00
  • newasp中main类

    下面是详细的讲解“newasp中main类”的攻略。 什么是 newasp 中的 main 类? main 类是 newasp 框架中的一个核心类。当我们在 newasp 框架中编写一个应用程序时,会去定义一个 main 类,并在该类中实现一个名为 main 的方法。这个方法是应用程序的入口,框架会直接调用该方法。 在该方法内部,我们可以编写应用程序的业务逻…

    css 2023年6月10日
    00
  • jQuery 1.9.1源码分析系列(十三)之位置大小操作

    本文将分享jQuery 1.9.1版本的位置大小操作的相关内容,包括尺寸与位置处理以及相关API的使用方法。 获取尺寸与位置 获取尺寸 使用如下API获取元素尺寸: var width = $(selector).width(); //获取元素宽度 var height = $(selector).height(); //获取元素高度 var innerWi…

    css 2023年6月10日
    00
  • 基于jquery的动画效果代码

    下面我将为您详细讲解如何基于jQuery实现动画效果。 首先,我们需要了解jQuery的动画方法,常见的包括animate()和fade***()系列方法。接下来我将以animate()方法为例,来阐述如何实现动画效果。 animate()方法 animate()方法是jQuery中用于实现动画效果的方法,其语法如下: $(selector).animate…

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