vue移动端瀑布流布局

news2024/10/6 0:36:01

需求:

        瀑布流, 图片大小统一不变, 描述长度根据内容确定, 不超过三行.

        分两列,那边矮,下个元素就放那边

 如图所示:

1. 给item设置top,和left

由于我的项目做了 amfe-flexible适配所以使用rem

完整 template

<template>
  <div class="HomePage">
    <van-list
      :immediate-check="false"
      v-model="loading"
      :finished="finished"
      finished-text="没有更多了"
      @load="onLoad"
    >
      <div class="list_item" ref="list_item" id="item">
        <div
          class="item"
          v-for="(item, index) in list"
          :key="index"
          :style="{
            top: item.top + 'rem',
            left: item.left + 'rem'
          }"
        >
          <div class="show_img">
            <img
              v-if="item.type == 'images'"
              :src="item.image"
              alt="展示图片"
            />
            <img
              v-else-if="item.type == 'video'"
              class=""
              :src="item.videoSrc.poster"
              alt=""
              @click="toVideoPage(index)"
            />
            <div class="is_vide" v-if="item.type == 'video'">
              <span class="iconfont icon-bofang"></span>
            </div>
          </div>
          <div class="item_title">
            {{ item.title }}
          </div>
          <div class="user">
            <div class="user_msg">
              <div class="user_img">
                <img :src="item.touXiang" alt="头像" />
              </div>
              <span>{{ item.userName }}</span>
            </div>
            <div class="count" @click.stop="amountOfConsent(index)">
              <van-icon name="like-o" v-if="item.agreeWithState == 0" />
              <van-icon name="like" color="#FF2442" v-else />
              <span>{{ item.agreeWith | filterAmountOfConsent }}</span>
            </div>
          </div>
        </div>
      </div>
    </van-list>
  </div>
</template>

2. 容器也子元素子绝父相 

这里的item宽度我直接写死了180

3.描述部分,设置最多三行

完整 css

<style lang="less" scoped>
.HomePage {
  background-color: #fafafa;
}

.list_item {
  position: relative;
  .item {
    position: absolute;
    width: 180px;
    border-radius: 5px;
    background-color: #fff;
    overflow: hidden;
    background-color: pink;
    box-sizing: content-box;
    .show_img {
      height: 240px;
      position: relative;
      img {
        width: 100%;
        height: 100%;
      }

      .is_vide {
        position: absolute;
        top: 12px;
        right: 12px;
        width: 20px;
        height: 20px;
        background-color: rgba(0, 0, 0, 0.5);
        border-radius: 15px;
        display: flex;
        align-items: center;
        justify-content: center;

        .iconfont {
          color: #fff;
          font-size: 12px;
          transform: scale(0.7);
        }
      }
    }

    .item_title {
      font-size: 15px;
      margin: 11px 11px 8px 11px;
      line-height: 20px;
      word-break: break-all;
      text-ovelow: -o-ellipsis-lastline;
      overflow: hidden; //溢出内容隐藏
      text-overflow: ellipsis; //文本溢出部分用省略号表示
      display: -webkit-box; //特别显示模式
      -webkit-line-clamp: 3; //行数
      line-clamp: 3;
      -webkit-box-orient: vertical; //盒子中内容竖直排
    }

    .user {
      padding: 0 8px;
      padding-bottom: 12px;
      display: flex;
      align-items: center;
      justify-content: space-between;

      .user_msg {
        display: flex;
        align-items: center;
        .user_img {
          width: 20px;
          height: 20px;
          border-radius: 10px;
          overflow: hidden;

          img {
            width: 100%;
            height: 100%;
            display: block;
          }
        }

        & > span {
          color: #999;
          font-size: 12px;
          margin-left: 6px;
          width: 85px;
          white-space: nowrap; // 强制一行显示
          overflow: hidden; // 超出隐藏
          text-overflow: ellipsis; // 省略号
        }
      }

      .count {
        color: #999;
        font-size: 12px;

        & > span {
          margin-left: 3px;
        }
      }
    }
  }
}
</style>

4, js部分

  data() {
    return {
      list: [],
      loading: false,
      finished: false,
      designDrawing: 37.5, //设计图
      waterfallWidth: 180, // 每个盒子的宽度
      waterfallCol: 2, // 瀑布流的列数
      waterfallLeft: 5, // 每个盒子的右padding
      waterfallBottom: 8, // 每个盒子的下padding
      waterfallDeviationHeight: [], // 存放列的高度
    };
  },

获取数据后调用核心函数

 核心函数讲解

完整 rankItem()

