要实现效果如下:尾部带查看详情,前面有三个点省略号。之前单独看这个布局,即使借助 JavaScript 也不是一件容易的事啊(需要计算文字宽度动态截取文本,然后 append 上三个点和查看详情。vue-clamp 就是这么做的,包括很多博客也是这么讲的,但是讲真,如果是个列表,这种不断的判断,肯定不是妙解),更别说下面的交互和判断逻辑了,不过经过我的一番琢磨,其实纯 CSS 也能完美实现的,下面就一步一步来看看如何实现吧~
1、多行文本截断显示省略号,这种不多说了,就是这样的方法
@mixin mul-text-e($lines) { @include multiple-text-ellipsis($lines); } @mixin multiple-text-ellipsis($lines) { display: -webkit-box; overflow: hidden; text-overflow: ellipsis; -webkit-line-clamp: $lines; -webkit-box-orient: vertical; }
2、右下角环绕效果
因为【查看详情】前面还有三个点,所以我们想到的是“文本环绕效果”。提到 文本环绕效果,一般能想到 浮动 float,千万不要以为浮动已经是过去式了,具体的场景还是很有用的。比如下面放一个按钮,然后设置右浮动,文字环绕浮动元素【查看详情】周围,并不会影响原文字。
这时已经有了 环绕 的效果了,只是位于右上角,如何将按钮移到右下角呢?先尝试一下 margin
.tip { float: right; color: rgba(255, 98, 139, 1); margin-top: 80rpx; }
可以看到,虽然按钮到了右下角,但是文本却没有环绕按钮上方的空间,空出了一大截,那怎么办呢?虽然 margin 不能解决问题,但是整个文本还是受到了浮动按钮的影响,如果有多个浮动元素会怎么样呢?这里用伪元素来 ::before 代替
.desc { @include mul-text-e(3); &::before { content: ' '; float: right; width: 10rpx; height: 80rpx; background: red; } }
现在按钮到了伪元素的左侧,如何移到下面呢?很简单,清除一下浮动 clear: both; 就可以了
.tip { float: right; color: rgba(255, 98, 139, 1); clear: both; }
可以看到,现在文本是完全环绕在右侧的两个浮动元素了,只要把红色背景的伪元素宽度设置为0,就实现了右下角环绕的效果
3、动态高度
上面虽然完成了右下加环绕,但是高度是固定的,如何动态设置呢?这里有2种方式:(1)可以用到 calc 计算,用整个容器高度减去按钮的高度即可;(2)可以高度设置 100%,然后采用负的 margin 来实现
.desc { @include mul-text-e(3); &::before { content: ' '; float: right; // height: 100%; // margin-bottom: -40rpx; height: calc(100% - 40rpx); } }
4、其他浏览器的兼容处理
设置display: -webkit-box该属性后,原本的文本好像变成了一整块,浮动元素也无法产生环绕效果,去掉之后浮动就正常了。那么问题来了:没有 display: -webkit-box 怎么实现多行截断呢 ?
其实上面的努力已经实现了右下角环绕的效果,如果在知道行数的情况下设置一个最大高度,是不是也完成了多行截断呢?为了便于设置高度,可以添加一个行高 line-height,如果需要设置成 3 行,那高度就设置成line-height * 3
.text { /* display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; */ line-height: 1.5; max-height: 4.5em; overflow: hidden; }
当然这样会没有省略号,现在加上省略号吧,可以用伪元素实现
.btn::before{ content: '...'; position: absolute; left: -10px; color: #333; transform: translateX(-100%) }
这样,Safari 和 Firefox 的兼容布局基本上就完成了
标签:浮动,...,text,height,webkit,环绕,文本,浅析,CSS From: https://www.cnblogs.com/goloving/p/17483725.html更多详细内容可参考文章:《CSS 实现多行文本“展开收起” - https://juejin.cn/post/6963904955262435336》
《css这样实现多行文本“展开收起” 超酷的好吧 - https://zhuanlan.zhihu.com/p/468314222》