uni-app 瀑布流布局的实现

news2024/11/23 0:21:53

方式一:使用纯 CSS 实现

使用 flex 布局方式

<!-- 瀑布流布局 -->
<template>
  <view class="container">
    <view
      class="cont-box"
      :style="{ '--layout-width': 100 / flowData.column - flowData.columnSpace + '%' }"
      v-for="(numVal, index) in flowData.column"
      :key="numVal"
    >
      <view class="item-box" v-for="(item, j) in flowData[`column_${index + 1}`]" :key="j">
        <image class="img-tip" :src="item.imgUrl" mode="widthFix" lazy-load />
        <view class="tit-tip multi-line-omit">{{ item.title }}</view>
        <view class="desc-tip multi-line-omit">{{ item.desc }}</view>
      </view>
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      flowData: {
        list: [], // 数据值
        column: 2, // 瀑布列数
        columnSpace: 2 // 瀑布列宽间距
      }
    };
  },
  created() {
    /* 初始化每一列的数据 */
    for (let i = 1; i <= this.flowData.column; i++) {
      this.$set(this.flowData, `column_${i}`, []);
    }
  },
  onLoad() {
    /* 数据赋值 */
    this.flowData.list = [
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679045108_thumb.jpg",
        title: "自动驾驶汽车对交通和城市规划的未来影响与挑战",
        desc: "分析自动驾驶汽车对未来交通和城市规划的潜在影响,探讨相关挑战。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044581_thumb.jpg",
        title: "可持续城市发展:构建环保城市的策略和实践",
        desc: "分析建设可持续城市的战略和实际方法,强调环保、资源利用和城市规划的重要性。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679045190_thumb.jpg",
        title: "消灭传染病:全球卫生领域的挑战与创新",
        desc: "探讨在全球范围内消灭传染病的挑战,突出卫生领域的创新方法。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044667_thumb.jpg",
        title: "人工智能与机器学习:颠覆性技术对未来的巨大影响",
        desc: "探讨人工智能和机器学习如何在多个领域引发革命性变革,从工业到医疗,对未来产生深远影响。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044562_thumb.jpg",
        title: "生命科学的新前沿:基因编辑和生物技术的伦理挑战",
        desc: "研究生命科学领域的最新发展,聚焦基因编辑和生物技术的伦理考量,探讨科技前沿的道德挑战。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679045057_thumb.jpg",
        title: "加密货币与区块链:重塑全球金融体系的力量",
        desc: "解析加密货币和区块链技术对金融体系的颠覆作用,重新定义了全球金融交易方式。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044716_thumb.jpg",
        title: "量子计算与量子技术应用的前沿探索",
        desc: "深入研究量子计算和量子技术的前沿,展示这一领域的创新及其应用前景。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044779_thumb.jpg",
        title: "气候变化缓解的复杂性:全球视角下的挑战与机遇",
        desc: "探讨应对气候变化的复杂性,强调全球合作,突出应对挑战所蕴含的机遇。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044956_thumb.jpg",
        title: "虚拟现实与医疗保健的交汇:革命性地改变患者护理",
        desc: "介绍虚拟现实技术如何在医疗领域革命性地改善患者护理和治疗方法。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044607_thumb.jpg",
        title: "生物工程的突破:改变医学和人类增强的科技",
        desc: "研究生物工程领域的创新,关注其在医学和人类增强领域的重要作用。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679045083_thumb.jpg",
        title: "社交媒体的演进及其对沟通和社会的影响",
        desc: "追溯社交媒体的发展历程,探讨其对人际沟通和社会动态的广泛影响。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044643_thumb.jpg",
        title: "元宇宙时代:在工作、教育和娱乐的虚拟世界中导航",
        desc: "介绍元宇宙时代,强调虚拟世界在工作、教育和娱乐中的多样应用。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044936_thumb.jpg",
        title: "通用人工智能:人类是否准备好面对超智能机器?",
        desc: "研究通用人工智能的发展,引发思考人类面对超级智能机器的准备程度。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679045159_thumb.jpg",
        title: "超越火星:人类太空探索和星际旅行的未来",
        desc: "展望人类在太空探索领域的未来,探讨星际旅行的潜力和挑战。"
      }
    ];
    this.$nextTick(() => {
      this.initData(); // 数据初始化
    });
  },
  methods: {
    /* 数据初始化 */
    initData() {
      const groupList = this.dynamicGrouping(this.flowData.list, this.flowData.column); // 数据动态分组
      groupList.forEach((item, i) => (this.flowData[`column_${i + 1}`] = item));
    },
    /** 数据动态分组
     * @param {Object} data 分组的数据列表
     * @param {Object} i 需要分几组
     * @returns {Array} groups 已分组的数据
     */
    dynamicGrouping(data, i) {
      if (i <= 0) return "分组数必须大于0";
      const groups = [];
      for (let j = 0; j < i; j++) {
        groups.push([]);
      }
      for (let k = 0; k < data.length; k++) {
        const groupIndex = k % i;
        groups[groupIndex].push(data[k]);
      }
      return groups;
    }
  }
};
</script>

