技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運營

贊助商

分類目錄

贊助商

最新文章

搜索

11個示例詳細介紹SVG stroke形狀屬性及如何用其制作動畫

作者:admin    時間:2024-4-22 16:47:8    瀏覽:

stroke-width設(shè)置形狀的描邊粗細。如果在 HTML 中,框架是從外邊緣繪制到形狀中并增加其大小(可以使用box-sizing進行校正),而在 SVG 中,輪廓的行為有所不同:首先,它不會拉伸形狀,其次,它會同時繪制相對于圖形的外邊緣向內(nèi)和向外。

簡單形狀示例

為了看看它是如何工作的,讓我們看幾個簡單的形狀:

  svg形狀

demodownload

直徑為 60 像素的圓形,直徑為 60x60 像素的正方形。

使用 CSS,為形狀添加邊框: 

stroke: yellowgreen;
stroke-width: 30;
stroke-opacity: .5;

框架為綠色,30 像素厚。要查看它如何疊加在形狀上,請將框架設(shè)置為半透明 ( stroke-opacity: .5)。

結(jié)果: 

svg形狀添加邊框

demodownload

顯然,框架是從圖形的外邊緣向兩個方向繪制的:向內(nèi)和向外。

常規(guī)框架的行為非常清晰且可預(yù)測,但如果你指定的框架超過圖形寬度的兩倍,那么樂趣就開始了。差異越大,結(jié)果就越有趣。為了使其清晰可見,我將框架設(shè)置為寬度的三倍 (60 * 3 = 180):

  將svg形狀的框架設(shè)置為寬度的三倍

demodownload

帶框架的正方形很好,但圓形會發(fā)生一些奇怪的情況:如果輪廓的厚度超過圖形寬度的兩到三倍,則圓形和框架之間會形成白色區(qū)域,并且圓形的厚度也會增加。幀減少。

注意

各瀏覽器如:Chrome、Firefox、Safari、IE 等,顯示結(jié)果可能不一樣。

值之間的差異越大,白邊距越大,框架越細(半徑 10,描邊粗細 200): 

  svg框架白邊距越大,框架越細

demodownload

如果添加stroke-dasharray屬性,則會獲得更有趣的結(jié)果。

框架代碼: 

stroke-width: 180;
stroke: yellowgreen;
stroke-opacity: .5;
stroke-dasharray: 5;

結(jié)果:

  svg添加stroke-dasharray屬性

demodownload

看起來框架好像到達了圖形的中間并從那里繼續(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>

  svg圓形蒙版

demodownload

蒙版處理動畫

如果想對蒙版進行動畫處理,使其相對于圖像中心按比例膨脹和收縮。第一個想到的當(dāng)然是transform。動畫代碼:

@keyframes scale {
  50% {
    transform: scale(10);
  }
}

連接動畫:

.c-mask-circle {
  fill: white;
  animation: scale 5s infinite;
}

svg連接動畫 

demodownload

由于 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é)果:

  svg連續(xù)動畫,設(shè)置了變換中心

demodownload

在 Chrome 中,動畫將按預(yù)期工作,蒙版從中心開始增長,然后沿相反方向減小。它在 Firefox 中根本不起作用:Firefox 不會在蒙版內(nèi)設(shè)置動畫轉(zhuǎn)換。

stroke設(shè)置動畫

轉(zhuǎn)換方法不起作用。還有哪些其他選擇?在這種情況下,你可以嘗試為筆畫的粗細設(shè)置動畫。

為什么這會起作用?

一個題外話:clip-Path與沿矢量輪廓裁剪圖形、忽略輪廓的填充和描邊不同,它的所有圖形內(nèi)容都參與蒙版的操作。

例如,我們用一個筆畫畫一個圓,并將其用在maskclip-Path中: 

  svg筆畫畫一個圓,并將其用在mask和clip-Path中

demodownload

你可以嘗試為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é)果: 

  svg蒙版動畫

demodownload

transform的方法不同,F(xiàn)irefox 中的筆劃動畫效果非常好,如果沒有上述筆劃粗細的限制,則可以使用此方法。

因此,一方面,為一個小元素設(shè)置粗邊框似乎是一個奇怪的想法,另一方面,這可以用于實際目的,但遺憾的是stroke-width它沒有按照我們想要的方式渲染。

令人興奮的是,在 Firefox 中,蒙版中的筆畫動畫給出了完全期望的結(jié)果:蒙版從中心向邊緣生長,圖形和筆畫之間沒有任何間隙 - 圖形結(jié)果是實心的。

Safari 的表現(xiàn)甚至更有趣:其中蒙版圖形是實心的,但將蒙版應(yīng)用到圖片上的結(jié)果有間隙。

因此,如果你想獲得一個動畫蒙版,你可以將 Chrome 的transform動畫與 Firefox 的stroke-width動畫結(jié)合起來,例如像這樣: 

  svg完美的蒙版動畫

demodownload

方法很奇怪,但是很有效。

然而,這兩種動畫在 IE 中都不起作用,因為它根本不支持 SVG 中的動畫。

通過stroke-width在蒙版中設(shè)置動畫,你可以做各種其他有趣的事情。

總結(jié)

本文通過示例詳細講解了svg stroke形狀屬性,以及用其制作動畫的方法。希望本教程對你有所幫助。

相關(guān)文章

標(biāo)簽: SVG  
x
  • 站長推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */