|
|
|
|
|
stroke-width
設(shè)置形狀的描邊粗細。如果在 HTML 中,框架是從外邊緣繪制到形狀中并增加其大小(可以使用box-sizing
進行校正),而在 SVG 中,輪廓的行為有所不同:首先,它不會拉伸形狀,其次,它會同時繪制相對于圖形的外邊緣向內(nèi)和向外。
簡單形狀示例
為了看看它是如何工作的,讓我們看幾個簡單的形狀:
直徑為 60 像素的圓形,直徑為 60x60 像素的正方形。
使用 CSS,為形狀添加邊框:
stroke: yellowgreen;
stroke-width: 30;
stroke-opacity: .5;
框架為綠色,30 像素厚。要查看它如何疊加在形狀上,請將框架設(shè)置為半透明 ( stroke-opacity: .5
)。
結(jié)果:
顯然,框架是從圖形的外邊緣向兩個方向繪制的:向內(nèi)和向外。
常規(guī)框架的行為非常清晰且可預(yù)測,但如果你指定的框架超過圖形寬度的兩倍,那么樂趣就開始了。差異越大,結(jié)果就越有趣。為了使其清晰可見,我將框架設(shè)置為寬度的三倍 (60 * 3 = 180):
帶框架的正方形很好,但圓形會發(fā)生一些奇怪的情況:如果輪廓的厚度超過圖形寬度的兩到三倍,則圓形和框架之間會形成白色區(qū)域,并且圓形的厚度也會增加。幀減少。
注意
各瀏覽器如:Chrome、Firefox、Safari、IE 等,顯示結(jié)果可能不一樣。
值之間的差異越大,白邊距越大,框架越細(半徑 10,描邊粗細 200):
如果添加stroke-dasharray
屬性,則會獲得更有趣的結(jié)果。
框架代碼:
stroke-width: 180;
stroke: yellowgreen;
stroke-opacity: .5;
stroke-dasharray: 5;
結(jié)果:
看起來框架好像到達了圖形的中間并從那里繼續(xù)繪制。
所有這些似乎都在向我們暗示,框架的厚度不應(yīng)超過圖形寬度或直徑的兩倍,盡管你可以做相反的事情:設(shè)置非常大的值并獲得有趣的光線選項。
使用蒙版
我認為很少有人會想到給筆畫一個過大的寬度,但當(dāng)我想這樣做時,我發(fā)現(xiàn)了這種奇怪的行為:取一個小圓圈并給它一個大邊框,從而增加它的大小。
為什么這是必要的?
假設(shè)有一個圓形蒙版和它下面的圖像:
<svg>
<mask id="mask">
<circle r="100" cx="100" cy="100"
class="c-mask-circle"/>
</mask>
<g mask="url(#mask)">
<image
xlink:href="1.png"
width="100%" height="100%"/>
</g>
</svg>
蒙版處理動畫
如果想對蒙版進行動畫處理,使其相對于圖像中心按比例膨脹和收縮。第一個想到的當(dāng)然是transform
。動畫代碼:
@keyframes scale {
50% {
transform: scale(10);
}
}
連接動畫:
.c-mask-circle {
fill: white;
animation: scale 5s infinite;
}
由于 SVG 中的變換中心位于渲染區(qū)域的左上角,因此形狀根本不會像我們希望的那樣移動。我們設(shè)置我們需要的變換中心:
transform-origin: 100px 100px;
以及所有一起:
.c-mask-circle {
fill: white;
transform-origin: 100px 100px;
animation: scale 5s infinite;
}
@keyframes scale {
50% {
transform: scale(10);
}
}
結(jié)果:
在 Chrome 中,動畫將按預(yù)期工作,蒙版從中心開始增長,然后沿相反方向減小。它在 Firefox 中根本不起作用:Firefox 不會在蒙版內(nèi)設(shè)置動畫轉(zhuǎn)換。
stroke設(shè)置動畫
轉(zhuǎn)換方法不起作用。還有哪些其他選擇?在這種情況下,你可以嘗試為筆畫的粗細設(shè)置動畫。
為什么這會起作用?
一個題外話:clip-Path
與沿矢量輪廓裁剪圖形、忽略輪廓的填充和描邊不同,它的所有圖形內(nèi)容都參與蒙版的操作。
例如,我們用一個筆畫畫一個圓,并將其用在mask
和clip-Path
中:
你可以嘗試為clip-path
里面的形狀設(shè)置動畫transform
,但它們在 Firefox 中也不會成為動畫。因此,我們只能使用蒙版和筆畫操作。
我嘗試使用筆觸重復(fù)蒙版的行為,相對于中心按比例增加。為了這些目的,我做了一個里面有一個小圓圈的面罩:
<mask id="mask">
<circle r="10" cx="100" cy="100"
class="c-mask-circle"/>
</mask>
我給它一個白色填充并添加一個描邊:
.c-mask-circle {
fill: white;
stroke: white;
stroke-width: 1;
}
添加描邊粗細動畫:
@keyframes stroke-width {
50% {
stroke-width: 170;
}
}
所有最終代碼:
.c-mask-circle {
fill: white;
stroke: white;
stroke-width: 1;
animation: stroke-width 5s infinite;
}
@keyframes stroke-width {
50% {
stroke-width: 170;
}
}
結(jié)果:
與transform
的方法不同,F(xiàn)irefox 中的筆劃動畫效果非常好,如果沒有上述筆劃粗細的限制,則可以使用此方法。
因此,一方面,為一個小元素設(shè)置粗邊框似乎是一個奇怪的想法,另一方面,這可以用于實際目的,但遺憾的是stroke-width
它沒有按照我們想要的方式渲染。
令人興奮的是,在 Firefox 中,蒙版中的筆畫動畫給出了完全期望的結(jié)果:蒙版從中心向邊緣生長,圖形和筆畫之間沒有任何間隙 - 圖形結(jié)果是實心的。
Safari 的表現(xiàn)甚至更有趣:其中蒙版圖形是實心的,但將蒙版應(yīng)用到圖片上的結(jié)果有間隙。
因此,如果你想獲得一個動畫蒙版,你可以將 Chrome 的transform
動畫與 Firefox 的stroke-width
動畫結(jié)合起來,例如像這樣:
方法很奇怪,但是很有效。
然而,這兩種動畫在 IE 中都不起作用,因為它根本不支持 SVG 中的動畫。
通過stroke-width
在蒙版中設(shè)置動畫,你可以做各種其他有趣的事情。
總結(jié)
本文通過示例詳細講解了svg stroke形狀屬性,以及用其制作動畫的方法。希望本教程對你有所幫助。
相關(guān)文章