css3多行文本多行文本缩略点击更多展开显示全部

比如我要实现如下效果:

image.png

数据集名称展示一行,超出自动省略,末尾增加编辑icon。点击编辑的icon,换成input 输入框

数据集描述最多展示三行,超出自动省略。末尾增加编辑icon。点击编辑的icon,换成textarea 输入框

展示一行省略+icon实现

单行省略实现,无非是这样

<div class="flex-row align-items-center full-width">
  <div style="max-width: 192px">
    <OverflowTitle>
      {name.value}
    </OverflowTitle>
  </div>
  <i
    class="bkvision-icon icon-bianji text-link ml-min font-medium"
    onClick={() => {
      isEditedName.value = false;
      nextTick(() => {
        isEditedNameRef?.value?.focus();
      });
    }}
  />
</div>

文本溢出省略加提示,可以参考 https://github.com/zhoulujun/textOverflowTitle

多行文本省略

多行文本省略,css3也有属性。主要靠webkit-line-clamp

具体样式如下:

.multi-text-over {
  background: #fff;
  position: relative;
  word-break: break-all;

  /* autoprefixer: off */
  display: box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  white-space: normal;
  overflow: hidden;

  &-more {
    position: absolute;
    right: 0;
    bottom: 0;
    background: inherit;
  }

  &-icon {
    margin-left: 4px;
    color: #3a84ff;
    cursor: pointer;
    font-size: 16px;
  }
}

如何做到自适应呢?

import { defineComponent, nextTick, onMounted, ref } from 'vue'
import './index.scss'
import { EditLine } from 'bkui-vue/lib/icon'

export default defineComponent({
  name: 'TextExpander',
  props: {
    emptyText: {
      type: String,
      default: '--'
    },
    line: {
      type: Number,
      default: 3
    },
    lineHeight: Number,
    content: String
  },
  emits: ['click'],
  setup(props, { emit, slots }) {
    const boxRef = ref<HTMLElement>(null)
    const icon = slots.icon ? slots.icon() : (
      <EditLine class='multi-text-over-icon' onClick={() => emit('click')} />
    )
    const isOverflow = ref(false)
    onMounted(() => {
      nextTick(() => {
        const { clientHeight, scrollHeight } = boxRef.value
        isOverflow.value = scrollHeight > clientHeight
      })
    })
    return () => (
      <div class='multi-text-over' ref={boxRef} style={{ '-webkit-line-clamp': props.line }}>
        <span title={isOverflow.value ? props.content : ''}>{props.content || '--'}</span>
        {isOverflow.value ? (<div class='multi-text-over-more'>...{icon}</div>) : (
          <span>{icon}</span>)}
      </div>
    )
  }
})

具体参看:https://github.com/zhoulujun/text-expander

当然这个高度,是外面容器给的。

如何自适应比如给定高度,自定计算webkit-line-clamp为几行呢?

这个这个不能直接用box.value.style.lineHeight,获取的为空字符串

具体代码如下:

let element = document.getElementById('yourElementId'); // 用你的元素ID替换 'yourElementId'
let style = window.getComputedStyle(element);
let lineHeight = style.getPropertyValue('line-height');

if (lineHeight === 'normal') {
    // 如果行高是 'normal',则获取字体大小并乘以约1.2
    let fontSize = parseFloat(style.getPropertyValue('font-size'));
    lineHeight = Math.round(fontSize * 1.2) + 'px';
}

console.log(lineHeight);

当然1.2 是不对,也有可能是1.5。这个代码么有通用性。这个需要给定行高。

然后通过高度除以函告,自动计算出展示几行。

参考文章:

CSS 实现多行文本“展开收起” CSS 实现多行文本“展开收起” - 掘金

转载本站文章《css3多行文本多行文本缩略点击更多展开显示全部》,
请注明出处:css3多行文本多行文本缩略点击更多展开显示全部 - css3的新特性重点讲解 - 周陆军的个人网站

  • 28
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是React实现多行缩略,包含展开和收起的代码示例: ```jsx import React, { useState } from "react"; const TextTruncate = ({ text, maxLines }) => { const [isExpanded, setIsExpanded] = useState(false); const toggleExpand = () => setIsExpanded(!isExpanded); const shouldTruncate = text.split("\n").length > maxLines; return ( <div> <div style={{ overflow: "hidden", display: "-webkit-box", WebkitBoxOrient: "vertical", WebkitLineClamp: maxLines, }} > {text} </div> {shouldTruncate && ( <button onClick={toggleExpand}> {isExpanded ? "收起" : "展开"} </button> )} </div> ); }; export default TextTruncate; ``` 在这个例子中,我们使用useState钩子来跟踪当前文本是否已展开。我们还定义了一个toggleExpand函数,用于切换展开和收起状态。 我们使用CSS属性来实现文本截断。我们设置overflow为hidden,使文本溢出隐藏,并使用-webkit-box属性来定义一个垂直方向上的弹性盒子。我们可以使用WebkitLineClamp属性来限制文本的行数。 最后,我们使用一个条件来显示展开和收起按钮,仅当文本超过指定的行数时。我们使用button元素来呈现按钮,并在单击时调用toggleExpand函数。 你可以使用以下代码片段来渲染TextTruncate组件: ```jsx <TextTruncate text={longText} maxLines={3} /> ``` 在这个例子中,我们将一个长文本字符串作为文本传递给TextTruncate组件,并将maxLines属性设置为3。这将限制文本的行数为3行,并在需要时显示展开和收起按钮。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值