使用svg描边来实现移动端1px

简介: 使用svg描边来实现移动端1px

svg的描边方式


通常我们在使用一些设计软件时,描边会有三种选择,分别是内描边居中描边外描边,比如 photoshop


image.png


那么,svg 中的描边是哪种方式呢?


答案是居中描边,并且无法更改,如下

<svg height="100px" viewBox="0 0 100 100">
    <rect x='10' y='10' width='40' height='40' fill='none' stroke-width='10' stroke='red' />
</svg>


image.png


可以看到,rect 的描边是居中的,两边各是 5


0.5px的实现


根据上面的结论,如果 stroke-width1 时,那么就很轻松的被分成了两边各 0.5,然后把外侧的部分截断就可以了


这里直接设置 rect 的宽高都为 100%,并且 svg 默认是超出隐藏的 (overflow:hidden),如下

<svg height="100px" viewBox="0 0 100 100">
    <rect width='100%' height='100%' fill='none' stroke-width='1' stroke='red' />
</svg>


这里对比一下1px的效果

<div style="box-sizing: border-box; width:100px;height:100px;border:1px solid red;"></div>


image.png

可以用手机访问或者扫描以下网址体验


https://codepen.io/xboxyan/pe...点击预览


image.png

svg作为背景使用


以上是直接使用 svg 标签,实际项目当然不能这样使用了,不过可以将svg 作为背景图片来使用,例如

div {
  background: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' fill='none' stroke-width='1' stroke='red' /></svg>");
}


很简单,在 svg 前面添加一段 data:image/svg+xml, 表示这是一张 svg格式的图片,和 base64 的写法比较类似,后面 svg 的属性


xmlns='http://www.w3.org/2000/svg'表示命名空间,暂时还不能去除,记住这层规律就可以了


当然在IE下,svg可能还需要转义才能正常显示,这里可以参考张鑫旭老师的这篇文章

下面来看几个案例


1. 1px分割线


这个在移动端特别常见,这里可以这样来实现,直接使用 line 画一条底部的线

p {
  background: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'><line x1='0' y1='100%' x2='100%' y2='100%' stroke='red' /></svg>");
}


效果如下

image.png


https://codepen.io/xboxyan/pe...点击预览


image.png


2. 1px边框


和分割线类似,只是用rect来画一个自适应的矩形,这里宽高均为 100%

div {
  background: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' fill='none' stroke='red' /></svg>");
}


效果如下

image.png

https://codepen.io/xboxyan/pe...点击预览

image.png

3. 1px带圆角的边框


常规方式实现带圆角的边框就无能为力了,svg 可以很轻松的实现,借助rx 属性,还有元素自身的border-radius就可以了

div {
  border-radius:5px;
  background: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' rx='5' fill='none' stroke='red' /></svg>");
}


效果如下


image.png

https://codepen.io/xboxyan/pe...点击预览


image.png

总结


以上就是几个svg实现边框的小技巧了,这里是用background-image模拟的,比使用伪元素要方便的多,同时也不占据空间,算是相对完美的解决方案了~

相关文章
|
6月前
(一)如何根据rgba刷成webgl的底色
(一)如何根据rgba刷成webgl的底色
|
前端开发
CSS:实现background-image背景图片全屏铺满自适应
CSS:实现background-image背景图片全屏铺满自适应
2272 0
|
前端开发
用svg实现一个环形进度条
用svg实现一个环形进度条
98 0
|
前端开发
【CSS】background-image背景图片全屏铺满自适应
【CSS】background-image背景图片全屏铺满自适应
149 0
CSS3 border-image 边框图片
CSS3 border-image 边框图片
69 0
|
前端开发
css:移动端实现1px、0.5px的细线
css:移动端实现1px、0.5px的细线
126 0
css:移动端实现1px、0.5px的细线
|
前端开发
css:border-radius绘制边框圆角-全圆和椭圆
css:border-radius绘制边框圆角-全圆和椭圆
139 0
css:border-radius绘制边框圆角-全圆和椭圆
|
API 容器
你真的了解background背景样式吗
你真的了解background背景样式吗
|
前端开发 iOS开发 Android开发
移动端 Retina屏border实现0.5px
首先来看一下造成Retina边框变粗的原因 其实这个原因很简单,因为css中的1px并不等于移动设备的1px,这些由于不同的手机有不同的像素密度。在window对象中有一个devicePixelRatio属性,他可以反应css中的像素与设备的像素比。
1588 0