自定义复选框伪元素切换content时出现额外高度是什么原因?
多余高度的来源
- 第一点:你给伪元素设置的
display: inline-block默认vertical-align值为baseline。未选中状态下伪元素content为空,此时它的基线就是元素底边缘;选中状态下content插入了SVG替换元素,此时基线变为SVG内容的基线,两种状态下基线位置不一致,触发排版高度变化。 - 第二点:直接将SVG作为
content值插入时,SVG属于替换元素,不会自动适配你给伪元素设置的宽高,会按照自身原始尺寸渲染,进一步撑开了伪元素的实际占用高度。
解决办法(推荐方案)
不要把SVG直接放在content中,改为用背景图的方式加载对勾图标,同时给伪元素增加垂直对齐属性和文字对齐,避免基线偏移问题。
修改后的完整CSS代码如下:
*,*::before,*::after { margin: 0; padding: 0; box-sizing: border-box; } .form-control.checkbox input[type=checkbox] { display: none; } .form-control.checkbox input[type=checkbox] + label::before { content: ""; border: 1px solid blue; height: 1.25em; width: 1.25em; display: inline-block; margin-right: 0.5em; /* 新增:垂直对齐,和旁边文字对齐的同时避免基线偏移 */ vertical-align: middle; } .form-control.checkbox input[type=checkbox]:checked + label::before { /* content保持为空,不要插入SVG作为内容 */ content: ""; background-color: red; /* 新增:把SVG改为背景图配置 */ background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18" fill="none" stroke="%23fff" stroke-width="2"><polyline class="st0" points="3,10 7.3,14 16,4 "/></svg>'); background-size: 75%; background-repeat: no-repeat; background-position: center; }
可选方案(坚持用content放SVG的情况)
如果一定要把SVG放在content属性中,需要给伪元素补充三个属性:
vertical-align: middle修正基线对齐问题line-height: 1.25em和高度保持一致,避免行高撑开overflow: hidden避免SVG尺寸溢出
内容的提问来源于stack exchange,提问作者Sergio Jr
相关产品推荐
相关产品推荐