<style lang="scss" scoped>
.container {
  display: flex;
  justify-content: space-between;
  padding: 20rpx;
  $borderRadius: 12rpx;
  .cont-box {
    width: var(--layout-width);
    .item-box {
      width: 100%;
      padding-bottom: 20rpx;
      margin-bottom: 30rpx;
      border-radius: $borderRadius;
      box-shadow: 0rpx 3rpx 6rpx rgba(0, 46, 37, 0.08);
      .img-tip {
        width: 100%;
        border-radius: $borderRadius $borderRadius 0 0;
      }
      .tit-tip {
        text-align: justify;
        font-size: 30rpx;
        padding: 10rpx 20rpx 0;
        font-weight: 900;
      }
      .desc-tip {
        text-align: justify;
        font-size: 26rpx;
        padding: 5rpx 20rpx 0;
        margin-top: 10rpx;
      }
    }
  }
}
/* 多行省略 */
.multi-line-omit {
  word-break: break-all; // 允许单词内自动换行,如果一个单词很长的话
  text-overflow: ellipsis; // 溢出用省略号显示
  overflow: hidden; // 超出的文本隐藏
  display: -webkit-box; // 作为弹性伸缩盒子模型显示
  -webkit-line-clamp: 2; // 显示的行
  -webkit-box-orient: vertical; // 设置伸缩盒子的子元素排列方式--从上到下垂直排列
}
/* 单行省略 */
.one-line-omit {
  width: 100%; // 宽度100%:1vw等于视口宽度的1%;1vh等于视口高度的1%
  white-space: nowrap; // 溢出不换行
  overflow: hidden; // 超出的文本隐藏
  text-overflow: ellipsis; // 溢出用省略号显示
}
</style>

方式二:借助于 JavaScript 实现

获取每一列的高度,每次图片加载时,把该图片加载到列高度最短的那一列进行实现。

注意:这个是通过图片初始化实现的,所以服务器端的数据必须含有图片。

vue2 版本

