CSS例子 > 图片瀑布流布局(vue2)

news2025/4/22 19:09:06

在这里插入图片描述

<template>
  <div class="container">
    <!-- 临时容器用于计算高度 -->
    <div v-if="!isLayoutReady" class="temp-container">
      <div
        v-for="(item, index) in list"
        :key="'temp-' + index"
        :ref="(el) => (tempElements[index] = el)"
        class="item"
      >
        <img :src="item.url" alt="" @load="handleImageLoad" />
        <!-- 其他内容结构需与正式渲染一致 -->
      </div>
    </div>

    <!-- 正式渲染内容 -->
    <template v-else>
      <div class="column">
        <div
          v-for="(item, index) in leftList"
          :key="'left-' + index"
          class="item"
        >
          <img :src="item.url" alt="" />
          <div class="demo-title">{{ item.title }}</div>
          <div class="demo-times">{{ item.descript }}</div>
          <div class="demo-tag">
            <div class="demo-tag-owner">{{ item.tag[0] }}</div>
            <div class="demo-tag-text">{{ item.tag[1] }}</div>
          </div>
          <div v-if="item.isDot" class="isDot">{{ item.isDot }}</div>
        </div>
      </div>
      <div class="column">
        <div
          v-for="(item, index) in rightList"
          :key="'right-' + index"
          class="item"
        >
          <img :src="item.url" alt="" />
          <div class="demo-title">{{ item.title }}</div>
          <div class="demo-times">{{ item.descript }}</div>
          <div class="demo-tag">
            <div class="demo-tag-owner">{{ item.tag[0] }}</div>
            <div class="demo-tag-text">{{ item.tag[1] }}</div>
          </div>
          <div v-if="item.isDot" class="isDot">{{ item.isDot }}</div>
        </div>
      </div>
    </template>
  </div>
</template>
<script>
export default {
  data() {
    return {
      list: [
        {
          url: "https://img0.baidu.com/it/u=4227008132,2843866888&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=1084",
          title: "清新世界",
          descript: "一年之计在于春",
          tag: ["阳光", "活力四射"],
          isDot: "推荐",
        },
        {
          url: "http://img2.baidu.com/it/u=3364932024,431806429&fm=253&app=138&f=JPEG?w=800&h=1422",
          title: "雪国列车",
          descript: "雪花纷纷极具寒冷",
          tag: ["冰冻", "别具一格"],
          isDot: "推荐",
        },
        {
          url: "https://img0.baidu.com/it/u=600722015,3838115472&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=750",
          title: "漂亮的小鸟",
          descript: "麻雀安知鸿鹄之志",
          tag: ["等待", "翘首以盼"],
          isDot: "",
        },
        {
          url: "https://img0.baidu.com/it/u=4227008132,2843866888&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=1084",
          title: "清新世界",
          descript: "一年之计在于春",
          tag: ["阳光", "活力四射"],
          isDot: "推荐",
        },
        {
          url: "http://img2.baidu.com/it/u=3364932024,431806429&fm=253&app=138&f=JPEG?w=800&h=1422",
          title: "雪国列车",
          descript: "雪花纷纷极具寒冷",
          tag: ["冰冻", "别具一格"],
          isDot: "推荐",
        },
      ],
      leftList: [],
      rightList: [],
      tempElements: [],
      loadedImages: 0,
      isLayoutReady: false,
    }
  },
  mounted() {
    this.preloadImages()
  },
  methods: {
    // 图片预加载
    preloadImages() {
      this.list.forEach((item) => {
        const img = new Image()
        img.src = item.url
      })
    },

    // 图片加载完成处理
    handleImageLoad() {
      this.loadedImages++
      if (this.loadedImages === this.list.length) {
        this.calculateLayout()
      }
    },

    // 计算瀑布流布局
    calculateLayout() {
      this.$nextTick(() => {
        const itemHeights = this.tempElements.map((el) => el.clientHeight)
        let leftHeight = 0
        let rightHeight = 0

        this.list.forEach((item, index) => {
          if (leftHeight <= rightHeight) {
            this.leftList.push(item)
            leftHeight += itemHeights[index]
          } else {
            this.rightList.push(item)
            rightHeight += itemHeights[index]
          }
        })

        this.isLayoutReady = true
      })
    },
  },
}
</script>
<style scoped>
.container {
  display: flex;
  gap: 20px;
  max-width: 400px; /* 调节卡片宽度 */
  margin: 0 auto;
  padding: 20px;
}

.column {
  flex: 1;
  display: flex;
  flex-direction: column;
  gap: 20px;
}

.item {
  position: relative;
  background: white;
  border-radius: 8px;
  padding: 15px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}

.item img {
  width: 100%;
  /* height: auto;   */ /* 调节图片高度: 高度自适应,由图片自身决定,展示更具个性 */
  height: 68%;
  border-radius: 4px;
  margin-bottom: 12px;
}

.demo-title {
  font-size: 18px;
  font-weight: 600;
  margin-bottom: 8px;
  color: #333;
}

.demo-times {
  font-size: 14px;
  color: #666;
  margin-bottom: 12px;
}

.demo-tag {
  display: flex;
  gap: 10px;
}

.demo-tag-owner,
.demo-tag-text {
  padding: 4px 12px;
  border-radius: 20px;
  font-size: 12px;
}

.demo-tag-owner {
  background: #fff0e6;
  color: #ff6600;
  border: 1px solid #ffd8c2;
}

.demo-tag-text {
  background: #e6f7ff;
  color: #1890ff;
  border: 1px solid #b3e0ff;
}

.isDot {
  position: absolute;
  top: 15px;
  right: 15px;
  background: #ff4d4f;
  color: white;
  padding: 4px 10px;
  border-radius: 4px;
  font-size: 12px;
}

.temp-container {
  position: absolute;
  visibility: hidden;
  z-index: -1;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.2软考系统架构设计师:系统架构的定义与作用 - 练习题附答案及超详细解析

系统架构定义与作用综合知识单选题 题目覆盖核心概念、发展历程、设计原则、评估标准及易混淆点&#xff0c;附答案解析&#xff1a; 1. 系统架构的标准定义源自于以下哪个标准&#xff1f; A. ISO/IEC 9126 B. IEEE 1471-2000 C. TOGAF 9.2 D. ITIL v4 答案&#xff1a;B 简…

关于springmvc的404问题的一种猜测解决方案

本文是记录关于在学习动力结点老杜的springmvc时候遇到的404报错的一种解决方式&#xff1b; 由于本人之前学过老杜的springmvc&#xff0c;且运行成功&#xff0c;当时使用的是tomcat10.1.19版本。 idea使用2023.3.2版本。 而这次进行回顾的时候&#xff0c;使用tomcat10.0.1…

使用Postman调测“获取IAM用户Token”接口实际操作

概述 Postman是网页调试与辅助接口调用的工具&#xff0c;具有界面简洁清晰、操作方便快捷的特性&#xff0c;可以处理用户发送的HTTP请求&#xff0c;例如&#xff1a;GET&#xff0c;PUT、POST&#xff0c;DELETE等&#xff0c;支持用户修改HTTP请求中的参数并返回响应数据。…

如何测试雷达与相机是否时间同步?

在多传感器融合系统中&#xff0c;相机与雷达的协同感知已成为环境理解的关键。相机通过捕捉纹理信息识别物体类别&#xff0c;而雷达利用激光或毫米波实现全天候精确测距。两者的数据融合既能避免单一传感器缺陷&#xff08;如相机受光照影响、雷达缺乏语义信息&#xff09;&a…

爆肝整理!Stable Diffusion的完全使用手册(二)

继续介绍Stable Diffusion的文生图界面功能。 往期文章详见: 爆肝整理&#xff01;Stable Diffusion的完全使用手册&#xff08;一&#xff09; 下面接着对SD的文生图界面的进行详细的介绍。本期介绍文生图界面的截图2&#xff0c;主要包含生成模块下的采用方法、调度类型、迭…

OpenCV day5

函数内容接上文&#xff1a;OpenCV day4-CSDN博客 目录 9.cv2.adaptiveThreshold(): 10.cv2.split()&#xff1a; 11.cv2.merge()&#xff1a; 12.cv2.add()&#xff1a; 13.cv2.subtract()&#xff1a; 14.cv2.multiply()&#xff1a; 15.cv2.divide()&#xff1a; 1…

基于Spring Boot+微信小程序的智慧农蔬微团购平台-项目分享

基于Spring Boot微信小程序的智慧农蔬微团购平台-项目分享 项目介绍项目摘要目录系统功能图管理员E-R图用户E-R图项目预览登录页面商品管理统计分析用户地址添加 最后 项目介绍 使用者&#xff1a;管理员、用户 开发技术&#xff1a;MySQLSpringBoot微信小程序 项目摘要 随着…

WPF的发展历程

文章目录 WPF的发展历程引言起源与背景&#xff08;2001-2006&#xff09;从Avalon到WPF设计目标与创新理念 WPF核心技术特点与架构基础架构与渲染模型关键技术特点MVVM架构模式 WPF在现代Windows开发中的地位与前景当前市场定位与其他微软UI技术的关系未来发展前景 社区贡献与…

Franka机器人ROS 2来袭:解锁机器人多元应用新可能

前言&#xff1a; 在机器人技术蓬勃发展的当下&#xff0c;每一次创新都可能为行业带来新的变革。2025年3月12日&#xff0c;Franka Robotics发布的Franka ROS 2软件包首次版本0.1.0&#xff0c;将著名的franka_ros软件包引入当前的ROS 2 LTS Humble Hawksbill&#xff0c;这一…

树莓派5+Vosk+python实现语音识别

简介 Vosk是语音识别开源框架&#xff0c;支持二十种语言 - 中文&#xff0c;英语&#xff0c;印度英语&#xff0c;德语&#xff0c;法语&#xff0c;西班牙语&#xff0c;葡萄牙语&#xff0c;俄语&#xff0c;土耳其语&#xff0c;越南语&#xff0c;意大利语&#xff0c;荷…

数据结构——顺序表(C语言实现)

1.顺序表的概述 1.1 顺序表的概念及结构 在了解顺序表之前&#xff0c;我们要先知道线性表的概念&#xff0c;线性表&#xff0c;顾名思义&#xff0c;就是一个线性的且具有n个相同类型的数据元素的有限序列&#xff0c;常见的线性表有顺序表、链表、栈、队列、字符串等等。线…

STP原理与配置以及广播风暴实验STP实验

学习目标 环路引起的问题 掌握STP的工作原理 掌握STP的基本配置 STP的配置 环路引起的问题 一、广播风暴&#xff08;Broadcast Storm&#xff09; 问题原理&#xff1a; 交换机对广播帧&#xff08;如 ARP 请求、DHCP 发现报文&#xff09;的处理方式是洪泛&#xff0…

网络不可达network unreachable问题解决过程

问题&#xff1a;访问一个环境中的路由器172.16.1.1&#xff0c;发现ssh无法访问&#xff0c;ping发现回网络不可达 C:\Windows\System32>ping 172.16.1.1 正在 Ping 172.16.1.1 具有 32 字节的数据: 来自 172.16.81.1 的回复: 无法访问目标网。 来自 172.16.81.1 的回复:…

力扣经典拓扑排序

207. 课程表&#xff08;Course Schedule&#xff09; 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表…

【第16届蓝桥杯C++C组】--- 2025

hello呀&#xff0c;小伙伴们&#xff0c;这是第16届蓝桥杯第二道填空题&#xff0c;和第一道填空题一样也是十分基础的题目&#xff0c;有C语言基础基本都可以解&#xff0c;下面我讲讲我当时自己的思路和想法&#xff0c;如果你们有更优化的代码和思路&#xff0c;也可以分享…

前端基础之《Vue(7)—生命周期》

一、什么是生命周期 1、生命周期 组件从“生”到“死”的全过程。 每一个组件都有生命周期。 2、生命周期四大阶段 创建阶段&#xff1a;beforeCreate、created 挂载阶段&#xff1a;beforeMount、mounted 更新阶段&#xff1a;beforeUpdate、updated 销毁阶段&#xff1a;be…

C语言高频面试题——指针数组和数组指针

指针数组和数组指针是 C/C 中容易混淆的两个概念&#xff0c;以下是详细对比&#xff1a; 1. 指针数组&#xff08;Array of Pointers&#xff09; 定义&#xff1a;一个数组&#xff0c;其元素是 指针类型。语法&#xff1a;type* arr[元素个数]; 例如&#xff1a;int* ptr_a…

Linux服务器配置Anaconda环境、Pytorch库(图文并茂的教程)

引言&#xff1a;为了方便后续新进组的 师弟/师妹 使用课题组的服务器&#xff0c;特此编文&#xff08;ps&#xff1a;我导从教至今四年&#xff0c;还未招师妹&#xff09; ✅ NLP 研 2 选手的学习笔记 笔者简介&#xff1a;Wang Linyong&#xff0c;NPU&#xff0c;2023级&a…

Android端使用无障碍服务实现远程、自动刷短视频

最近在做一个基于无障碍自动刷短视频的APP&#xff0c;需要支持用任意蓝牙遥控器远程控制&#xff0c; 把无障碍服务流程大致研究了一下&#xff0c;从下面3个部分做一下小结。 1、需要可调整自动上滑距离和速度以适配不同的屏幕和应用 智能适配99%机型&#xff0c;滑动参数可…

搭建用友U9Cloud ERP及UAP IDE环境

应用环境 Microsoft Windows 10.0.19045.5487 x64 专业工作站版 22H2Internet Information Services - 10.0.19041.4522Microsoft SQL Server 2019 - 15.0.2130.3 (X64)Microsoft SQL Server Reporing Services 2019 - 15.0.9218.715SQL Server Management Studio -18.6 laster…