css省略号展示,兼容性强,js判断几行,不需要定位

有个需求就是要展示省略号,定位的话不太好,没有css样式的省略号好,使用css的省略号的话功能不太够,所以利用了一些技巧,使用浮动之后用伪元素margin值顶替。可以多个展示,可以单个展示。只需要把函数的参数换了就可以。底下是具体代码实现

html 复制代码
<div class="expertise-container">
  <div class="dec">
    <div class="more" v-if="needShowMore[index]">
      ...
      <span @click="toggleExpand(doctor)">详情</span>
    </div>
    <div class="text" ref="textRefs">
      {{ doctor.spec }}
    </div>
  </div>
</div>
css 复制代码
  .dec {
    font-weight: 400;
    font-size: 42px;
    color: #ffffff;
    overflow: hidden;
    .more {
      float: right;
      span {
        font-size: 42px;
        color: #41e8ff;
      }
    }
    .text {
      height: 116px;
      margin-top: -65px;
    }
  }
  .dec::before {
    content: "";
    display: block;
    height: 70px;
  }
js 复制代码
const needShowMore = ref([]); // 数组,记录每个元素是否需要显示"详情"
const textRefs = ref([]);
const textRef = ref(null);
const checkTextOverflow = () => {
  if (textRef.value) {
    const el = textRef.value;
    const style = window.getComputedStyle(el);
    // 创建临时div,保持相同样式
    const temp = document.createElement("div");
    temp.style.cssText = `
                position: absolute;
                left: -9999px;
                top: -9999px;
                width: ${el.offsetWidth}px;
                font-size: ${style.fontSize};
                font-family: ${style.fontFamily};
                line-height: ${style.lineHeight};
                word-break: ${style.wordBreak};
                white-space: ${style.whiteSpace};
            `;
    temp.textContent = el.textContent;
    document.body.appendChild(temp);

    // 计算行数
    const lineHeight =
      parseFloat(style.lineHeight) || parseFloat(style.fontSize) * 1.4;
    const actualLines = Math.floor(temp.offsetHeight / lineHeight);

    document.body.removeChild(temp);
    needShowMore.value[0] = actualLines > 2;

    // console.log(`元素详情:`, {
    //   scrollHeight: el.scrollHeight + "px",
    //   实际行数: actualLines + "行",
    //   是否显示: actualLines > 2,
    //   文本预览: el.textContent.substring(0, 30),
    // });
  }

  textRefs.value.forEach((el, index) => {
    if (el) {
      // 创建临时元素测量实际行数
      const measureLines = (element) => {
        const text = element.textContent;
        const style = window.getComputedStyle(element);

        // 创建临时div,保持相同样式
        const temp = document.createElement("div");
        temp.style.cssText = `
                    position: absolute;
                    left: -9999px;
                    top: -9999px;
                    width: ${element.offsetWidth}px;
                    font-size: ${style.fontSize};
                    font-family: ${style.fontFamily};
                    line-height: ${style.lineHeight}; 
                    word-break: ${style.wordBreak};
                    white-space: ${style.whiteSpace};
                `;
        temp.textContent = text;
        document.body.appendChild(temp);

        // 计算行数
        const lineHeight =
          parseFloat(style.lineHeight) || parseFloat(style.fontSize) * 1.4;
        const lines = Math.floor(temp.offsetHeight / lineHeight);

        document.body.removeChild(temp);
        return lines;
      };

      const actualLines = measureLines(el);
      needShowMore.value[index] = actualLines > 2;

      // console.log(`元素${index}:`, {
      //   scrollHeight: el.scrollHeight + "px",
      //   实际行数: actualLines + "行",
      //   是否显示: actualLines > 2,
      //   文本预览: el.textContent.substring(0, 30),
      // });
    }
  });
};

jsd的方法是单个和多个,可以直接定义参数,我是直接拿的ref的值判断的,有能力的直接简化一下就可以,这儿就不过多赘述了。

相关推荐
2分钟速写快排5 小时前
孔乙己的茴字有多少种写法?|AI 对话实时通信的三种实现
前端·javascript·github
梯度下降者7 小时前
Nuxt框架
vue.js·服务端渲染·全栈开发·混合渲染·nuxt框架
ZhengEnCi11 小时前
登录页电脑端怎么设计才不空:5 种布局方案与可粘贴 AI 提示词
前端·css·设计
用户00447295382511 小时前
练歌镜:让眼镜听懂“循环这一句”
javascript
yuyuxun114 小时前
协同过滤的校园二手物品智能推荐系统的设计与实现 毕业设计-附源码40082
javascript·vue.js·spring boot·python·数据分析·django·课程设计
总要学点什么17 小时前
第105篇:三维特效-流动图片墙体效果——让箭头沿墙长滚,它俩竟是同一份代码
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
Agent世界19 小时前
用 CDP 做发布自动化:四道机器闸门与产物验收
前端·javascript
FungLeo19 小时前
成为全栈·Vue 管理后台篇·编辑器图片上传:从文件选择到文章附件关联
前端·vue.js·编辑器·markdown·文件上传·formdata·附件管理
总要学点什么19 小时前
第104篇:三维特效-流动墙体效果——让贴图沿墙流动,它却只肯走一条对角线
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
程序员大阳19 小时前
副队长ES6+教程(3)--解构赋值
前端·javascript·es6·赋值·解构