<!-- 瀑布流布局 -->
<template>
  <view class="container">
    <view
      :id="`cont_${index + 1}`"
      class="cont-box"
      :style="{ width: widthCalc, 'margin-left': index === 0 ? 0 : marginCalc }"
      v-for="(numVal, index) in flowData.column"
      :key="numVal"
    >
      <view class="item-box" v-for="(item, j) in flowData[`column_${index + 1}`]" :key="j">
        <image class="img-tip" :src="item.imgUrl" mode="widthFix" lazy-load :data-item="item" @load="imgLoad" @error="imgError" />
        <view class="tit-tip multi-line-omit">{{ item.title }}</view>
        <view class="desc-tip multi-line-omit">{{ item.desc }}</view>
      </view>
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      flowData: {
        list: [], // 数据值
        column: 2, // 瀑布列数
        columnSpace: 2 // 瀑布列宽间距
      }
    };
  },
  created() {
    /* 初始化每一列的数据 */
    for (let i = 1; i <= this.flowData.column; i++) {
      this.$set(this.flowData, `column_${i}`, []);
    }
  },
  onLoad() {
    /* 数据赋值 */
    this.flowData.list = [
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679045108_thumb.jpg",
        title: "自动驾驶汽车对交通和城市规划的未来影响与挑战",
        desc: "分析自动驾驶汽车对未来交通和城市规划的潜在影响,探讨相关挑战。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044581_thumb.jpg",
        title: "可持续城市发展:构建环保城市的策略和实践",
        desc: "分析建设可持续城市的战略和实际方法,强调环保、资源利用和城市规划的重要性。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679045190_thumb.jpg",
        title: "消灭传染病:全球卫生领域的挑战与创新",
        desc: "探讨在全球范围内消灭传染病的挑战,突出卫生领域的创新方法。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044667_thumb.jpg",
        title: "人工智能与机器学习:颠覆性技术对未来的巨大影响",
        desc: "探讨人工智能和机器学习如何在多个领域引发革命性变革,从工业到医疗,对未来产生深远影响。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044562_thumb.jpg",
        title: "生命科学的新前沿:基因编辑和生物技术的伦理挑战",
        desc: "研究生命科学领域的最新发展,聚焦基因编辑和生物技术的伦理考量,探讨科技前沿的道德挑战。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679045057_thumb.jpg",
        title: "加密货币与区块链:重塑全球金融体系的力量",
        desc: "解析加密货币和区块链技术对金融体系的颠覆作用,重新定义了全球金融交易方式。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044716_thumb.jpg",
        title: "量子计算与量子技术应用的前沿探索",
        desc: "深入研究量子计算和量子技术的前沿,展示这一领域的创新及其应用前景。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044779_thumb.jpg",
        title: "气候变化缓解的复杂性:全球视角下的挑战与机遇",
        desc: "探讨应对气候变化的复杂性,强调全球合作,突出应对挑战所蕴含的机遇。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044956_thumb.jpg",
        title: "虚拟现实与医疗保健的交汇:革命性地改变患者护理",
        desc: "介绍虚拟现实技术如何在医疗领域革命性地改善患者护理和治疗方法。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044607_thumb.jpg",
        title: "生物工程的突破:改变医学和人类增强的科技",
        desc: "研究生物工程领域的创新,关注其在医学和人类增强领域的重要作用。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679045083_thumb.jpg",
        title: "社交媒体的演进及其对沟通和社会的影响",
        desc: "追溯社交媒体的发展历程,探讨其对人际沟通和社会动态的广泛影响。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044643_thumb.jpg",
        title: "元宇宙时代:在工作、教育和娱乐的虚拟世界中导航",
        desc: "介绍元宇宙时代,强调虚拟世界在工作、教育和娱乐中的多样应用。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044936_thumb.jpg",
        title: "通用人工智能:人类是否准备好面对超智能机器?",
        desc: "研究通用人工智能的发展,引发思考人类面对超级智能机器的准备程度。"
      },
      {
        imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679045159_thumb.jpg",
        title: "超越火星:人类太空探索和星际旅行的未来",
        desc: "展望人类在太空探索领域的未来,探讨星际旅行的潜力和挑战。"
      }
    ];
    this.$nextTick(() => {
      this.initValue(0);
    });
  },
  computed: {
    /* 计算列宽 */
    widthCalc() {
      return `${100 / this.flowData.column - this.flowData.columnSpace}%`;
    },
    /* 计算 margin 外边距 */
    marginCalc() {
      const columnWidth = 100 / this.flowData.column - this.flowData.columnSpace;
      return `${(100 - columnWidth.toFixed(5) * this.flowData.column) / (this.flowData.column - 1)}%`;
    }
  },
  methods: {
    /* 获取最小值的对象 */
    getMinObj(a, s) {
      let m = a[0][s];
      let mo = a[0];
      for (let i = a.length - 1; i >= 0; i--) {
        if (a[i][s] < m) m = a[i][s];
      }
      mo = a.filter(i => i[s] === m);
      return mo[0];
    },
    /* 计算每列的高度 */
    getMinColumnHeight() {
      return new Promise(resolve => {
        const heightArr = [];
        for (let i = 1; i <= this.flowData.column; i++) {
          uni
            .createSelectorQuery()
            .in(this)
            .select(`#cont_${i}`)
            .boundingClientRect(res => {
              heightArr.push({ column: i, height: res.height });
            })
            .exec(() => {
              if (this.flowData.column <= heightArr.length) {
                resolve(this.getMinObj(heightArr, "height"));
              }
            });
        }
      });
    },
    /* 初始化瀑布流数据 */
    async initValue(i) {
      if (i >= this.flowData.list.length) return false;
      const minHeightRes = await this.getMinColumnHeight();
      this.flowData[`column_${minHeightRes.column}`].push({
        ...this.flowData.list[i],
        index: i
      });
    },
    /* 图片加载完成 */
    imgLoad(e) {
      const i = e.target.dataset.item.index;
      this.initValue(i + 1); // 加载下一条数据
    },
    /* 图片加载失败 */
    imgError(e) {
      const i = e.target.dataset.item.index;
      this.initValue(i + 1); // 加载下一条数据
    }
  }
};
</script>

