瀑布流布局的两种实现方式:传统多列浮动和绝对定位布局

瀑布流布局常用于图片展示等卡片式布局,实现方式主要有两种:传统多列浮动和绝对定位布局。

传统多列浮动方式

在 HTML 结构中创建多个元素,并为每个元素设置相同的 class,然后使用 CSS 样式进行布局。

HTML 结构示例:

<div class="waterfall">
  <div class="column">
    <img src="image1.jpg">
  </div>
  <div class="column">
    <img src="image2.jpg">
  </div>
  <div class="column">
    <img src="image3.jpg">
  </div>
  <div class="column">
    <img src="image4.jpg">
  </div>
</div>

CSS 样式示例:

.waterfall {
  column-count: 4; // 列数
  column-gap: 10px; // 列间距
}

.column {
  display: inline-block;
  width: 100%; // 或者使用宽度百分比
  margin-bottom: 10px; // 元素间距
}

在上面的示例中,我们使用 column-count 属性指定了列数,使用 column-gap 属性指定了列间距。同时,给每个元素设置了 display: inline-block 属性,让其在一行内显示。

绝对定位布局方式

另一种实现方式是使用绝对定位布局,该方式将所有元素定位在相同的容器内。为了实现瀑布流式布局,我们需要计算每一列的高度,然后将下一个要添加的元素添加到高度最小的一列中。

HTML 结构示例:

<div class="waterfall">
  <div class="card" style="height: 200px;">
    <img src="image1.jpg">
  </div>
  <div class="card" style="height: 280px;">
    <img src="image2.jpg">
  </div>
  <div class="card" style="height: 150px;">
    <img src="image3.jpg">
  </div>
  <div class="card" style="height: 220px;">
    <img src="image4.jpg">
  </div>
</div>

CSS 样式示例:

.waterfall {
  position: relative;
  width: 100%;
}

.card {
  position: absolute;
  width: 25%; // 列宽度
  top: 0;
  left: 0;
  margin: 10px; // 元素间距
  box-sizing: border-box;
}

.card img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

在上面的示例中,我们将容器 .waterfall 设置为相对定位,每个元素 .card 设置为绝对定位,调整其位置和大小,同时给每个元素的图片设置了 object-fit: cover 属性,让图片能够填充容器。

最后,我们需要使用 JS 脚本计算每一列的高度,然后将下一个要添加的元素添加到高度最小的一列中。

示例:

const cards = document.querySelectorAll('.card');
const columns = 4; // 列数
const margin = 10; // 元素间距
const heights = new Array(columns).fill(0);

cards.forEach(card => {
  const minIndex = heights.indexOf(Math.min(...heights)); // 找到高度最小的列
  const top = heights[minIndex];
  const left = (card.offsetWidth + margin) * minIndex;

  card.style.top = `${top}px`;
  card.style.left = `${left}px`;
  heights[minIndex] += card.offsetHeight + margin;
});

上面的 JS 示例中,我们定义了 columnsmargin 变量,分别表示列数和元素间距。然后,我们定义了一个高度数组 heights,初始化为 0。遍历每个元素,找到高度最小的一列,计算元素的上边距和左边距,并设置到元素上。最后,将高度累加到高度数组 heights 中。

通过上述两种方式的介绍,我们可以实现一个瀑布流式的图片墙等卡片式布局,呈现不同的美丽和舒适的交互体验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:瀑布流布局的两种实现方式:传统多列浮动和绝对定位布局 - Python技术站

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

相关文章

  • BootStrap CSS全局样式和表格样式源码解析

    现在我来给你讲解一下“BootStrap CSS全局样式和表格样式源码解析”的完整攻略。 首先,让我们来介绍一下Bootstrap。Bootstrap是Twitter推出的一种前端开发框架,提供了全局CSS样式、JS插件、网格系统等,能够让开发者快速实现Web的开发和设计,极大地提高开发效率。 Bootstrap提供了很多全局CSS样式,我们可以将这些全局C…

    css 2023年6月11日
    00
  • Apache网页的优化、安全与防盗链图文详解

    Apache网页的优化、安全与防盗链图文详解 一、优化 1.启用gzip压缩 启用gzip压缩可以大大减小网页传输的大小,提高网页加载速度。在Apache中可以通过修改.htaccess文件实现: <IfModule mod_deflate.c> # Compress HTML, CSS, JavaScript, Text, XML and fo…

    css 2023年6月9日
    00
  • 清除浮动的几种方法(推荐)

    下面是清除浮动的几种方法,以及推荐使用的方法的详细攻略。 什么是浮动? 浮动是CSS中的一种布局方式,它可以使元素往左或者往右“浮动”,然后其他元素围绕它排列。这种布局方式常常被用来实现多栏布局或者图片浮动等效果。 浮动带来的问题 虽然浮动在布局中具有很大的作用,但它也同样存在一些问题。最常见的问题是父元素无法自适应子元素的高度,以及出现元素重叠等情况。 清…

    css 2023年6月10日
    00
  • CSS 设定文本尺寸的属性

    CSS中有多个属性可以用来设置文本尺寸,包括font-size、line-height、letter-spacing和word-spacing等。本攻略将介绍这些属性的用法和示例。 font-size属性 font-size属性用于设置文本的字号大小。可以使用绝对单位(如px、pt、em等)或相对单位(如%、rem等)来指定字号大小。以下是font-size…

    css 2023年5月18日
    00
  • Vue中使用create-keyframe-animation与动画钩子完成复杂动画

    下面是对于“Vue中使用create-keyframe-animation与动画钩子完成复杂动画”的完整攻略。 一、什么是create-keyframe-animation? create-keyframe-animation 是一个针对动画的库,可以很方便地用于 Vue 项目中。通过使用 create-keyframe-animation,我们可以快速创建…

    css 2023年6月10日
    00
  • 基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享

    下面是关于“基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享”的完整攻略。 简介 该效果可以在网页上实现一个带有3D效果的海报展示区域,即类似于苹果电视背景的风格。展示区域可以响应鼠标或手指触摸的动作,具有视差特效,让用户可以在视觉上感受到立体的效果,增强该区域的互动性。 技术栈 该效果的实现主要采用的技术是jQuery和CSS3。…

    css 2023年6月10日
    00
  • vue实现内容可滚动的弹窗效果

    下面是针对“Vue实现内容可滚动的弹窗效果”的完整攻略。 1. 弹窗样式 首先,我们需要用HTML、CSS实现出弹窗的样式,示例代码如下: <div class="modal"> <div class="modal__body"> <div class="modal__heade…

    css 2023年6月10日
    00
  • CSS中link和@import的区别说明

    CSS中link和@import都是用于导入css文件的语法,但它们之间有很多不同之处。 区别一 link是HTML标签,需要写在head标签中,而@import是CSS语法,需要写在CSS文件中,不能写在HTML文件中。 区别二 link可以通过rel属性指定关系属性,如stylesheet、icon等,而@import没有这个属性,只能导入样式文件。 区…

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