rankItem() {
      //初始化偏移高度数组
      this.waterfallDeviationHeight = new Array(this.waterfallCol);
      for (let i = 0; i < this.waterfallDeviationHeight.length; i++) {
        this.waterfallDeviationHeight[i] = 0;
      }

      let {
        waterfallWidth,
        waterfallLeft,
        waterfallBottom,
        waterfallDeviationHeight,
      } = this;
      for (let index = 0; index < this.list.length; index++) {
        let minIndex = this.filterMin();
        this.list[index].top =
          waterfallDeviationHeight[minIndex] / this.designDrawing;
        this.list[index].left =
          (minIndex == 0
            ? waterfallLeft
            : (minIndex + 1) * waterfallLeft + minIndex * waterfallWidth) /
          this.designDrawing; //

        waterfallDeviationHeight[minIndex] +=
          240 + //图片高度
          12 +
          20 + // 头像的高度
          waterfallBottom + //外边界高度
          /*
          限制描述高度  三行78 两行61
          this.getStringWidth 计算出内容高度 
          */
          (this.getStringWidth(this.list[index].title) > 40 ? 78 : 61);
      }
    },

完整 filterMin()

 filterMin() {
      const min = Math.min.apply(null, this.waterfallDeviationHeight);
      return this.waterfallDeviationHeight.indexOf(min);
    },

完整 getStringWidth()

字体的高宽不等于字节, 所以只能通过offsetHeight获取文字高度

getStringWidth(val) {
      console.log(this.waterfallWidth);
      let divWidth = this.waterfallWidth - 22;

      let div = document.createElement("div");
      div.innerHTML = val;
      div.style.width = divWidth + "px";
      div.style =
        `
        font-size: 15px;
        line-height: 20px;
        overflow: hidden; //溢出内容隐藏
        text-overflow: ellipsis; //文本溢出部分用省略号表示
        display: -webkit-box; //特别显示模式
        -webkit-line-clamp: 3; //行数
        line-clamp: 3;
        -webkit-box-orient: vertical; //盒子中内容竖直排
      `;
      div.setAttribute("class", "fontSize");
      document.getElementsByTagName("body")[0].appendChild(div);
      let fontSizeDiv = document.getElementsByClassName("fontSize")[0];
      let fontSizeDivHeight = fontSizeDiv.offsetHeight;
      document.getElementsByTagName("body")[0].removeChild(fontSizeDiv);

      return fontSizeDivHeight;
    },

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

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

相关文章

【好书精读】网络是怎样连接的 之 全世界 DNS 服务器的大接力

&#xff08;该图由AI制作 学习AI绘图 联系我&#xff09; 目录 域名的层次结构 寻找相应的 DNS 服务器并获取 IP 地址 通过缓存加快 DNS 服务器的响应 DNS 服务器的基本工作就是接收来自客户端的查询消息&#xff0c;然后根据消息的内容返回响应 客户端的查询消息&#xf…

信息量、熵、联合熵、条件熵、相对熵、交叉熵、JS散度、Wasserstein距离

信息量 I ( x i ) l o g 1 P ( x i ) − l o g P ( x i ) I(x_i)log \frac {1}{P(x_i)}-logP(x_i) I(xi​)logP(xi​)1​−logP(xi​) 信息量&#xff08;self-information&#xff09;&#xff0c;又译为信息本体&#xff0c;由克劳德 香农&#xff08;Claude Shannon&…

使用投票回归器VotingRegressor对糖尿病数据集进行回归预测

目录 1. 作者介绍2. 投票回归器VotingRegressor简介2.1 VotingRegressor介绍2.2 VotingRegressor算法遵循以下关键原则&#xff1a; 3. 使用投票回归器VotingRegressor对糖尿病数据集进行回归预测实验过程3.1 代码流程介绍3.2 完整代码3.3 实验结果 1. 作者介绍 余成伟&#x…

【深度学习】YOLOv8训练过程,YOLOv8实战教程,目标检测任务SOTA,关键点回归

文章目录 可用资源资源安装模型训练&#xff08;检测&#xff09;模型pridict模型导出 可用资源 https://github.com/ultralytics/ultralytics 官方教程&#xff1a;https://docs.ultralytics.com/modes/train/ 资源安装 更建议下载代码后使用 下面指令安装&#xff0c;这样…

Hug pylons, not trees 拥抱电网,而非树木 | 经济学人20230408版双语精翻

《经济学人》4月8日周报封面即社论区&#xff08;Leaders&#xff09;精选文章&#xff1a;《拥抱电网&#xff0c;而非树木》&#xff08;Hug pylons, not trees&#xff09;。 Hug pylons, not trees 拥抱电网&#xff0c;而非树木 The case for an environmentalism that bu…

100天精通Golang(基础入门篇)——第9天:Go语言程序的循环语句

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

UWB定位的两种解法

