“展开"与"收起”
当字数多到一定程度就显示省略号点点点。最初只是简单的点点点,之后花样越来越多,点点点加下箭头,点点点加更多,点点点加更多加箭头…。多行省略就是大段文字后面的花式点点点。
而我实现的是这样的:
实现代码:
1 | import React, {Component} from 'react'; |
原理详解:
文字溢出截断
1 | <html><body> |
-webkit-line-clamp
是webkit内核的私有css属性,用于进行多行省略,在安卓和ios上全支持。但它固定使用省略号,无法直接扩展。而且自带了溢出截断逻辑,作用于容器高度。仔细考察可发现它使用的省略号是单字符…
,可以用文字css属性如font-size
,letter-spacing
,color
等控制。
1 | <html><body> |
设置外容器的font-size
、letter-spacing
、color
,并在子容器里恢复就可以单独设置省略号。这里外容器设置font-size
的值等于2倍行高(余下要撑开的宽度可用letter-spacing
补足,也可仅用font-size
撑开全部的宽度),color:transparent
可以让line-clamp既挤出文字又不截断容器高度,外容器高度达到7行而不是默认表现的6行,从而达到需要的溢出截断效果
实现详解:
首先写个省略号的容器<div className="ellipsis-container">
省略号容器的样式要注意的一点是,font-size的值要足够大,以至于有足够空间让你放下"…[展开]", 而"…[展开]"只遮住了省略号的空间, 这样就不会出现遮住半个字的现象(此现象会有点丑):
1 | .ellipsis-container { |
接下来是正文的div(<div className="ellipsis-content">
), 它的高度就只文本的全高度:
然后是设置"…[展开]“和”[收起]"的div:
先把.ellipsis-ghost
右移到.ellipsis-container
的一半位置, 然后.ellipsis-ghost::before的高度要与.ellipsis-ghost的高度保持一致, 而.ellipsis-ghost的高度是与它的父级元素(.ellipsis-container)的高度保持一致的, 又因.ellipsis-container的高度是被.ellipsis-content的文本撑开的高度, 因此, .ellipsis-ghost::before的高度其实是与文本的高度保持一致的
接着把.ellipsis-placeholder
的高度设置为最小文本的呈现高度(.ellipsis
的max-height
), 如果文本高度大于max-height
, 由于右浮动的原理, 且.ellipsis-ghost:before
的高度大于.ellipsis-placeholder
的高度, 则可以把"…[展开]"显示出来, 如上显示;
如果文本高度小于或等于max-height
, 则 .ellipsis-ghost:before
的高度小于或等于.ellipsis-placeholder
的高度, 那么"…[展开]"则会飘走而不显示, 如下:
最后可以在.toggle-button
里设置一个点击事件来控制是否显示全文: