在PC端用1px的边框线,看起来还好,但在手机端看起来就很难看了,而0.5px的分割线会有种精致的感觉。用普通写法border:solid 0.5px red;iPhone可以正常显示,android下几乎所有的浏览器都会把0.5识别为0,即无边框状态.
原理
原理就是给需要加边框的元素插入一个伪类,伪类采用绝对定位,然后对伪类添加1px边框,最后进行0.5倍缩放。
transform的缩放和旋转默认都是按照元素的中心点来操作的
outline元素在缩放0.5之前尺寸就是红框元素,缩放后,位置到了红框中心,为了使之依然在左上角,缩放之前我们需进行left:-50%;top:-50%的位移。
0.5px边框
<div class="first"> <div class="first-div"> HELLO WORLD </div></div><style>.first{ position: relative; font-size: 16px;}.first .first-div:before{ content: ""; position: absolute; top: -50%; bottom: -50%; left: -50%; right: -50%; width: 200%; height: 200%; -webkit-transform: scale(0.5); transform: scale(0.5); border: solid 1px red; box-sizing:border-box;}</style> |
副作用
当用伪类的绝对定位来实现了边框后,我们在first类和first-div类上的点击事件会失效,因为此时的伪类是绝对定位,而且长宽等于父类元素的长宽,是脱离了文档流覆盖在父类上的,伪类不是真实的DOM元素,没有js点击事件
解决方案
再写一个绝对定位元素,覆盖在父元素上,层级优先级要高一点
<div class="first"> <div class="first-div"> HELLO WORLD </div> <div class="click-able" onclick="alert('click')"></div></div><style>.first{ position: relative; font-size: 16px;}.first .first-div:before{ content: ""; position: absolute; top: -50%; bottom: -50%; left: -50%; right: -50%; width: 200%; height: 200%; -webkit-transform: scale(0.5); transform: scale(0.5); border: solid 1px red; box-sizing:border-box;}.click-able{ position: absolute; top: 0; bottom: 0; left: 0; right: 0; z-index: 10;} </style> |
0.5px圆角边框
<div class="round"> <div class="round-div"> HELLO WORLD </div></div><style>.round{ position: relative; font-size: 16px; }.round .round-div:before{ content: ""; position: absolute; top: -50%; bottom: -50%; left: -50%; right: -50%; width: 200%; height: 200%; -webkit-transform: scale(0.5); transform: scale(0.5); border: solid 1px red; border-radius: 22px; box-sizing:border-box;}</style> |