<style lang="scss" scoped>
.container {
  padding: 20rpx;
  .cont-box {
    $borderRadius: 12rpx;
    float: left;
    .item-box {
      width: 100%;
      padding-bottom: 20rpx;
      margin-bottom: 30rpx;
      border-radius: $borderRadius;
      box-shadow: 0rpx 3rpx 6rpx rgba(0, 46, 37, 0.08);
      .img-tip {
        width: 100%;
        border-radius: $borderRadius $borderRadius 0 0;
      }
      .tit-tip {
        text-align: justify;
        font-size: 30rpx;
        padding: 10rpx 20rpx 0;
        font-weight: 900;
      }
      .desc-tip {
        text-align: justify;
        font-size: 26rpx;
        padding: 5rpx 20rpx 0;
        margin-top: 10rpx;
      }
    }
  }
}
/* 多行省略 */
.multi-line-omit {
  word-break: break-all; // 允许单词内自动换行,如果一个单词很长的话
  text-overflow: ellipsis; // 溢出用省略号显示
  overflow: hidden; // 超出的文本隐藏
  display: -webkit-box; // 作为弹性伸缩盒子模型显示
  -webkit-line-clamp: 2; // 显示的行
  -webkit-box-orient: vertical; // 设置伸缩盒子的子元素排列方式--从上到下垂直排列
}
/* 单行省略 */
.one-line-omit {
  width: 100%; // 宽度100%:1vw等于视口宽度的1%;1vh等于视口高度的1%
  white-space: nowrap; // 溢出不换行
  overflow: hidden; // 超出的文本隐藏
  text-overflow: ellipsis; // 溢出用省略号显示
}
</style>

vue3 版本

<!-- 瀑布流布局 -->
<template>
  <view class="container">
    <view
      :id="`cont_${index + 1}`"
      class="cont-box"
      :style="{ width: widthCalc, 'margin-left': index === 0 ? 0 : marginCalc }"
      v-for="(numVal, index) in flowData.column"
      :key="numVal"
    >
      <view class="item-box" v-for="(item, j) in flowData[`column_${index + 1}`]" :key="j">
        <image class="img-tip" :src="item.imgUrl" mode="widthFix" lazy-load @load="imgLoad(item)" @error="imgError(item)" />
        <view class="tit-tip multi-line-omit">{{ item.title }}</view>
        <view class="desc-tip multi-line-omit">{{ item.desc }}</view>
      </view>
    </view>
  </view>
</template>

<script setup>
import { reactive, computed, getCurrentInstance, onMounted } from "vue";

