这个系列系列居然第二天就更新了,而且今天遇到了2个bug,如果按照指数发展,明天我会遇到4个bug,后天遇到8个……
第一个 bug 一句话总结:-webkit-box 方式实现 n 行文本溢出时,如果文本行高 * n < 容器的高度,可能导致出现多余内容
活是这样的,特别的简单,需要把一张 26 * 26 的 icon 图和一段 font-size 为 19 的单行文本放在一行上,icon 和单行文本上下居中,文本要是超出一行需要显示省略号
我在工作中的一些限制是:
- 文本必须嵌套两层 div,内层的 div 我不能控制;
- 只能写内联样式,无法使用 css 选择器;
然后我就写了这样的代码:
export default function App() {
const styles = {
wrapper: {
width: 200,
display: 'flex',
alignItems: 'center',
},
icon: {
width: 26,
height: 26,
backgroundColor: 'red',
flex: 'none',
marginRight: 8,
},
text: {
fontSize: 19,
height: 26,
lineHeight: '26px',
overflow: 'hidden',
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
},
}
return (
<div className="App uncontrollable">
<div style={styles.wrapper}>
<div style={styles.icon}></div>
<div style={styles.text}>
<div className="uncontrollable" style={{ lineHeight: 1 }}>
很长的一句话一句话一句话一句话
</div>
</div>
</div>
</div>
);
}
运行结果是这样
可以看到,在外层 div 上设置的单行文本溢出并不能生效,但我又不能控制内层 div,所以我把单行文本溢出的 css 方式改成了 -webkit-box 的方式
text: {
fontSize: 19,
height: 26,
lineHeight: '26px',
overflow: 'hidden',
textOverflow: 'ellipsis',
display: '-webkit-box',
'-webkit-box-orient': 'vertical',
'-webkit-line-clamp': '1',
},
运行结果变成了这样
可以看到,虽然第一行省略了,但是会有第二行的局部出现。
这是因为内层 div上面设置了行高为 1(因为 uncontrollable 类是封装好的组件,所以我没有感知到它的样式 QAQ),使文本的行高小于了容器的高度,所以展示了第二行的部分内容
那我们就把容器的高度去掉
text: {
fontSize: 19,
overflow: 'hidden',
textOverflow: 'ellipsis',
display: '-webkit-box',
'-webkit-box-orient': 'vertical',
'-webkit-line-clamp': '1',
},
好了,不过仔细看一下上图,文本和icon图并不是完全居中的
因为文本的高度是 19px,图片的高度是 26px,相差的 7px 无法均分到文本上下两侧
相差值较小时,不能居中的问题会格外明显
那我可以给字号加上 1px 吗,不行,因为我的代码要运行在移动端,编译的时候会根据设备的字体大小,将样式映射到实际像素值,在不同设备上,文本和图片的高度的实际像素值可能是不一样的。它们有可能是奇偶性相同的,也有可能是奇偶性不同的
总之,虽然这个活很简单,但我目前还没想好一个能够解决这个问题的方案,我现在感觉自己是个没有感情的 bug 制造机器……
第二个 bug 是一个 ResizeObserver 相关的问题,因为问题不能稳定复现,我还没有找到原因……
唉,只能安慰自己,从一个集体的角度来讲,修的 bug 一定是小于写的 bug 的 ^_^