天天看點

用SVG解決移動端1px的技巧

用SVG解決移動端1px的技巧

今天介紹一個通過svg來實作移動端1px效果的小技巧

SVG的描邊方式

通常我們在使用一些設計軟體時,描邊會有三種選擇,分别是内描邊、居中描邊和外描邊,比如 photoshop

那麼,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>      

可以看到,rect 的描邊是居中的,兩邊各是 5

0.5px的實作

根據上面的結論,如果 stroke-width 為 1 時,那麼就很輕松的被分成了兩邊各 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>      

可以用手機通路或者掃描以下網址體驗​​https://codepen.io/xboxyan/​​

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>");
}      

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>");
}      

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>");
}      

總結

以上就是幾個svg實作邊框的小技巧了,這裡是用background-image模拟的,比使用僞元素要友善的多,同時也不占據空間,算是相對完美的解決方案了~