const _this = getCurrentInstance();
const flowData = reactive({
  list: [], // 数据值
  column: 2, // 瀑布列数
  columnSpace: 2 // 瀑布列宽间距
});
/* 数据赋值 */
flowData.list = [
  {
    imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679045108_thumb.jpg",
    title: "自动驾驶汽车对交通和城市规划的未来影响与挑战",
    desc: "分析自动驾驶汽车对未来交通和城市规划的潜在影响,探讨相关挑战。"
  },
  {
    imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044581_thumb.jpg",
    title: "可持续城市发展:构建环保城市的策略和实践",
    desc: "分析建设可持续城市的战略和实际方法,强调环保、资源利用和城市规划的重要性。"
  },
  {
    imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679045190_thumb.jpg",
    title: "消灭传染病:全球卫生领域的挑战与创新",
    desc: "探讨在全球范围内消灭传染病的挑战,突出卫生领域的创新方法。"
  },
  {
    imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044667_thumb.jpg",
    title: "人工智能与机器学习:颠覆性技术对未来的巨大影响",
    desc: "探讨人工智能和机器学习如何在多个领域引发革命性变革,从工业到医疗,对未来产生深远影响。"
  },
  {
    imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044562_thumb.jpg",
    title: "生命科学的新前沿:基因编辑和生物技术的伦理挑战",
    desc: "研究生命科学领域的最新发展,聚焦基因编辑和生物技术的伦理考量,探讨科技前沿的道德挑战。"
  },
  {
    imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679045057_thumb.jpg",
    title: "加密货币与区块链:重塑全球金融体系的力量",
    desc: "解析加密货币和区块链技术对金融体系的颠覆作用,重新定义了全球金融交易方式。"
  },
  {
    imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044716_thumb.jpg",
    title: "量子计算与量子技术应用的前沿探索",
    desc: "深入研究量子计算和量子技术的前沿,展示这一领域的创新及其应用前景。"
  },
  {
    imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044779_thumb.jpg",
    title: "气候变化缓解的复杂性:全球视角下的挑战与机遇",
    desc: "探讨应对气候变化的复杂性,强调全球合作,突出应对挑战所蕴含的机遇。"
  },
  {
    imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044956_thumb.jpg",
    title: "虚拟现实与医疗保健的交汇:革命性地改变患者护理",
    desc: "介绍虚拟现实技术如何在医疗领域革命性地改善患者护理和治疗方法。"
  },
  {
    imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044607_thumb.jpg",
    title: "生物工程的突破:改变医学和人类增强的科技",
    desc: "研究生物工程领域的创新,关注其在医学和人类增强领域的重要作用。"
  },
  {
    imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679045083_thumb.jpg",
    title: "社交媒体的演进及其对沟通和社会的影响",
    desc: "追溯社交媒体的发展历程,探讨其对人际沟通和社会动态的广泛影响。"
  },
  {
    imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044643_thumb.jpg",
    title: "元宇宙时代:在工作、教育和娱乐的虚拟世界中导航",
    desc: "介绍元宇宙时代,强调虚拟世界在工作、教育和娱乐中的多样应用。"
  },
  {
    imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679044936_thumb.jpg",
    title: "通用人工智能:人类是否准备好面对超智能机器?",
    desc: "研究通用人工智能的发展,引发思考人类面对超级智能机器的准备程度。"
  },
  {
    imgUrl: "https://www.logosc.cn/uploads/resources/2023/03/17/1679045159_thumb.jpg",
    title: "超越火星:人类太空探索和星际旅行的未来",
    desc: "展望人类在太空探索领域的未来,探讨星际旅行的潜力和挑战。"
  }
];
/* 初始化每一列的数据 */
for (let i = 1; i <= flowData.column; i++) {
  flowData[`column_${i}`] = [];
}
/* 生命周期函数-实例被挂载后调用 */
onMounted(() => {
  initValue(0);
});
/* 计算列宽 */
const widthCalc = computed(() => {
  return `${100 / flowData.column - flowData.columnSpace}%`;
});
/* 计算 margin 外边距 */
const marginCalc = computed(() => {
  const columnWidth = 100 / flowData.column - flowData.columnSpace;
  return `${(100 - columnWidth.toFixed(5) * flowData.column) / (flowData.column - 1)}%`;
});
/* 获取最小值的对象 */
const getMinObj = (a, s) => {
  let m = a[0][s];
  let mo = a[0];
  for (let i = a.length - 1; i >= 0; i--) {
    if (a[i][s] < m) m = a[i][s];
  }
  mo = a.filter(i => i[s] === m);
  return mo[0];
};
/* 计算每列的高度 */
function getMinColumnHeight() {
  return new Promise(resolve => {
    const heightArr = [];
    for (let i = 1; i <= flowData.column; i++) {
      uni
        .createSelectorQuery()
        .in(_this)
        .select(`#cont_${i}`)
        .boundingClientRect(res => {
          heightArr.push({ column: i, height: res.height });
        })
        .exec(() => {
          if (flowData.column <= heightArr.length) {
            resolve(getMinObj(heightArr, "height"));
          }
        });
    }
  });
}
/* 初始化瀑布流数据 */
async function initValue(i) {
  if (i >= flowData.list.length) return false;
  const minHeightRes = await getMinColumnHeight();
  flowData[`column_${minHeightRes.column}`].push({
    ...flowData.list[i],
    index: i
  });
}
/* 图片加载完成 */
function imgLoad(item) {
  const i = item.index;
  initValue(i + 1); // 加载下一条数据
}
/* 图片加载失败 */
function imgError(item) {
  const i = item.index;
  initValue(i + 1); // 加载下一条数据
}
</script>

