AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

不一樣的SVG!SVG在 CSS 中的應用

來源: 責編: 時間:2024-04-08 17:19:57 161觀看
導讀介紹一些你可能沒用過的SVG小技巧。在平時開發中,很多時候都會用到SVG。大部分情況我們都不必關注SVG里面到底是什么,直接當成圖片資源引入就行,比如常見的圖標資源。我們可以通過多種方式使用這個特殊的圖片。<img src=

dXX28資訊網——每日最新資訊28at.com

介紹一些你可能沒用過的SVG小技巧。dXX28資訊網——每日最新資訊28at.com

在平時開發中,很多時候都會用到SVG。大部分情況我們都不必關注SVG里面到底是什么,直接當成圖片資源引入就行,比如常見的圖標資源。dXX28資訊網——每日最新資訊28at.com

dXX28資訊網——每日最新資訊28at.com

我們可以通過多種方式使用這個特殊的圖片。dXX28資訊網——每日最新資訊28at.com

<img%20src="a.svg">.icon{%20%20background:%20url("a.svg")}

甚至直接放到HTML中。dXX28資訊網——每日最新資訊28at.com

<div>%20%20<svg>%20%20 ...%20%20</svg></div>

這些都沒什么問題,但有時候,我們需要的是可以自適應尺寸的,比如像這樣的漸變邊框,尺寸會隨著文本內容的變化而變化,而不是固定尺寸,如下:dXX28資訊網——每日最新資訊28at.com

dXX28資訊網——每日最新資訊28at.com

或者是這樣的虛線漸變邊框。dXX28資訊網——每日最新資訊28at.com

dXX28資訊網——每日最新資訊28at.com

這樣的該如何用 SVG 動態實現呢,一起看看吧。dXX28資訊網——每日最新資訊28at.com

一、SVG導出的局限性

SVG通常不是手寫的(能手寫任意路徑的都是大神),幾乎都是設計師借助軟件繪制生成的,比如設計都很喜歡的Figma(對前端非常友好,可以嘗試一下)。dXX28資訊網——每日最新資訊28at.com

比如前面提到的漸變邊框,在Figma中就是這樣。dXX28資訊網——每日最新資訊28at.com

dXX28資訊網——每日最新資訊28at.com

對于設計師來說,漸變邊框很容易,只需要選擇邊框類型就行了。dXX28資訊網——每日最新資訊28at.com

dXX28資訊網——每日最新資訊28at.com

對于 CSS 來說,這還算一個比較麻煩的事,通常我們需要額外嵌套一層漸變背景,通過遮蓋或者mask裁切的方式實現,有興趣的可以嘗試一下,這里暫不展開。dXX28資訊網——每日最新資訊28at.com

那么,這個設計可以直接通過導出SVG實現嗎?dXX28資訊網——每日最新資訊28at.com

先試試,Figma中可以直接將這個邊框復制成SVG格式。dXX28資訊網——每日最新資訊28at.com

dXX28資訊網——每日最新資訊28at.com

下面是這段復制出來的SVG代碼(大概還是能看得懂一些的...)。dXX28資訊網——每日最新資訊28at.com

<svg%20width="41"%20height="25"%20viewBox="0%200%2041%2025"%20fill="none"%20xmlns="http://www.w3.org/2000/svg">%20%20<rect%20x="1"%20y="1"%20width="39"%20height="23"%20rx="4"%20stroke="url(#paint0_linear_1_2)"%20stroke-linecap="round"/>%20%20<defs>%20%20<linearGradient%20id="paint0_linear_1_2"%20x1="0"%20y1="0"%20x2="1"%20y2="0">%20%20 <stop%20stop-color="#FFD75A"/>%20%20 <stop%20offset="1"%20stop-color="#ED424B"/>%20%20</linearGradient>%20%20</defs></svg>

我們嘗試讓這段SVG尺寸跟隨button的大小,就行這樣。dXX28資訊網——每日最新資訊28at.com

<style>%20%20svg{%20%20%20%20position:%20absolute;%20%20%20%20inset:%200;%20%20}</style><button>%20%20CSS%20%20<svg>...</svg></button>

在內容不定的情況下,就變成了這樣。dXX28資訊網——每日最新資訊28at.com

dXX28資訊網——每日最新資訊28at.com

很顯然不行,因為生成的SVG寬高是固定的,沒法跟隨文本內容自適應尺寸。dXX28資訊網——每日最新資訊28at.com

既然 SVG很擅長漸變邊框,而 CSS很擅長自適應,那么,有沒有取長補短的辦法呢?dXX28資訊網——每日最新資訊28at.com

當然也是有的!不過需要“改造”一下,接著往下看。dXX28資訊網——每日最新資訊28at.com

二、SVG%20自適應尺寸

首先我們把上面的那段SVG拿過來。dXX28資訊網——每日最新資訊28at.com

<svg%20width="41"%20height="25"%20viewBox="0%200%2041%2025"%20fill="none"%20xmlns="http://www.w3.org/2000/svg">%20%20<rect%20x="1"%20y="1"%20width="39"%20height="23"%20rx="4"%20stroke="url(#paint0_linear_1_2)"%20stroke-linecap="round"/>%20%20<defs>%20%20<linearGradient%20id="paint0_linear_1_2"%20x1="0"%20y1="0"%20x2="1"%20y2="0">%20%20 <stop%20stop-color="#FFD75A"/>%20%20 <stop%20offset="1"%20stop-color="#ED424B"/>%20%20</linearGradient>%20%20</defs></svg>

有沒有發現這里很多數值都固定的?如果想實現自適應,我們就需要將這些值改成百分比形式,注意看這個rect,有個x、y坐標,我們現在寬高都是100%了,所以這里的坐標也要改成0,不然就撐出去了。dXX28資訊網——每日最新資訊28at.com

<svg%20width="100%"%20height="100%"%20viewBox="0%200%20100%%20100%"%20fill="none"%20xmlns="http://www.w3.org/2000/svg">%20%20<rect%20x="0"%20y="0"%20width="100%"%20height="100%"%20rx="4"%20stroke="url(#paint0_linear_1_2)"%20stroke-linecap="round"/>%20%20<defs>%20%20<linearGradient%20id="paint0_linear_1_2"%20x1="0"%20y1="0"%20x2="1"%20y2="0">%20%20 <stop%20stop-color="#FFD75A"/>%20%20 <stop%20offset="1"%20stop-color="#ED424B"/>%20%20</linearGradient>%20%20</defs></svg>

為了驗證這個 SVG的自適應,我們將這個SVG放在一個div中。dXX28資訊網——每日最新資訊28at.com

<div%20style="width:%20100px;height:%2080px;">%20%20<svg>...</svg></div><div%20style="width:%20200px;height:%20180px;">%20%20<svg>...</svg></div>

效果如下:dXX28資訊網——每日最新資訊28at.com

dXX28資訊網——每日最新資訊28at.com

是不是已經自適應了?dXX28資訊網——每日最新資訊28at.com

不過還是有點問題,仔細觀察,圓角處有些不自然,感覺被裁剪了一樣。dXX28資訊網——每日最新資訊28at.com

dXX28資訊網——每日最新資訊28at.com

造成這種現象的原因有兩個:dXX28資訊網——每日最新資訊28at.com

SVG描邊是居中描邊,并且不可修改。SVG默認是超出隱藏的,也就是自帶overflow:hidden。

我們把邊框改大一點就可以很明顯的觀察到描邊是居中的。dXX28資訊網——每日最新資訊28at.com

dXX28資訊網——每日最新資訊28at.com

由于是居中的,所以在不做修改的情況下,我們看到的其實只有原邊框的一半,利用這個原理我們其實可以實現常說的0.5px邊框。dXX28資訊網——每日最新資訊28at.com

在這里,我再介紹一種新的方式,那就是利用 CSS%20calc !dXX28資訊網——每日最新資訊28at.com

