国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

開發 前端
SVG通常不是手寫的(能手寫任意路徑的都是大神),幾乎都是設計師借助軟件繪制生成的,比如設計都很喜歡的Figma(對前端非常友好,可以嘗試一下)。

介紹一些你可能沒用過的SVG小技巧。

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

我們可以通過多種方式使用這個特殊的圖片。

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

甚至直接放到HTML中。

<div>
  <svg>
  	...
  </svg>
</div>

這些都沒什么問題,但有時候,我們需要的是可以自適應尺寸的,比如像這樣的漸變邊框,尺寸會隨著文本內容的變化而變化,而不是固定尺寸,如下:

或者是這樣的虛線漸變邊框。

這樣的該如何用 SVG 動態實現呢,一起看看吧。

一、SVG導出的局限性

SVG通常不是手寫的(能手寫任意路徑的都是大神),幾乎都是設計師借助軟件繪制生成的,比如設計都很喜歡的Figma(對前端非常友好,可以嘗試一下)。

比如前面提到的漸變邊框,在Figma中就是這樣。

對于設計師來說,漸變邊框很容易,只需要選擇邊框類型就行了。

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

那么,這個設計可以直接通過導出SVG實現嗎?

先試試,Figma中可以直接將這個邊框復制成SVG格式。

下面是這段復制出來的SVG代碼(大概還是能看得懂一些的...)。

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

我們嘗試讓這段SVG尺寸跟隨button的大小,就行這樣。

<style>
  svg{
    position: absolute;
    inset: 0;
  }
</style>
<button>
  CSS
  <svg>...</svg>
</button>

在內容不定的情況下,就變成了這樣。

很顯然不行,因為生成的SVG寬高是固定的,沒法跟隨文本內容自適應尺寸。

既然 SVG很擅長漸變邊框,而 CSS很擅長自適應,那么,有沒有取長補短的辦法呢?

當然也是有的!不過需要“改造”一下,接著往下看。

二、SVG 自適應尺寸

首先我們把上面的那段SVG拿過來。

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

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

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

為了驗證這個 SVG的自適應,我們將這個SVG放在一個div中。

<div style="width: 100px;height: 80px;">
  <svg>...</svg>
</div>

<div style="width: 200px;height: 180px;">
  <svg>...</svg>
</div>

效果如下:

是不是已經自適應了?

不過還是有點問題,仔細觀察,圓角處有些不自然,感覺被裁剪了一樣。

造成這種現象的原因有兩個:

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

我們把邊框改大一點就可以很明顯的觀察到描邊是居中的。

由于是居中的,所以在不做修改的情況下,我們看到的其實只有原邊框的一半,利用這個原理我們其實可以實現常說的0.5px邊框。

在這里,我再介紹一種新的方式,那就是利用 CSS calc !

沒錯,在 SVG中也可以使用CSS函數,比如我們這里邊框是4px,那么坐標x、y就應該是2,然后寬高應該是calc(100% - 4px),所以可以很自然的改成這樣。

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

非常完美了,不會有任何裁剪!(大家也可以復制上面這段代碼放在 HTML 中驗證)。

這樣就“輕易”實現了SVG的尺寸自適應。

這里小結一下

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

除此之外,還能直接加上style樣式,就像這樣。

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

雖然看著多,但后面作用更大,可以添加更多的 CSS 樣式。

三、SVG 在 HTML 中的應用

其實前面的這段 SVG 可以直接放到 HTML 中用了,比如:

<button>
  <svg width="100%" height="100%" fill="none" xmlns="http://www.w3.org/2000/svg">
    <rect x="2" y="2" width="100%" height="100%" style="width: calc(100% - 4px);height: calc(100% - 4px);" rx="16" stroke-width="2" stroke="url(#paint0_linear_3269_5233)"/>
    <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>
  CSS
</button>

我們需要將這個 SVG撐滿整個button,所以可以直接絕對定位。

button{
  position: relative;
}
button>svg{
  position: absolute;
  inset: 0;
}

這樣就得到了一個自適應尺寸的、帶有漸變邊框的按鈕,效果如下:

你也可以訪問在線鏈接:buton with SVG (juejin.cn)[1]

四、SVG 在 CSS 中的應用

不知道你有沒有這樣的感覺,把一大段 SVG放在 HTML不是特別優雅,總覺得太臃腫了。

如果你有這種感覺,不妨將這段 SVG轉換成內聯CSS代碼。

在這里可以借助張鑫旭老師的這個工具:SVG在線壓縮合并工具[2]

我們將這段SVG粘貼過去,可以得到這樣的一段內聯SVG。

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

有了這段內聯SVG,我們可以直接用在background背景上。

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

而HTML只需要干凈的button元素就夠了。

<button>CSS</button>
<button>CSS & SVG</button>

神奇的是,即便是轉為內聯了,SVG仍然保持著自適應特性,這樣也能實現同樣的效果,是不是好多了?

你也可以訪問在線鏈接:button with SVG background (juejin.cn)[3]

五、SVG 的獨特魅力

如果說上面的效果 CSS 還能勉強模擬一下,那如果是這樣的虛線呢?

對于 SVG 就非常容易了,只需要設置stroke-dasharray屬性就行,并且可以隨意更改虛線的間隔。

<svg width="100%" height="100%" fill="none" xmlns="http://www.w3.org/2000/svg">
  <rect x="2" y="2" width="100%" height="100%" style="width: calc(100% - 4px);height: calc(100% - 4px);" rx="16" stroke-width="2" stroke="url(#paint0_linear_3269_5233)"  stroke-dasharray="8 4"/>
  <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>

還有這種虛線邊緣是圓角的情況,CSS就更加無能為力了。

SVG只需要設置stroke-linecap就行。

<svg width="100%" height="100%" fill="none" xmlns="http://www.w3.org/2000/svg">
  <rect x="2" y="2" width="100%" height="100%" style="width: calc(100% - 4px);height: calc(100% - 4px);" 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 應該是實現不了了。

看似復雜,其實只需要改變stroke-dashoffset屬性就行了,我們可以直接在SVG中插入CSS動畫。

<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的簡潔性。

你也可以訪問在線鏈接:dot border with animation (juejin.cn)[4]

六、總結一下

以上就是本文的全部內容了,主要介紹了如何利用 SVG和CSS各種的優勢來實現更加靈活的布局,下面總結一下:

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

你可能已經發現SVG并不是非常孤立的一門語言,現在還能和 CSS、HTML聯動起來,充分發揮各自的優勢,這樣才能事半功倍 。

[1]buton with SVG (juejin.cn): https://code.juejin.cn/pen/7341373491785236532。

[2]SVG在線壓縮合并工具: https://www.zhangxinxu.com/sp/svgo/。

[3]button with SVG background (juejin.cn): https://code.juejin.cn/pen/7341378448348643379。

[4]dot border with animation (juejin.cn): https://code.juejin.cn/pen/7341382517888876582。

責任編輯:姜華 來源: 前端偵探
相關推薦

2024-05-16 10:35:09

SVGCSS背景平鋪

2012-03-07 17:24:10

戴爾咨詢

2012-12-20 10:17:32

IT運維

2016-05-09 18:40:26

VIP客戶緝拿

2017-05-25 15:02:46

聯宇益通SD-WAN

2015-10-19 12:33:01

華三/新IT

2009-07-07 10:44:14

多態

2018-05-09 15:42:24

新零售

2009-12-01 16:42:27

Gentoo Linu

2009-02-04 15:43:45

敏捷開發PHPFleaPHP

2009-06-12 15:26:02

2011-02-28 10:38:13

Windows 8

2016-03-24 18:51:40

2013-01-11 18:10:56

軟件

2015-08-25 09:52:36

云計算云計算產業云計算政策

2009-01-20 10:39:00

Windows7IE 8瀏覽器

2015-08-04 14:49:54

Discover

2019-01-03 14:39:08

Oracle甲骨文ORACLE

2022-05-05 21:47:32

Linuxls 命令

2009-11-26 13:16:25

Open Suse
點贊
收藏

51CTO技術棧公眾號

