SVG <pattern>
<pattern>元素可以預定義一個圖案,以固定間隔對指定區域在x軸和y軸上進行填充。
此圖案可以對SVG元素進行填充或者描邊操作,有點類似於CSS中背景圖片的重複填充操作。
要明確一點,<pattern>元素本身並不可見,它用來預定義或者組織圖案,其他元素引用後才會顯示。
應用非常簡單,如果說有難點,主要在座標系相關屬性的應用,可以預先參閱如下兩篇文章:
(1).SVG viewprot 視窗和畫布一章節。
(2).SVG 座標系統一章節。
通過fill或者stroke屬性可以引用圖案對指定元素進行填充和描邊,下面僅以填充為例子。
首先看一段程式碼例項:
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <style> svg { width:400px; height:240px; border:2px solid red; } </style> </head> <body> <svg> <defs> <pattern id="pattern" x="20" y="20" width="40" height="40" patternUnits="userSpaceOnUse"> <circle cx="20" cy="20" r="20" stroke="none" fill="blue"/> </pattern> </defs> <rect x="20" y="20" width="200" height="200" stroke="green" fill="url(#pattern)"/> </svg> </body> </html>
程式碼執行效果截圖如下:
下面首先對程式碼進行一下簡述,後續再對屬性進行詳細分析:
(1).再強調一次,<pattern>元素本身並不會顯示,它是用來預定義圖案。
(2).在<pattern>元素內定義一個圓形圖案,以備以後應用。
(3).最後矩形元素<rect>通過fill屬性引用圖案,對齊進行填充操作。
特別說明:<pattern>元素可以建立一個獨立的座標系統,內部元素位於此座標系中。
上面程式碼繪製的圓就位於<pattern>建立的座標系統中,然後在此座標系中以(20,20)為中心,20為半徑繪製圓,也就是在<pattern>元素的正中心繪製一個圓形,再來看一段程式碼例項:
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <style> svg { border: 1px solid red; width:300px; height:240px; } </style> </head> <body> <svg> <defs> <pattern id="pattern" x="20" y="20" width="40" height="40" patternUnits="userSpaceOnUse"> <circle cx="0" cy="0" r="20" stroke="none" fill="blue"/> </pattern> </defs> <rect x="20" y="20" width="200" height="200" stroke="green" fill="url(#pattern)"/> <circle cx="20" cy="20" r="20" stroke="none" fill-opacity="0.5" fill="green" /> </svg> </body> </html>
程式碼執行效果截圖如下:
上述程式碼是為了證明<pattern>元素能夠建立一個獨立座標系,其內部元素以此座標系定位。
(1).具有透明度的綠色的圓是一個輔助圖形,便於觀察。
(2).<pattern>元素內部圓的圓心座標是(0,0)。
(3).如果<pattern>元素能夠建立一個獨立的座標系,那麼(0,0)位置就是<pattern>元素的左上角。
(4).於是就繪製了四分之一圓形,也就是實現上述填充效果。
一.x與y屬性:
<pattern>元素的x與y屬性用於規定圖案第一次填充開始的座標。
當然這個座標是以<pattern>元素所在的座標系為標準,上述程式碼中,四分之一個圓從(20,20)處開始填充。
二.width與height屬性:
這兩個屬性非常簡單,用於設定<pattern>元素的寬度和高度,不再進行演示。
特別說明:設定<pattern>元素的尺寸不會影響其內部元素的尺寸。
三.patternUnits屬性:
patternUnits由pattern和unit兩個單詞合成。
由此可以大致猜測出此屬性用於規定<pattern>元素使用的尺寸單位。
恰如其名,此屬性用於規定<pattern>元素尺寸的參考系。
具有兩個屬性值,分別如下:
1.userSpaceOnUse:
(1).規定<pattern>使用的參考系為引用<pattern>的元素所在的當前使用者座標系。
(2).<pattern>元素的x、y、width和height屬性的值都是絕對值。
2.objectBoundingBox(預設值):
(1).規定<pattern>使用的參考系為引用<pattern>的元素所生成的包圍盒。
(2).<pattern>元素的x、y、width和height屬性的值是介於0-1之間的相對值,也可以是百分比形式。
第二個屬性比第一個稍微抽象一點,下面單獨對其進行一下演示,程式碼例項如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <style> svg { border: 1px solid red; width:300px; height:260px; } </style> </head> <body> <svg> <defs> <pattern id="pattern" x="0.1" y="0.1" width="0.2" height="0.2" patternUnits="objectBoundingBox"> <circle cx="20" cy="20" r="20" stroke="none" fill="blue"/> </pattern> </defs> <rect x="40" y="40" width="200" height="200" stroke="green" fill="url(#pattern)"/> <circle cx="40" cy="40" r="20" stroke="none" fill-opacity="0.5" fill="green" /> </svg> </body> </html>
程式碼執行效果截圖如下:
程式碼分析如下:
(1).patternUnits屬性值設定為"objectBoundingBox",可以省略,因為是預設值。
(2).此時,<pattern>以它包圍盒為參考系,也就是引用它的元素,在這裡是<rect>元素。
(3).<pattern>元素的x、y、width和height屬性的值都是以<rect>元素生成的盒為參考,值介於0-1之間。
(4).x="0.1",那麼它的實際值就是0.1乘以<rect>元素的寬度,也就是0.1*200=20,y也是同樣的道理,實際值也是20,於是圖案第一次填充開始的座標是(20,20)。
(5).對於width和height屬性也是同樣的道理,它的尺寸以<rect>的尺寸為參考,實際尺寸分別為40。
(6).所以,圖案的長寬都是40,圖片的起始填充位置距離矩形元素左上側都(20,20)座標處。
四.patternContentUnits屬性:
此屬性功能與patternUnits類似,屬性值完全相同。
patternContentUnits規定<pattern>所包裹內部元素使用的尺寸參考系。
此屬性的預設值是userSpaceOnUse,與patternUnits屬性恰好相反。
程式碼例項如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <style> svg { border: 1px solid red; width:300px; height:260px; } </style> </head> <body> <svg> <defs> <pattern id="pattern" x="0.1" y="0.1" width="0.2" height="0.2" patternUnits="objectBoundingBox" patternContentUnits="objectBoundingBox"> <circle cx="0.1" cy="0.1" r="0.1" stroke="none" fill="blue"/> </pattern> </defs> <rect x="40" y="40" width="200" height="200" stroke="green" fill="url(#pattern)"/> <circle cx="40" cy="40" r="20" stroke="none" fill-opacity="0.5" fill="green" /> </svg> </body> </html>
程式碼執行效果截圖如下:
程式碼分析如下:
(1).patternContentUnits值為objectBoundingBox時,<pattern>內部元素尺寸以引用<pattern>的元素的尺寸為參考,例如cr="0.1",那麼cr的實際值是0.1乘以200。特別說明,只能使用小數,而不能使用百分數。
(2).patternContentUnits值為userSpaceOnUse時,尺寸參考引用<pattern>的元素,都是絕對值。
(3).無論patternContentUnits是何值,內部元素定位都是以<pattern>元素為參考。
(4).<pattern>元素宣告viewbox屬性,那麼patternContentUnits="objectBoundingBox"無效。
五.patternTransform屬性:
利用此屬性可以對圖案進行變換,程式碼例項如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <style> svg { border: 1px solid red; width:800px; height:650px; } </style> </head> <body> <svg> <defs> <pattern id="pattern" x="0" y="0" width="0.2" height="0.2" patternTransform="rotate(10)" patternUnits="objectBoundingBox"> <circle cx="40" cy="40" r="40" stroke="none" fill="blue"/> </pattern> </defs> <rect x="33" y="33" width="400" height="400" stroke="green" fill="url(#pattern)"/> </svg> </body> </html>
屬性值可以是一個變換列表,變換之間用空格分隔,程式碼片段如下:
[XML] 純文字檢視 複製程式碼<pattern id="p1" width=".25" height=".25" patternTransform="rotate(20) skewX(30) scale(1 0.5)"> <circle cx="10" cy="10" r="10" /> </pattern>
關於變換可以參閱本版塊其他相關文章,本文不多介紹。
相關文章
- <url-pattern>/</url-pattern>和<url-pattern>/*</url-pattern>區別
- 設計模式-COMMOND PATTERN (ACTIVE OBJECT PATTERN是一種特殊的COMMOND PATTERN)設計模式Object
- 【SVG】SVG的奪命利器——pathSVG
- SVG入門—如何手寫SVGSVG
- SVG designer - boxy-svgSVG
- Adapter PatternAPT
- SVG 動畫SVG動畫
- SVG 安全SVG
- js SVGJSSVG
- 策略模式【Strategy Pattern】模式
- Cache Aside PatternIDE
- STL and Design Pattern
- 代理模式(Proxy Pattern)模式
- svg01——svg簡介及簡單使用SVG
- 線上SVG轉換,支援SVG to PNG、SVG to JPEG、SVG to WEBP 圖片轉換操作-toolfk程式設計師線上工具網SVGWeb程式設計師
- SVG 文字排版SVG
- SVG <tspan>元素SVG
- SVG <switch>元素SVG
- SVG <markers>用法SVG
- 小試SVGSVG
- SVG <image>元素SVG
- SVG 的使用SVG
- SVG SMIL AnimationSVG
- SVG簡介SVG
- SVG的引用SVG
- svg_pathsSVG
- svg畫弧SVG
- SVG animation 動畫SVG動畫
- SVG defs元素SVG
- Android SVGAndroidSVG
- svg vs canvasSVGCanvas
- SVG規範SVG
- 設計模式之策略模式和狀態模式(strategy pattern & state pattern)設計模式
- 使用反射的Factory Pattern與Singleton Pattern的衝突問題反射
- svg是什麼格式 svg檔案轉化成jpgSVG
- 建造者模式(Builder Pattern)模式UI
- 規格模式(Specification Pattern)模式
- observer pattern 之我見Server