<style lang="scss" scoped>
.container {
  padding: 20rpx;
  .cont-box {
    $borderRadius: 12rpx;
    float: left;
    .item-box {
      width: 100%;
      padding-bottom: 20rpx;
      margin-bottom: 30rpx;
      border-radius: $borderRadius;
      box-shadow: 0rpx 3rpx 6rpx rgba(0, 46, 37, 0.08);
      .img-tip {
        width: 100%;
        border-radius: $borderRadius $borderRadius 0 0;
      }
      .tit-tip {
        text-align: justify;
        font-size: 30rpx;
        padding: 10rpx 20rpx 0;
        font-weight: 900;
      }
      .desc-tip {
        text-align: justify;
        font-size: 26rpx;
        padding: 5rpx 20rpx 0;
        margin-top: 10rpx;
      }
    }
  }
}
/* 多行省略 */
.multi-line-omit {
  word-break: break-all; // 允许单词内自动换行,如果一个单词很长的话
  text-overflow: ellipsis; // 溢出用省略号显示
  overflow: hidden; // 超出的文本隐藏
  display: -webkit-box; // 作为弹性伸缩盒子模型显示
  -webkit-line-clamp: 2; // 显示的行
  -webkit-box-orient: vertical; // 设置伸缩盒子的子元素排列方式--从上到下垂直排列
}
/* 单行省略 */
.one-line-omit {
  width: 100%; // 宽度100%:1vw等于视口宽度的1%;1vh等于视口高度的1%
  white-space: nowrap; // 溢出不换行
  overflow: hidden; // 超出的文本隐藏
  text-overflow: ellipsis; // 溢出用省略号显示
}
</style>

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

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

相关文章

CAS原理与JUC原子类详解

CAS原理与JUC原子类 由于JVM的synchronized重量级锁涉及操作系统&#xff08;如Linux&#xff09;内核态下的互斥锁的使用&#xff0c;其线程阻塞和唤醒都涉及进程在用户态和到内核态的频繁切换&#xff0c;导致重量级锁开销大、性能低。而JVM的synchronized轻量级锁使用CAS&a…

xml的语法

<!-- 1、每一个xml,有且只有一个根标签&#xff0c;所有xml标签必须写在根标签中 2、标签必须要有合闭 3、xml格式是否正确&#xff0c;可以通过浏览器打开xml。来校验xml格式是否正确 4、xml是区别大小写的 5、xml书写标签名时&#xff0c;不要出现空格等特…

JSKarel教学编程机器人使用介绍

JSKarel教学编程机器人使用介绍 为了避免被编程语言固有的复杂性所困扰&#xff0c;有一个被称为卡雷尔&#xff08;Karel&#xff09;机器人的微型世界&#xff08;microworld&#xff09;的简化环境&#xff0c;可以让编程初学者从中学习理解编程的基本概念&#xff0c;而不…

【JAVA-Day44】Java常用类StringBuffer解析

Java常用类StringBuffer解析 Java常用类StringBuffer解析一、什么是StringBuffer类二、StringBuffer类的方法2.1 append方法2.2 insert方法2.3 delete方法2.4 replace方法2.5 reverse方法2.6 toString方法2.7 capacity方法2.8 length方法 三、StringBuffer类的应用场景深入了解…

SGX 研究进展

目录 SGX 应用支持技术研究进展&#xff08;笔记&#xff09;SGX 整体架构SGX安全机制隔离执行认证密封 SGX管理机制SGX 内存管理机制EPC 页驱逐(eviction)SGX SDK SGX 应用现状及瓶颈问题SGX 应用安全防护技术TCB最小化TCB 安全风险分析最小化 TCB 的安全方案 对外接口最少化E…

【Axure高保真原型】3D柱状图_中继器版

今天和大家分享3D柱状图_中继器版的原型模板&#xff0c;图表在中继器表格里填写具体的数据&#xff0c;调整坐标系后&#xff0c;就可以根据表格数据自动生成对应高度的柱状图&#xff0c;鼠标移入时&#xff0c;可以查看对应圆柱体的数据……具体效果可以打开下方原型地址体验…

3.DApp-Metamask登录不了解决方法

题记 当遇到metamask登录不了&#xff0c;加载一直转圈圈&#xff0c;可以用以下的方法解决。 切换网络 切换成Linea Mainnet测试网络&#xff1a; 输入密码 输入登录密码登录metamask 重新选择自定义网络 选择自己本地自定义的网络&#xff1a; 后记 觉得有用可以收藏或点…

【源码分析】Java中的lambda表达式会生成内部类吗?是如何生成的?

文末附结论 分析 以该程序为例子 public class LambdaTest {public static void main(String[] args) {Thread t1 new Thread(() -> {System.out.println("asdwerwerwe");});t1.start();System.out.println("end!!!");} }调用javap -c -p LambdaTest…

C/C++陷阱——临时变量的产生和特性