第一av在线| 欧美伦理影院| 久热在线中文字幕色999舞| 中文字幕在线高清| 精品国产百合女同互慰| 国产黄色大片在线观看| 91精品黄色片免费大全| 浪潮av一区| 亚洲国产精品高清久久久| 伊人成综合网站| 亚洲女成人图区| 成人国产精品一区二区免费麻豆 | 亚洲一区中文字幕| 99精品美女| 国产精品福利网站| 国产91精品一区二区麻豆网站| 国产在线观看一区| 久热成人在线视频| 免费无码国产v片在线观看| av电影在线观看不卡| 艹b视频在线观看| 亚洲国产一区二区三区青草影视| 午夜欧美福利视频| 欧美1区2区| 亚洲图片都市激情| 久久久99精品免费观看| 五月天最新网址| 欧美性xxxxxxxxx| 秋霞午夜在线观看| 国产亚洲视频在线观看| 黄色在线免费观看网站| 乱色588欧美| 欧美性做爰猛烈叫床潮| av影片在线一区| 日韩成人在线资源| www.日韩大片| 在线免费观看h| 亚洲人午夜精品免费| 韩国成人在线| 中文字幕久精品免费视频| 国产精品一区三区| 麻豆免费在线视频| 狠狠色综合色区| 亚洲图片你懂的| 蜜臀久久精品| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 欧美精品一二| 怡红院av亚洲一区二区三区h| 一区二区在线免费观看| 国产 欧美 日韩 一区| 欧美一区二区精美| sdde在线播放一区二区| 国产成人久久婷婷精品流白浆| 日韩免费一区二区| 女同久久另类99精品国产| 国产色视频网站| 国产www精品| 国产午夜亚洲精品午夜鲁丝片 | 久久久久久亚洲综合影院红桃 | 欧美丰满一区二区免费视频| 欧美色123| 日本福利片高清在线观看| 45www国产精品网站| 成人午夜免费av| 岛国在线视频网站| 精品免费日产一区一区三区免费| 夜夜精品浪潮av一区二区三区| 欧美伊人亚洲伊人色综合动图| 狠狠躁夜夜躁人人爽超碰91| 99久久精品费精品国产风间由美| 色哟哟免费网站| 亚洲国产天堂久久综合| 欧美激情另类| x88av蜜桃臀一区二区| 欧美在线视频一区| 欧美一区二区三区在线视频| 三级亚洲高清视频| 变态调教一区二区三区| 欧美色视频日本高清在线观看| 蜜臀av一区二区三区| 欧美成人黄色网址| y97精品国产97久久久久久| 国产精一区二区三区| 婷婷综合电影| 中文字幕一区久| 婷婷综合影院| 97人人澡人人爽| 欧美中文字幕一区| 伊人精品视频| 天堂中文最新版在线中文| 日韩欧美一区二区三区四区五区| 中文字幕亚洲欧美在线不卡| av久久网站| 超碰免费97在线观看| 亚洲黄色av网址| 国产精品日韩一区二区免费视频| 欧美视频三区在线播放| 国产综合久久久久久鬼色| xxxxxx欧美| 成人免费视频91| 日日骚一区二区网站| 正在播放亚洲| 岛国视频一区免费观看| 成人a区在线观看| 一区二区在线影院| 四虎亚洲精品| 青青草国产精品视频| 26uuu精品一区二区| 欧美91精品| 91视频一区| 国产97在线 | 亚洲| 日韩精品一线二线三线| 97视频免费在线看| 91超碰这里只有精品国产| 成人福利视频在线看| 成人激情久久| 久久精品九色| 国产经典一区| 草莓福利社区在线| 欧美理论片在线播放| 免费国产黄色网址| 2019国产精品视频| 国内精品久久久久久中文字幕| 亚洲欧美日韩人成在线播放| 久久久久久影院| 色综合天天色| 伦理片一区二区三区| 欧美人动性xxxxz0oz| 欧美aaaaa性bbbbb小妇| 天天综合在线观看| 在线观看免费黄色| 亚洲a∨一区二区三区| 国产精品88a∨| 欧美高跟鞋交xxxxhd| 日本美女视频一区二区| 亚洲视频精选| 日韩激情电影免费看| 黄色av免费在线看| 尤物视频网站在线观看| 日韩精品视频一二三| 97超碰在线视| 777久久久精品一区二区三区| 欧美成人高潮一二区在线看| 日本精品免费视频| 蜜臀av午夜一区二区三区| 黄色免费视频大全| av免费播放| 国内av一区二区三区| 欧美裸体视频| 欧美性www| 激情小说亚洲色图| 精品国产123区| 欧美激情在线| 青青草91视频| 亚洲男人网站| 国产经典欧美精品| 日本一区二区三区高清不卡| 日韩中文字幕av电影| 国产精品无码乱伦| 一级特黄性色生活片| 美脚恋feet久草欧美| 中国一级特黄毛片大片| 日本天堂影院在线视频| 日韩美女一级视频| 日本天堂影院在线视频| 先锋影音一区二区| 大美女一区二区三区| 亚洲日本在线看| 一区二区高清视频在线观看| 亚洲欧美日韩国产精品| 自拍偷拍一区二区三区| 色涩成人影视在线播放| 成人字幕网zmw| 男人的天堂视频在线| 国产系列在线观看| www久久久| 免费久久精品视频| 日本韩国精品一区二区在线观看| 国产一区av在线| 成人欧美一区二区三区视频 | 一本色道久久综合精品竹菊| 欧美哺乳videos| 91精品中国老女人| 国产激情99| 欧美性理论片在线观看片免费| 色小子综合网| 中文字幕字幕中文在线中不卡视频| 日韩av综合中文字幕| 久久人人九九| 免费在线高清av| 婷婷五月色综合香五月| 亚洲少妇屁股交4| 久久久久国产视频| 97在线观看播放| 久久综合给合| 国产视频一区二区在线| 尤物九九久久国产精品的分类| 成人av免费看| 大乳在线免费观看| 久久不射网站|