BUG介绍

有一个前端产品,需求是需要给一个文本块加上个角标,虽然产品没给具体样式上的要求,但是作为直男 用仅存的一点点twemoji-1f3a8细胞,还是花了点时间从网上找来一段用 css 实现的角标,感觉还行叭:

查看源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<style>
body {
width: 100vw;
height: 100vh;
background: #1b1b1b;
}

#container {
position: relative;
margin: 50px;
padding: 35px;
width: 230px;
height: 50px;
background: darkslateblue;
border-radius: 15px;
font-weight: bold;
}

#corner {
position: absolute;
top: -.4rem;
right: -1rem;
}

#corner > span {
position: absolute;
z-index: 1;
top: 0;
right: .8rem;
width: 4em;
color: white;
font-weight: bold;
font-style: oblique;
}

#corner:before {
position: absolute;
width: 3em;
top: -0.2rem;
right: 0.5rem;
z-index: 1;
padding-right: 0.6rem;
font-weight: bold;
line-height: 0;
color: black;
height: 0;
border: 1rem solid green;
border-left-color: transparent;
content: "";
box-shadow: 0 0.3rem 0.3rem -0.3rem black;
}

#corner:after {
content: "";
position: absolute;
top: 1.7rem;
right: 0.5rem;
border: 0.25rem solid darkgreen;
border-right-color: transparent;
border-bottom-color: transparent;
}

</style>
</head>
<body>
<div id="container">
<span>人类从历史中学到的唯一教训是</span>
<span>人类无法从历史中学到任何教训</span>
<div id="corner">
<span>黑格尔</span>
</div>
</div>
</body>
</html>

看上去还🆗~然鹅……
后来偶然发现,如果用户的浏览器设置了页面缩放,在某些缩放值下角标会产生奇怪的裂缝:
bug

通过在各种设备上测试,发现除了 safari 以外,PC 上的 Chrome、IE,手机上的 FireFox、UC 等,或多或少都存在这个问题,其中尤以 PC 的 Chrome 最为严重,严重影响美观😧

代码分析

角标主体部分是用伪元素实现的,具体样式为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#corner:before {
position: absolute;
width: 3em;
top: -0.2rem;
right: 0.5rem;
z-index: 1;
padding-right: 0.6rem;
font-weight: bold;
line-height: 0;
color: black;
height: 0;
border: 1rem solid green;
border-left-color: transparent;
content: "";
box-shadow: 0 0.3rem 0.3rem -0.3rem black;
}

可以得知实现的原理是先将元素高度设为0,然后设置宽度为 1rem 的边框,这样就得到一个高度为 2rem 的矩形;接着单独设置左边框的颜色为透明,这样就实现了左边挖出了一个内角的效果。

所以产生的缝隙就是不知为何,设置的 height: 0 失效,上下边框之间露出了缝隙……

解决方法(不完美)

经过各种尝试,包括设置内阴影、在元素下面再放个绿色元素等,效果都不是很理想……突然想起以前同事教我的神技:样式有奇怪问题,就切换几个不同的 display 模式试试看

然后:
fix

设置 display: table 后居然就显示正常了😂

之所以说这样的解决不完美,是因为在 FireFox 和 IE 上,还是会存在一点难以察觉的缝隙。。但是考虑到主流浏览器的市场份额……就这样吧😬