沒錯,在 SVG中也可以使用CSS函數,比如我們這里邊框是4px,那么坐標x、y就應該是2,然后寬高應該是calc(100%%20-%204px),所以可以很自然的改成這樣。dXX28資訊網——每日最新資訊28at.com

<div%20style="width:%20100px;height:%2080px;">%20%20<svg%20width="100%"%20height="100%">%20%20%20%20<rect%20x="2"%20y="2"%20width="100%"%20height="100%"%20style="width:%20calc(100%%20-%204px);height:%20calc(100%%20-%204px);"%20%20rx="4"%20stroke="url(#paint0_linear_1_2)"%20stroke-width="4"%20stroke-linecap="round"/>%20%20%20%20%20<defs>%20%20%20%20<linearGradient%20id="paint0_linear_1_2"%20x1="0"%20y1="0"%20x2="1"%20y2="0">%20%20%20%20%20%20<stop%20stop-color="#FFD75A"/>%20%20%20%20%20%20<stop%20offset="1"%20stop-color="#ED424B"/>%20%20%20%20</linearGradient>%20%20%20%20</defs>%20%20</svg></div>

非常完美了,不會有任何裁剪!(大家也可以復制上面這段代碼放在%20HTML%20中驗證)。dXX28資訊網——每日最新資訊28at.com

dXX28資訊網——每日最新資訊28at.com

這樣就“輕易”實現了SVG的尺寸自適應。dXX28資訊網——每日最新資訊28at.com

這里小結一下dXX28資訊網——每日最新資訊28at.com

