在IE6+中,是否可能有一条比1像素更细的边框,不是图片,并且在视觉上正确呈现?
谢谢。
在IE6+中,是否可能有一条比1像素更细的边框,不是图片,并且在视觉上正确呈现?
谢谢。
编辑:我忽略了IE6的限制,但我将答案留在这里供他人参考...
可以使用transform:scale(0.5)
,并在内部放置一个具有border:1px;
的边框元素来实现。因此,您会得到一条半像素的边框(虽然是受欺骗和依赖于浏览器),但它会显示在屏幕上。但我用这个技巧来打印。
当然,您必须调整元素的内容或玩弄position
。
.outer {
border:1px solid green;
}
.halfpix {
-ms-transform-origin: 0 0;
-webkit-transform-origin: 0 0;
transform-origin: 0 0;
-ms-transform:scale(0.5);
-webkit-transform:scale(0.5);
transform:scale(0.5);
width:200px;
height:100px;
border:1px solid black;
}
<div class="outer">
<div class="halfpix">
</div>
zoom browser window if your browser does not display
</div>
scaleX(0.5)
或 scaleY(0.5)
来仅在一个维度上进行缩放,非常好的答案! - M3RS我认为你可以使用像em
这样的单位定义边框的宽度,这将小于1像素,并且是有效的。然而,就像Will Martin所说的那样,出于显示目的,它会将其四舍五入到整个像素。
.thin {
border: 1px solid white;
box-shadow: 0 0 1px black;
}
不行。因为像素是显示器的基本单位,所以你不能显示小于一个像素的大小。而且,我所知道的任何浏览器都不允许您指定子像素宽度。它们只会被四舍五入到1px或向下取整到0px。
虽然目前在IE或Edge的任何版本中都不可能实现,但在最新版本的Firefox和Chrome中,您现在可以使用小于1px的边框宽度值。
.borderTest {
box-sizing: border-box;
display: block;
margin: 0.5em;
padding: 0.5em;
width: calc( 100% - 1em );
}
.borderTest:nth-child(1){
border: 1px solid #000
}
.borderTest:nth-child(2){
border: 0.75px solid #000
}
.borderTest:nth-child(3){
border: 0.5px solid #000
}
.borderTest:nth-child(4){
border: 0.25px solid #000
}
<div class="borderTest">1px</div>
<div class="borderTest">0.75px</div>
<div class="borderTest">0.5px</div>
<div class="borderTest">0.25px</div>
/* Fallback: Most browsers now render 0.5px as 1px though */
.el {
border: 1px solid red;
}
.retina .el {
border: 0.5px solid red;
}
.retina-chrome .el {
box-shadow: 0 0 0 0.5px red;
}
if (window.devicePixelRatio >= 2) {
document.documentElement.classList.add(
window.chrome ? 'retina-chrome' : 'retina'
);
}
对于@1x的显示屏,使用稍浅的颜色1像素边框。
编辑:Chrome 98(2022年2月1日)直接支持小于1px的border-width
值。
截至2020年中期,当前版本的Safari和Firefox都支持border-width: .5px
。
另一方面,Chrome将其视为1px
。
您可以使用类似以下代码检测浏览器是否支持:
var el = document.createElement('div');
el.style.position = 'fixed';
el.style.borderTop = '.5px solid';
document.body.appendChild(el);
var hasSubpixelBorder = el.getBoundingRect().height < 1;
document.body.removeChild(el);
如果您在启动时进行此操作,请确保在创建document.body
之后调用。
如果不支持此操作(例如Chrome),则可以向document.body
或某个父元素添加类,以使后代元素采用不同的边框样式:
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 2dppx) {
.noSubpixelBorder .border-top {
border-top-width: 0;
background-image: linear-gradient(180deg, var(--mycolor) 0, var(--mycolor) .5px, transparent 0);
}
}
@media (-webkit-min-device-pixel-ratio: 3) and (-webkit-max-device-pixel-ratio: 3.5), (min-resolution: 3dppx) and (max-resolution: 3.5dppx) {
.noSubpixelBorder .border-top {
background-image: linear-gradient(180deg, var(--mycolor) 0, var(--mycolor) .333333px, transparent 0);
}
}
你可以像这样转换该行:
.thin{ -ms-transform:scale(1, 0.5); -webkit-transform:scale(1, 0.5); transform:scale(1, 0.5);}
.thin{ -ms-transform:scale(0.5, 1); -webkit-transform:scale(0.5, 1); transform:scale(0.5, 1);}
box-shadow: 0px 0px 1px 0px black;
尝试
border-top: 1px solid #c9d6df;
小于
border: 1px solid #c9d6df;