C/C陷阱——临时变量的产生和特性 在学习C常引用时&#xff0c;有这样一段代码引起了我的注意&#xff1a; int a 1; double& b a;当我编译这段代码时&#xff0c;竟然报错了&#xff1a; 按理来说&#xff0c;初始化引用时不能涉及权限的放大&#xff08;如用const in…

黑群晖自动调整cpu模式

DS918 黑群晖好像是不支持cpu动态频率&#xff0c;导致cpu一直在最高频率运行&#xff0c;导致功耗比较高&#xff0c;但是某些版本的系统不支持设置为自动根据cpu负载动态调整频率&#xff0c;自己写了个脚本&#xff0c;支持自动根据cpu使用率调整cpu模式 脚本下载链接如下 …

朴实无华的三天每日一题

leetcode八分钟补完三天的每日一题哈哈哈哈 主打一个求同存异 import java.util.Arrays;class Solution {public int singleNumber(int[] nums) {Arrays.sort(nums);int ans 0;for (int i 0; i < nums.length; ) {try {if (nums[i] nums[i 1]) {i 2;} else {ans nums…

讲解 CSS 过渡和动画 — transition/animation (很全面)

前言 由于用户越来越注重 Web应用 的使用体验&#xff0c;随之而来的是 Web应用 需要提供了更加完善的 Web 动画 效果来实现以平滑的状态贯穿于用户的整个使用过程中。现在&#xff0c;这已经是司空见惯了&#xff0c;用户潜意识是希望可以获得更快的反馈响应和更友好的用户界…

2023年全球新能源云母材料市场发展展望分析:储能云母市场规模快速增长[图]

云母作为电气设备的基础材料&#xff0c;下游应用领域涉及高温冶炼、电力等传统行业&#xff0c;并在近几年逐步扩展到新能源汽车、电化学储能等新兴行业。2022年&#xff0c;全球云母材料市场规模保持稳定增长至180.0亿元&#xff0c;期间年复合增长率约为13.2%。预计未来&…

React TreeSelect设置默认展开项的方法

需要实现TreeSelect组件的onTreeExpand、treeExpandedKeys方法。 代码样例如下&#xff1a; 1.TreeSelect标签部分 render() {const {codeselect} this.props;const {treeExpandedKeys} this.state ................<TreeSelectshowSearch{false}dropdownStyle{{ maxHei…

day06_面向对象基础

今日内容 1 复习 2 面向对象编程介绍 3 面向对象 类,属性,方法 ,创建对象,使用对象内存关系 一、复习 周一: jdk,配置环境变量,idea,HelloWorld 变量,基本数据类型 周二: 运算符,if,if-else 周三: if-elseif-elseif-else,循环(while,dowhile,for) 周四: 方法设计(参数,返回值),…

vue3学习(六)--- 插槽slot

文章目录 匿名插槽具名插槽作用域插槽渲染作用域 动态插槽 插槽就是&#xff1a;子组件中的提供给父组件使用的一个占位符&#xff0c;用<slot></slot> 表示&#xff0c;父组件可以在这个占位符中填充任何模板代码&#xff0c;如 HTML、组件等&#xff0c;填充的内…

C++项目实战——基于多设计模式下的同步异步日志系统-⑫-日志宏全局接口设计(代理模式)

文章目录 专栏导读日志宏&全局接口设计全局接口测试项目目录结构整理示例代码拓展示例代码 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师&#xff0c;阿里云专家博主&#xff0c;C…

安全典型配置(三)使用ACL禁止特定用户上网案例

【微|信|公|众|号&#xff1a;厦门微思网络】 安全典型配置&#xff08;一&#xff09;使用ACL限制FTP访问权限案例_厦门微思网络的博客-CSDN博客本例中配置的本地用户登录密码方式为irreversible-cipher&#xff0c;表示对用户密码采用不可逆算法进行加密&#xff0c;非法用…

VulnHub lazysysadmin

一、信息收集 1.nmap扫描开发端口 开放了&#xff1a;22、80、445 访问80端口&#xff0c;没有发现什么有价值的信息 2.扫描共享文件 enum4linux--扫描共享文件 使用&#xff1a; enum4linux 192.168.103.182windows访问共享文件 \\192.168.103.182\文件夹名称信息收集&…

YOLO目标检测——抽烟吸烟数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;公共场所监管、健康风险评估、戒烟干预数据集说明&#xff1a;YOLO目标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富。使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xml)、coco(json)和yolo(txt)三…