將SVG的尺寸改為`百分比。由于是居中描邊,所以要修正一下坐標和大小。

除此之外,還能直接加上style樣式,就像這樣。dXX28資訊網——每日最新資訊28at.com

<svg%20width="100%"%20height="100%"%20viewBox="0%200%20100%%20100%"%20fill="none"%20xmlns="http://www.w3.org/2000/svg">%20%20<style>%20%20%20%20rect{%20%20%20%20%20%20width:%20calc(100%%20-%204px);%20%20%20%20%20%20height:%20calc(100%%20-%204px);%20%20%20%20}%20%20</style>%20%20<rect%20x="2"%20y="2"%20width="100%"%20height="100%"%20rx="4"%20stroke="url(#paint0_linear_1_2)"%20stroke-width="4"%20stroke-linecap="round"/>%20%20<defs>%20%20%20%20<linearGradient%20id="paint0_linear_1_2"%20x1="0"%20y1="0"%20x2="1"%20y2="0">%20%20%20%20%20%20<stop%20stop-color="#FFD75A"/>%20%20%20%20%20%20<stop%20offset="1"%20stop-color="#ED424B"/>%20%20%20%20</linearGradient>%20%20</defs></svg>

雖然看著多,但后面作用更大,可以添加更多的 CSS 樣式。dXX28資訊網——每日最新資訊28at.com

三、SVG%20在%20HTML%20中的應用

其實前面的這段 SVG 可以直接放到 HTML 中用了,比如:dXX28資訊網——每日最新資訊28at.com

<button>%20%20<svg%20width="100%"%20height="100%"%20fill="none"%20xmlns="http://www.w3.org/2000/svg">%20%20%20%20<rect%20x="2"%20y="2"%20width="100%"%20height="100%"%20style="width:%20calc(100%%20-%204px);height:%20calc(100%%20-%204px);"%20rx="16"%20stroke-width="2"%20stroke="url(#paint0_linear_3269_5233)"/>%20%20%20%20<defs>%20%20%20%20%20%20<linearGradient%20id="paint0_linear_3269_5233"%20x1="0"%20y1="0"%20x2="100%"%20y2="100%"%20gradientUnits="userSpaceOnUse">%20%20%20%20%20%20%20%20<stop%20stop-color="#FFD75A"/>%20%20%20%20%20%20%20%20<stop%20offset="1"%20stop-color="#ED424B"/>%20%20%20%20%20%20</linearGradient>%20%20%20%20</defs>%20%20</svg>%20%20CSS</button>

我們需要將這個 SVG撐滿整個button,所以可以直接絕對定位。dXX28資訊網——每日最新資訊28at.com

button{%20%20position:%20relative;}button>svg{%20%20position:%20absolute;%20%20inset:%200;}

這樣就得到了一個自適應尺寸的、帶有漸變邊框的按鈕,效果如下:dXX28資訊網——每日最新資訊28at.com

dXX28資訊網——每日最新資訊28at.com

你也可以訪問在線鏈接:buton%20with%20SVG%20(juejin.cn)[1]dXX28資訊網——每日最新資訊28at.com

四、SVG%20在%20CSS%20中的應用

不知道你有沒有這樣的感覺,把一大段 SVG放在 HTML不是特別優雅,總覺得太臃腫了。dXX28資訊網——每日最新資訊28at.com

如果你有這種感覺,不妨將這段 SVG轉換成內聯CSS代碼。dXX28資訊網——每日最新資訊28at.com

在這里可以借助張鑫旭老師的這個工具:SVG在線壓縮合并工具[2]dXX28資訊網——每日最新資訊28at.com

dXX28資訊網——每日最新資訊28at.com

我們將這段SVG粘貼過去,可以得到這樣的一段內聯SVG。dXX28資訊網——每日最新資訊28at.com

data:image/svg+xml,%3Csvg%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3E%3Crect%20x='1'%20y='1'%20width='100%25'%20height='100%25'%20style='width:calc(100%25%20-%202px);height:calc(100%25%20-%202px)'%20rx='16'%20stroke-width='2'%20stroke='url(%23paint0_linear_3269_5233)'/%3E%3Cdefs%3E%3ClinearGradient%20id='paint0_linear_3269_5233'%20y2='100%25'%20gradientUnits='userSpaceOnUse'%3E%3Cstop%20stop-color='%23FFD75A'/%3E%3Cstop%20offset='1'%20stop-color='%23ED424B'/%3E%3C/linearGradient%3E%3C/defs%3E%3C/svg%3E

有了這段內聯SVG,我們可以直接用在background背景上。dXX28資訊網——每日最新資訊28at.com

button{%20%20background:%20url("data:image/svg+xml,%3Csvg%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3E%3Crect%20x='1'%20y='1'%20width='100%25'%20height='100%25'%20style='width:calc(100%25%20-%202px);height:calc(100%25%20-%202px)'%20rx='16'%20stroke-width='2'%20stroke='url(%23paint0_linear_3269_5233)'/%3E%3Cdefs%3E%3ClinearGradient%20id='paint0_linear_3269_5233'%20y2='100%25'%20gradientUnits='userSpaceOnUse'%3E%3Cstop%20stop-color='%23FFD75A'/%3E%3Cstop%20offset='1'%20stop-color='%23ED424B'/%3E%3C/linearGradient%3E%3C/defs%3E%3C/svg%3E")}

而HTML只需要干凈的button元素就夠了。dXX28資訊網——每日最新資訊28at.com

<button>CSS</button><button>CSS%20&%20SVG</button>

神奇的是,即便是轉為內聯了,SVG仍然保持著自適應特性,這樣也能實現同樣的效果,是不是好多了?dXX28資訊網——每日最新資訊28at.com

dXX28資訊網——每日最新資訊28at.com

你也可以訪問在線鏈接:button%20with%20SVG%20background%20(juejin.cn)[3]dXX28資訊網——每日最新資訊28at.com

五、SVG%20的獨特魅力

如果說上面的效果 CSS 還能勉強模擬一下,那如果是這樣的虛線呢?dXX28資訊網——每日最新資訊28at.com

dXX28資訊網——每日最新資訊28at.com

對于 SVG 就非常容易了,只需要設置stroke-dasharray屬性就行,并且可以隨意更改虛線的間隔。dXX28資訊網——每日最新資訊28at.com

<svg%20width="100%"%20height="100%"%20fill="none"%20xmlns="http://www.w3.org/2000/svg">%20%20<rect%20x="2"%20y="2"%20width="100%"%20height="100%"%20style="width:%20calc(100%%20-%204px);height:%20calc(100%%20-%204px);"%20rx="16"%20stroke-width="2"%20stroke="url(#paint0_linear_3269_5233)"%20%20stroke-dasharray="8%204"/>%20%20<defs>%20%20%20%20<linearGradient%20id="paint0_linear_3269_5233"%20x1="0"%20y1="0"%20x2="100%"%20y2="100%"%20gradientUnits="userSpaceOnUse">%20%20%20%20%20%20<stop%20stop-color="#FFD75A"/>%20%20%20%20%20%20<stop%20offset="1"%20stop-color="#ED424B"/>%20%20%20%20</linearGradient>%20%20</defs></svg>

還有這種虛線邊緣是圓角的情況,CSS就更加無能為力了。dXX28資訊網——每日最新資訊28at.com

dXX28資訊網——每日最新資訊28at.com

SVG只需要設置stroke-linecap就行。dXX28資訊網——每日最新資訊28at.com

<svg%20width="100%"%20height="100%"%20fill="none"%20xmlns="http://www.w3.org/2000/svg">%20%20<rect%20x="2"%20y="2"%20width="100%"%20height="100%"%20style="width:%20calc(100%%20-%204px);height:%20calc(100%%20-%204px);"%20stroke-width="2"%20rx="16"%20stroke-linecap="round"%20%20stroke="url(#paint0_linear_3269_5233)"%20%20stroke-dasharray="8%206"/>%20%20<defs>%20%20%20%20<linearGradient%20id="paint0_linear_3269_5233"%20x1="0"%20y1="0"%20x2="100%"%20y2="100%"%20gradientUnits="userSpaceOnUse">%20%20%20%20%20%20<stop%20stop-color="#FFD75A"/>%20%20%20%20%20%20<stop%20offset="1"%20stop-color="#ED424B"/>%20%20%20%20</linearGradient>%20%20</defs></svg>

更進一步,SVG還能實現虛線滾動動畫,CSS 應該是實現不了了。dXX28資訊網——每日最新資訊28at.com

dXX28資訊網——每日最新資訊28at.com

看似復雜,其實只需要改變stroke-dashoffset屬性就行了,我們可以直接在SVG中插入CSS動畫。dXX28資訊網——每日最新資訊28at.com

<svg width="100%" height="100%" fill="none" xmlns="http://www.w3.org/2000/svg">  <style>    .rect{      width: calc(100% - 4px);      height: calc(100% - 4px);      animation: move .3s infinite linear;    }    @keyframes move {      0% { stroke-dashoffset: 0; }      100% { stroke-dashoffset: 14; }    }  </style>  <rect class="rect" x="2" y="2" width="100%" height="100%" stroke-width="2" rx="16" stroke-linecap="round"  stroke="url(#paint0_linear_3269_5233)"  stroke-dasharray="8 6"/>  <defs>    <linearGradient id="paint0_linear_3269_5233" x1="0" y1="0" x2="100%" y2="100%" gradientUnits="userSpaceOnUse">      <stop stop-color="#FFD75A"/>      <stop offset="1" stop-color="#ED424B"/>    </linearGradient>  </defs></svg>

所有情況都可以將 SVG轉為內聯CSS直接用在背景上,極大的保證了HTML的簡潔性。dXX28資訊網——每日最新資訊28at.com

你也可以訪問在線鏈接:dot border with animation (juejin.cn)[4]dXX28資訊網——每日最新資訊28at.com

六、總結一下

以上就是本文的全部內容了,主要介紹了如何利用 SVG和CSS各種的優勢來實現更加靈活的布局,下面總結一下:dXX28資訊網——每日最新資訊28at.com

  • 設計軟件導出的SVG都是固定尺寸的,不能自適應尺寸。
  • SVG很擅長漸變邊框,而CSS很擅長自適應尺寸,得想辦法取長補短。
  • SVG部分屬性支持百分比類型,可以實現尺寸自適應。
  • SVG描邊是居中描邊,并且不可修改,所以需要調整圓角矩形的坐標的大小。
  • SVG中也支持 CSS部分特性,比如calc計算函數。
  • SVG還支持內嵌style標簽,直接插入CSS代碼。
  • 可以將SVG轉為內聯CSS代碼,在支持SVG特性的同時極大的保證了HTML的整潔。
  • 借助SVG可以很輕松的實現漸變虛線邊框。
  • SVG中還支持CSS動畫,可以實現虛線滾動動畫。

你可能已經發現SVG并不是非常孤立的一門語言,現在還能和 CSS、HTML聯動起來,充分發揮各自的優勢,這樣才能事半功倍 。dXX28資訊網——每日最新資訊28at.com

[1]buton with SVG (juejin.cn): https://code.juejin.cn/pen/7341373491785236532。dXX28資訊網——每日最新資訊28at.com

[2]SVG在線壓縮合并工具: https://www.zhangxinxu.com/sp/svgo/。dXX28資訊網——每日最新資訊28at.com

[3]button with SVG background (juejin.cn): https://code.juejin.cn/pen/7341378448348643379。dXX28資訊網——每日最新資訊28at.com

[4]dot border with animation (juejin.cn): https://code.juejin.cn/pen/7341382517888876582。dXX28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-82040-0.html不一樣的SVG!SVG在 CSS 中的應用

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Java中的String,這一篇就夠了

下一篇: Springboot 3.1.x:快速掌握事件驅動的實用技巧

標簽:
  • 熱門焦點
  • 中興AX5400Pro+上手體驗:再升級 雙2.5G網口+USB 3.0這次全都有

    2021年11月的時候,中興先后發布了兩款路由器產品,中興AX5400和中興AX5400 Pro,從產品命名上就不難看出這是隸屬于同一系列的,但在外觀設計上這兩款產品可以說是完全沒一點關系
  • 6月安卓手機好評榜:魅族20 Pro蟬聯冠軍

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年6月1日至6月30日,僅限國內市場。第一名:魅族20 Pro好評率:95%5月份的時候魅族20 Pro就是
  • Java NIO內存映射文件:提高文件讀寫效率的優秀實踐!

    Java的NIO庫提供了內存映射文件的支持,它可以將文件映射到內存中,從而可以更快地讀取和寫入文件數據。本文將對Java內存映射文件進行詳細的介紹和演示。內存映射文件概述內存
  • JVM優化:實戰OutOfMemoryError異常

    一、Java堆溢出堆內存中主要存放對象、數組等,只要不斷地創建這些對象,并且保證 GC Roots 到對象之間有可達路徑來避免垃 圾收集回收機制清除這些對象,當這些對象所占空間超過
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業發布的ESG報告。ESG是&ldquo;環境保
  • 網紅炒股不為了賺錢,那就是耍流氓!

    來源:首席商業評論6月26日高調宣布入市,網絡名嘴大v胡錫進居然進軍了股市。在一次財經媒體峰會上,幾個財經圈媒體大佬就&ldquo;胡錫進炒股是否知道認真報道&rdquo;展開討論。有
  • 8月見!小米MIX Fold 3獲得3C認證:支持67W快充

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都得到了不少爆料,而小米新一代折疊屏旗艦——小米MIX Fold 3此前也屢屢被傳
  • 國行版三星Galaxy Z Fold5/Z Flip5發布 售價7499元起

    2023年8月3日,三星電子舉行Galaxy新品中國發布會,正式在國內推出了新一代折疊屏智能手機三星Galaxy Z Fold5與Galaxy Z Flip5,以及三星Galaxy Tab S9
  • Android 14發布:首批適配機型公布

    5月11日消息,谷歌在今天凌晨舉行了I/O大會,本次發布會谷歌帶來了自家的AI語言模型PaLM 2、谷歌Pixel Fold折疊屏、谷歌Pixel 7a手機,同時發布了Androi
Top