SVG(Scalable Vector Graphics)是一種基于XML的2D矢量圖形格式,可以實現圖像的無損縮放和高清晰度顯示。在HTML中嵌入SVG圖像,可以使網頁更加生動有趣,提高用戶體驗
<svg width="54" height="54" class="c-nav--footer__svgicon c-slackhash" viewBox="0 0 54 54" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="evenodd">
<path d="M19.712.133a5.381 5.381 0 0 0-5.376 5.387 5.381 5.381 0 0 0 5.376 5.386h5.376V5.52A5.381 5.381 0 0 0 19.712.133m0 14.365H5.376A5.381 5.381 0 0 0 0 19.884a5.381 5.381 0 0 0 5.376 5.387h14.336a5.381 5.381 0 0 0 5.376-5.387 5.381 5.381 0 0 0-5.376-5.386" fill="#44BEDF">
</path>
<path d="M53.76 19.884a5.381 5.381 0 0 0-5.376-5.386 5.381 5.381 0 0 0-5.376 5.386v5.387h5.376a5.381 5.381 0 0 0 5.376-5.387m-14.336 0V5.52A5.381 5.381 0 0 0 34.048.133a5.381 5.381 0 0 0-5.376 5.387v14.364a5.381 5.381 0 0 0 5.376 5.387 5.381 5.381 0 0 0 5.376-5.387" fill="#2EB67D">
</path>
<path d="M34.048 54a5.381 5.381 0 0 0 5.376-5.387 5.381 5.381 0 0 0-5.376-5.386h-5.376v5.386A5.381 5.381 0 0 0 34.048 54m0-14.365h14.336a5.381 5.381 0 0 0 5.376-5.386 5.381 5.381 0 0 0-5.376-5.387H34.048a5.381 5.381 0 0 0-5.376 5.387 5.381 5.381 0 0 0 5.376 5.386" fill="#ECB22E">
</path>
<path d="M0 34.249a5.381 5.381 0 0 0 5.376 5.386 5.381 5.381 0 0 0 5.376-5.386v-5.387H5.376A5.381 5.381 0 0 0 0 34.25m14.336-.001v14.364A5.381 5.381 0 0 0 19.712 54a5.381 5.381 0 0 0 5.376-5.387V34.25a5.381 5.381 0 0 0-5.376-5.387 5.381 5.381 0 0 0-5.376 5.387" fill="#E01E5A">
</path>
</g>
</svg>
們經常在一些頁面中遇見svg格式的繪圖,通常是一臉懵逼,別急,看完這篇文章你就能很好地了解它了。
SVG 意為可縮放矢量圖形(Scalable Vector Graphics),是使用 XML 來描述二維圖形和繪圖程序的語言,后綴是“.svg”。它的優點是圖像在放大或改變尺寸的情況下其圖形質量不會有所損失。
SVG 文件可通過以下標簽嵌入 HTML 文檔:<embed>、<object> 或者 <iframe>。但是在html5中,直接用內聯的方式嵌入,方便太多了。各種方式的嵌入如下:
// 使用 <embed> 標簽
<embed
src="rect.svg"
width="300"
height="100"
type="image/svg+xml"
pluginspage="http://www.adobe.com/svg/viewer/install/"
/>
// 使用 <object> 標簽
<object
data="rect.svg"
width="300"
height="100"
type="image/svg+xml"
codebase="http://www.adobe.com/svg/viewer/install/"
/>
// 使用 <iframe> 標簽
<iframe src="rect.svg" width="300" height="100"></iframe>
// 在 HTML5 中, SVG 元素直接嵌入 HTML 頁面中
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="190">
<polygon
points="100,10 40,180 190,60 10,60 160,180"
style="fill:lime;stroke:purple;stroke-width:5;fill-rule:evenodd;"
/>
</svg>
1.矩形
<svg>
<rect width="300" height="100" style="fill:rgb(0,0,255);stroke-width:1;stroke:rgb(0,0,0)"/>
</svg>
// width="矩形的寬度"。必需的。
// height="矩形的高度"。必需的。
// x="矩形的左上角的x軸"
// y="矩形的左上角的y軸"
// rx="x軸的半徑(round元素)"
// ry="y軸的半徑(round元素)"
// + 顯現屬性:Color, FillStroke, Graphics
2.圓形
<svg>
<circle cx="100" cy="50" r="40" stroke="black"
stroke-width="2" fill="red"/>
</svg>
// cx="圓的x軸坐標"
// cy="圓的y軸坐標"
// r="圓的半徑". 必需.
// + 顯現屬性:顏色,FillStroke,圖形
3.橢圓
<svg>
<ellipse cx="300" cy="80" rx="100" ry="50"
style="fill:yellow;stroke:purple;stroke-width:2"/>
</svg>
// cx="橢圓x軸坐標"
// cy="橢圓y軸坐標"
// rx="沿x軸橢圓形的半徑"。必需。
// ry="沿y軸長橢圓形的半徑"。必需。
// + 顯現屬性:顏色,FillStroke,圖形
4.直線
<svg>
<line x1="0" y1="0" x2="200" y2="200"
style="stroke:rgb(255,0,0);stroke-width:2"/>
</svg>
// x1="直線起始點x坐標"
// y1="直線起始點y坐標"
// x2="直線終點x坐標"
// y2="直線終點y坐標"
// + 顯現屬性:Color, FillStroke, Graphics, Markers
5.多邊形
<svg>
<polygon points="200,10 250,190 160,210"
style="fill:lime;stroke:purple;stroke-width:1"/>
</svg>
// points="多邊形的點。點的總數必須是偶數"。必需的。
// fill-rule="FillStroke演示屬性的部分"
// + 顯現屬性:Color, FillStroke, Graphics, Markers
6.多段線
<svg>
<polyline points="20,20 40,25 60,40 80,120 120,140 200,180"
style="fill:none;stroke:black;stroke-width:3" />
</svg>
// points=折線上的"點"。必需的。
// + 顯現屬性:Color, FillStroke, Graphics, Markers
7.路徑
<svg>
<path d="M150 0 L75 200 L225 200 Z" />
</svg>
// d="定義路徑指令"
// pathLength="如果存在,路徑將進行縮放,以便計算各點相當于此值的路徑長度"
// transform="轉換列表"
// + 顯現屬性:Color, FillStroke, Graphics, Markers
8.文本
<svg>
<text x="0" y="15" fill="red">這是文本</text>
</svg>
// x="列表的X -軸的位置。在文本中在第n個字符的位置在第n個x軸。如果后面存在額外的字符,耗盡他們最后一個字符之后放置的位置。 0是默認"
// y="列表的Y軸位置。(參考x)0是默認"
// dx="在字符的長度列表中移動相對最后繪制標志符號的絕對位置。(參考x)"
// dy="在字符的長度列表中移動相對最后繪制標志符號的絕對位置。(參考x)"
// rotate="一個旋轉的列表。第n個旋轉是第n個字符。附加字符沒有給出最后的旋轉值"
// textLength="SVG查看器將嘗試顯示文本之間的間距/或字形調整的文本目標長度。(默認:正常文本的長度)"
// lengthAdjust="告訴查看器,如果指定長度就嘗試進行調整用以呈現文本。這兩個值是'spacing'和'spacingAndGlyphs'"
// + 顯現屬性:Color, FillStroke, Graphics, FontSpecification, TextContentElements
主要分濾鏡和漸變效果。
<defs> 和 <filter>
所有互聯網的SVG濾鏡定義在<defs>元素中。<defs>元素定義短并含有特殊元素(如濾鏡)定義。<filter>標簽用來定義SVG濾鏡。<filter>標簽使用必需的id屬性來定義向圖形應用哪個濾鏡。
1.濾鏡可以做一些模糊的效果和陰影,效果有很多,也可以自己嘗試地做一做。
比如做個簡單的邊緣模糊效果。
<svg>
<defs>
<filter id="f1" x="0" y="0">
<feGaussianBlur in="SourceGraphic" stdDeviation="15" /> //<feGaussianBlur> 元素是用于創建模糊效果
</filter>
</defs>
<rect width="90" height="90" stroke="green" stroke-width="3" fill="green" filter="url(#f1)" />
</svg>
2.漸變有線性漸變,放射性漸變,下面是個線性漸變的例子。
<svg>
<defs>
<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:rgb(255,255,0);stop-opacity:1" />
<stop offset="100%" style="stop-color:rgb(255,0,0);stop-opacity:1" />
</linearGradient>
</defs>
<rect width="200" height="90" fill="url(#grad1)" />
</svg>
// 把上面的
<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%">
......
</linearGradient>
// 替換成
<radialGradient id="grad1" cx="50%" cy="50%" r="50%" fx="50%" fy="50%">
<stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:0" />
<stop offset="100%" style="stop-color:rgb(0,0,255);stop-opacity:1" />
</radialGradient>
// 變成放射性漸變
眾多示例:https://www.runoob.com/svg/svg-examples.html
SVG 是一種使用 XML 描述 2D 圖形的語言。 SVG DOM 中的每個元素都是可用的。它的繪制不依賴分辨率,可以為某個元素附加 JavaScript 事件處理器,不過事件添加過多會影響渲染速度。如果 SVG 對象的屬性發生變化,瀏覽器能夠自動重現圖形。最適合帶有大型渲染區域的應用程序(比如谷歌地圖)。
Canvas 通過 JavaScript 來繪制 2D 圖形。它的繪制是依賴分辨率的,不能單獨為其中元素添加事件。在 canvas 中,一旦圖形被繪制完成,它就不會繼續得到瀏覽器的關注。如果其位置發生變化,那么整個場景也需要重新繪制,包括任何或許已被圖形覆蓋的對象。能夠以 .png 或 .jpg 格式保存結果圖像。最適合圖像密集型的游戲,其中的許多對象會被頻繁重繪
點贊 + 關注 + 收藏 = 學會了
技術一直在演變,在網頁中使用 SVG 的方法也層出不窮。每個時期都有對應的最優解。
所以我打算把我知道的 7種 SVG 的使用方法列舉出來,有備無患~
如果你還知道其他方法,可以在評論區補充~
<?xml version="1.0" ?>
<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
<title>雷猴</title>
<circle cx="50" cy="50" r="50" fill="hotpink"></circle>
</svg>
xml 是瀏覽器能讀取的格式,但如果希望 svg 能在瀏覽器中渲染出來,需要使用 xmlns 聲明渲染規則。
所以必須使用 xmlns="http://www.w3.org/2000/svg"。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>svg demo</title>
</head>
<body>
<div>
<!-- 內嵌到 HTML 中 -->
<svg width="100%" height="100%" version="1.1">
<circle cx="50" cy="50" r="50" fill="hotpink"></circle>
</svg>
</div>
</body>
</html>
可以看到上面的代碼中,<svg> 標簽并沒有使用 xmlns="http://www.w3.org/2000/svg" 聲明命名空間,這是因為 HTML 5 文檔使用 <!DOCTYPE html> 標記,它允許跳過 SVG 命名空間聲明,HTML 解析器會自動識別 SVG 元素和它的子元素,除了 <foreignObject> 元素的子元素。
在寫本文時,將 SVG 內嵌到 HTML 中 的做法是最常見的,也是比較推薦的方式之一。
做特效時,這種使用方式也是比較輕松的。
<style>
.svg_bg_img {
width: 100px;
height: 100px;
background: url('./case1.svg') no-repeat;
background-size: 100px 100px;
}
</style>
<div class="svg_bg_img"></div>
SVG 也是一種圖片格式,所以按理說是能當做背景圖來使用的。
一試,果然可以~
<img src="./case1.svg" width="100" height="100">
既然 SVG 可以在 CSS 中當背景圖使用,那也可以在 <img> 標簽里使用咯~
<iframe
src="./case1.svg"
width="100"
height="100"
></iframe>
iframe 可以在網頁里再嵌套一個網頁,既然 SVG 可以直接在瀏覽器打開,那使用 <iframe> 引用 SVG 同樣也是可以的。
需要注意的是,<iframe> 默認是有個邊框樣式的,如果你使用這種方式引入 SVG 可能還需要自己手動調節一下樣式。
<embed
src="./case1.svg"
width="100"
height="100"
/>
<embed> 標簽定義了一個容器,用來嵌入外部應用或者互動程序。它也可以插入各種媒體資源。
<embed> 標簽已經被標準采用了。但它不能包含任何子內容,因此如果嵌入失敗就沒有備用選項了。所以現階段來看,我不太推薦使用 embed 的方式引入 SVG 。
<object
data="./case1.svg"
type="image/svg+xml"
codebase="http://www.adobe.com/svg/viewer/install"
></object>
<object> 是通過 data 屬性引入資源的。它可以用于嵌入圖像,類似 <img> ,也可以用于嵌入獨立的 HTML 文檔,類似 <iframe> 。
使用 <object> 嵌入 SVG 可以讓那些不能直接顯示 SVG 但又有 SVG 插件的老舊瀏覽器展示 SVG。
需要注意的是,在某些現代瀏覽器中,type 和 codebase 是可以不寫的。
type 用來聲明當前引入的資源是屬于什么類型。
在寫本時,我推薦使用 內嵌到 HTML 的方式來做日常開發。
其他方式按照你實際需求去使用即可。
最后的 embed 和 object 這兩種方式可以當做備用方案去使用。
?雷猴 SVG
《Canvas 從入門到勸朋友放棄(圖解版)》
《Fabric.js 從入門到膨脹》
《『Three.js』起飛!》
《console.log也能插圖!!!》
《純css實現117個Loading效果》
《視差特效的原理和實現方法》
《這18個網站能讓你的頁面背景炫酷起來》
*請認真填寫需求信息,我們會在24小時內與您取得聯系。