一.思路
普通的1px黑色实线边框:css
border: 1px solid #000;
半像素边框固然不是简单地把1px改成0.5px(没测试过,可能会被解析成1或者0),border-width
的值只能是天然数css3
相似的,outline, box-shadow
等等也没有办法画出0.5px的细线web
常规思路是不可行的,咱们能够用伪元素 + 缩放巧妙地实现,具体步骤以下:浏览器
设置目标元素做为定位参照测试
.thinner-border { position: relative; /* 只要不是默认值static便可 */ }
给目标元素添加一个伪元素before或者after,并设置绝对定位spa
.thinner-border:before { content: ''; position: absolute; }
给伪元素添上1px的边框.net
border: 1px solid red;
设置伪元素的宽高为目标元素的2倍code
width: 200%; height: 200%;
缩小0.5倍(变回目标元素的大小)orm
transform-origin: 0 0; transform: scale(0.5, 0.5);
把border包进来blog
box-sizing: border-box;
简言之就是先放大再缩回来,border-box
是关键,不然边框不会一块儿缩放
二.具体实现
上面已经分步骤写得很清楚了,拼在一块儿就是完整实现:
.thinner-border { position: relative; } .thinner-border:before { content: ''; position: absolute; width: 200%; height: 200%; border: 1px solid #000; -webkit-transform-origin: 0 0; -moz-transform-origin: 0 0; -ms-transform-origin: 0 0; -o-transform-origin: 0 0; transform-origin: 0 0; -webkit-transform: scale(0.5, 0.5); -ms-transform: scale(0.5, 0.5); -o-transform: scale(0.5, 0.5); transform: scale(0.5, 0.5); -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
功能是给class值指定了thinner-border的block和inline-block元素添上半像素的边框,由于inline元素的width和height有一些限制,伪元素获取到的200%要比实际值小,边框的宽高也会比指望的小
三.Demo
1像素边框,block
半像素边框,block
1像素边框,inline 半像素边框,inline-block 半像素边框,inline,边框太窄
1/4像素边框
边框效果用移动浏览器看更明显,变化的是线宽而不是颜色
注意:虽然理论上边框能够任意细(1/n px),但因为存在精度的问题(精度影响边框的宽高),因此半像素边框是最有实用意义的,虽然也存在问题:若是宽高是奇数则边框位置会偏移0.5px,实际应用中尚可接受