UWB(Ultra-Wideband)技术是一种短脉冲无线电技术(短脉冲意味着信号的带宽很大&#xff0c;因此称为超宽带)&#xff0c;其应用非常广泛&#xff0c;其中之一就是室内定位&#xff0c;通过计算信号传播的时间差&#xff0c;可以得到标签和基站之间的距离,如果有足够多的基站&…

Unity核心1——图片导入与图片设置

一、图片导入概述 ​ Unity 支持的图片格式有很多 BMP&#xff1a;是 Windows 操作系统的标准图像文件格式&#xff0c;特点是几乎不进行压缩&#xff0c;占磁盘空间大 TIF&#xff1a;基本不损失图片信息的图片格式&#xff0c;缺点是体积大 JPG&#xff1a;一般指 JPEG 格…

【Elasticsearch】 之 Translog/FST/FOR/RBM算法

目录 Translog FST/FOR/RBM算法解析 FST FOR&#xff08;Frame of Reference&#xff09;: RBM&#xff08;Roaring Bitmaps&#xff09;-(for filter cache) Translog es是近实时的存储搜索引。近实时&#xff0c;并不能保证被立刻看到。数据被看到的时候数据已经作为一…

工业级以太网RJ45温湿度监控系统解决方案之关键POE供电温湿度传感器

目 录 一、关键词…………………………………………………………………………3 二、 产品概述………………………………………………………………………3 三、 应用范围………………………………………………………………………3 四、 产品特点………………………………

Linux0.11内核源码解析-file_dev.c

目录 功能描述 int file_read(struct m_inode * inode, struct file * filp, char * buf, int count) int file_write(struct m_inode * inode, struct file * filp, char * buf, int count) 功能描述 该文件主要是由两个函数file_read()和file_write()组成&#xff0c;提供…

Nginx网站服务——服务基础

文章目录 一.Nginx服务基础1.关于Nginx的特点2.简述Nginx和Apache的差异3.Nginx 相对于 Apache 的优点4.Apache 相对于 Nginx 的优点5.阻塞与非阻塞6.同步与异步7.nginx的应用场景 二.编译安装nginx服务1.在线安装nginx1.1 yum部署Nginx1.2 扩展源安装完后直接安装Nginx 2.ngin…

MySQL数据库---存储引擎(MyISAM与InnoDB)

目录 前言一、存储引擎概念介绍二、MyISAM三、InnoDB四、配置合适的存储引擎总结 前言 数据库存储引擎是数据库底层软件组织&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧…

Vue中如何进行图像识别与人脸对比

Vue中如何进行图像识别与人脸对比 随着人工智能的发展&#xff0c;图像识别和人脸识别技术已经被广泛应用于各种应用程序中。Vue作为一种流行的前端框架&#xff0c;提供了许多实用工具和库&#xff0c;可以帮助我们在应用程序中进行图像识别和人脸识别。在本文中&#xff0c;…

docker换源(docker镜像源)pull超时(pull镜像超时)/etc/docker/daemon.json

文章目录 pull了n次都超时&#xff0c;也是醉了更换镜像源步骤1. 打开终端并以管理员身份登录到Docker主机。2. 编辑Docker配置文件daemon.json。该文件用于配置Docker守护进程的参数。3. 在daemon.json文件中添加以下内容&#xff0c;将<镜像源地址>替换为您选择的镜像源…

基于matlab仿真具有不同传感器模式的锥形阵列(附源码)

一、前言 此示例说明如何在不同的阵列配置上应用锥形和模型细化。它还演示了如何创建具有不同元素模式的数组。 二、ULA 逐渐变细 本节介绍如何在均匀线性阵列 &#xff08;ULA&#xff09; 的元素上应用泰勒窗口以降低旁瓣电平。 比较锥形阵列和非锥形阵列的响应。请注意锥形U…

外部局域网直接访问WSL2

1. 开启hyper-v 1、首先&#xff0c;进入控制面板—程序—启用或关闭windows功能&#xff0c;勾选hyper-v&#xff0c;确认后重启电脑。2、打开 Windows PowerShell&#xff0c;输入 systeminfo 命令 能够看到出现了很多处理器的信息&#xff0c;最末尾有个 Hyper-V 要求&…

Redis 2023面试5题(一)

一、Redis是单线程还是多线程 在面试中&#xff0c;当被问到Redis是单线程还是多线程这个问题时&#xff0c;可以按照以下思路进行回答&#xff1a; 首先&#xff0c;Redis的核心业务部分是单线程的&#xff0c;即命令处理部分是单线程的。然而&#xff0c;Redis也支持多路复…

Java---第四章(数组基础,冒泡排序,二分查找,多维数组)

Java---第四章 一 数组基本知识数组操作 二 数组实操数组排序二分查找二维数组 一 数组 基本知识 概念&#xff1a; 数组是编程语言中的一种常见的数据结构&#xff0c;能够存储一组相同类型的数据 作用&#xff1a; 存储一组相同类型的数据&#xff0c;方便进行数理统计&am…

springboot3生命周期监听的使用和源码解析

定义SpringApplicationRunListener来监听springApplication的启动 1.通过实现springApplicationRunListener来实现监听。 2.在 META-INF/spring.factories 中配置 org.springframework.boot.SpringApplicationRunListener自己的Listener。 在默认的springboot配置中就有给我…