CSS实现多行文本“展开和折叠”
时间:2023-03-31 02:14:09
CSS
多行文本展开和折叠是一种很常见的交互,如下图演示此类布局和交互难点主要有以下几点位于多行文本右下角”“展开和折叠”按钮在“展开和折叠”之间切换当文本不超过指定行数时,“展开和折叠”按钮不显示说实话,看着之前单独在这个布局下,即使借助JavaScript也是一件容易的事情(需要计算文本的宽度来动态截取文本,vue-clamp就是干这个的),更不用说下面的交互和判断逻辑了,不过琢磨了一下,其实纯CSS也可以完美实现,下面我们一步步来看看是如何实现的吧~1.位于右下角的“展开收起”按钮很多设计同学喜欢这个设计。把按钮放在右下角,和文字混在一起,而不是单行,视觉上可能会更舒适美观。我们先来看看多行文本截断。这是比较简单的多行文本截断。假设有这样一个html结构浮动元素是如何定位的呢?正如我们前面提到的,当一个元素浮动时,它会被移出正常的文档流,然后向左或向右平移,直到它碰到它所在容器的边框,或者另一个浮动元素。
多行文字超出省略。你应该对此很熟悉。主要使用line-clamp,关键样式如下。text{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:垂直;overflow:hidden;}右下角环绕效果说到文字环绕效果,一般可以想到floatingfloat。没错,不要以为浮动已经成为过去式,在特定场景下还是很有用的。比如下面放一个按钮,然后设置浮动
Expand浮动元素怎么定位?正如我们前面提到的,当一个元素浮动时,它会被移出正常的文档流,然后向左或向右平移,直到它碰到它所在容器的边框,或者另一个浮动元素。 .btn{浮动:左;/*其他装饰风格*/}如果设置了浮动右边。右上角的按钮怎么移到右下角?试试margin.btn{float:right;顶部边距:50px;/*其他装饰风格*/}可以看到虽然按钮到达了右下角,但是文字并没有把按钮上方的空间包围起来,留了一大片空间Cut,难道就没有办法了吗?虽然margin不能解决问题,但是整个文字还是会受到浮动按钮的影响。如果有多个浮动元素怎么办?这里伪元素用于替换::before.text::before{content:'';浮动:对;宽度:10px;height:50px;/*先随便设置一个高度*/background:red}现在按钮已经到了左边的伪元素,如何移动到底部呢?很简单,只需要清除floatingclear:both;就是这样。btn{浮动:对;明确:两者;/*其他装饰样式*/}可以看到现在文字完全被右侧两个浮动元素包围了,只要将红色背景的伪元素宽度设置为0(或者不设置宽度,默认为0),会实现右下角环绕的效果。text::before{content:'';浮动:对;宽度:0;/*设置为0,或者不设置宽度*/height:50px;/*先随便设置一个高度*/}动态高度虽然完成了右下和环绕,但是高度是固定的,怎么设置动态地?这里可以使用calc计算,只需将整个容器的高度减去按钮的高度即可,如下。text::before{内容:'';浮动:对;宽度:0;height:calc(100%-24px);}不幸的是,它似乎没有任何效果。打开控制台发现calc(100%-24px)的计算高度为0,原因其实很容易想到。就是高度100%失效的问题。网上有一些对这类问题的分析。很多,通常的解决办法是给parent指定一个高度,但是这里的高度是动态变化的,还有展开状态,高度就更不可预测了,所以设置height除此之外,其实还有一种方式,就是使用flex布局。大致的方法是在flex布局的子项中按百分比计算变化高度。具体可以参考w3.org中css-flexbox的说明。如果flexitem有align-self:stretch,重做其内容的布局,将这个使用过的大小作为它的确定的交叉大小,以便百分比大小的孩子可以被解析。所以这里需要给.text包裹一层,然后设置显示:flex
Expand如何浮动元素定位正如我们前面提到的,当一个元素浮动时,它会被移出正常的文档流,然后向左或向右平移,直到它碰到它所在容器的边界,或者碰到另一个浮动元素。