亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

如何使用CSS來修改SVG原點和制作SVG動畫

系統 2041 0
SVG元素可以像HTML元素一樣,使用CSS keyframes和animation屬性或者CSS transitions來制作各種動畫效果。

?

SVG 元素可以像HTML元素一樣,使用CSS keyframes和animation屬性或者CSS transitions來制作各種動畫效果。

大多數情況下,一個復雜的動畫效果需要組合多種變換效果:旋轉、傾斜、縮放以及他們的轉換和過渡效果。多數情況下,SVG元素和HTML元素在使用 transform transform-origin 上是相同的。但它們之間也有不同之處,SVG元素不能使用box model來管理,因此,它沒有 margin padding border 或content boxes。

?

默認情況下,一個HTML元素的 transform 原點位于該元素的 (50%, 50%) 的地方,這里是元素的中心點。與之不同,SVG元素的 transform 原點位于當前用戶坐標系統的原點上,這個點是畫布的左上角位置。

假設我們有一個 <div> 和一個SVG <rect> 元素:

      <!DOCTYPE html>
…
<div style="width: 100px; height: 100px; background-color: orange"> </div>
<svg style="width: 150px; height: 150px; background-color: #eee">
  <rect width="100" height="100" x="25" y="25" fill="orange" />
</svg>
    

?

如果我們在沒有改變原點的情況下,都將它們旋轉45度,我們將會得到下圖的效果(圖中的小圓點是它們各種的原點)。

如何使用CSS來修改SVG原點和制作SVG動畫

如果我們想根據SVG元素的自身原點,而不是用戶坐標系原點來旋轉SVG圖形該怎么辦呢?我們需要使用 transform-origin 屬性來明確的設置SVG元素的 transform 原點位置。

在HTML元素上設置轉換原點是一件非常簡單的事情:你設置的任何值都是相對于元素的border box。

在SVG中, transform 原點可以使用百分比值或一個絕度值(如像素)來設置。如果你使用百分比值來設置 transform-origin ,這個值被設置為相對于元素的bounding box,它包括用于繪制邊框的stroke。如果你使用一個絕對值來來設置 transform-origin ,那么這個值被設置為相對于用戶的當前坐標系統,即SVG的畫布。

如果我們要將上例中的 <div> <rect> 都使用百分比來設置其 transform 原點到中心,代碼如下:

      <!DOCTYPE html>
<style>
  div, rect {
  transform-origin: 50% 50%;
}
</style>
    

?

得到的結果如下圖所示:

如何使用CSS來修改SVG原點和制作SVG動畫

必須指出的是,到寫這篇文章為止,Firefox瀏覽器仍不支持使用百分比來設置 transform 的原點,這是一個總所周知的 bug 。因此,目前最好還是使用絕對值來設置 transform 的原點。你仍可以在webkit內核的瀏覽器中使用百分比來設置原點。

下面是一個SVG風車的小例子,我們使用CSS animation來使它不停的旋轉。為了使風車繞指定的原點旋轉,我們同時使用像素和百分比來設置它的 transform 原點。

      <svg>
<style>
.wheel {
  transform-origin: 193px 164px;
  -webkit-transform-origin: 50% 50%;
  -webkit-animation: rotate 4s cubic-bezier(.49,.05,.32,1.04) infinite alternate;
  animation: rotate 4s cubic-bezier(.49,.05,.32,1.04) infinite alternate;
}
@-webkit-keyframes rotate {
  50% {
    -webkit-transform: rotate(360deg);
  }
}
@keyframes rotate {
  50% {
    transform: rotate(360deg);
  }
}
</style>
<!-- SVG content -->
</svg>
    

?

DEMO

?

注意,到目前為止,在使用SVG元素的時候,CSS 3D transformations是沒有硬件加速的,只是在SVG transform 屬性上做了一些優化。但是,Firefox 瀏覽器對SVG的transforms有一定的加速效果。

?
SVG路徑動畫

我們沒有辦法使用CSS將一個SVG圖像轉換為另外一個圖形。如果你想制作路徑變形動畫,那么你需要使用javascript。我們建議使用Dmitry Baranovskiy寫的 Snap.svg

使用Snap.svg可以很容易的處理一寫怪異的問題。

你可以使用CSS來創建動態的畫線效果,這個效果你需要知道畫線路徑的總長度,然后使用SVG的 stroke-dashoffset stroke-dasharray 屬性來制作畫線效果,如果你知道畫線路徑的總長度,可以使用下面的CSS代碼來制作這個動畫效果:

      #path {
stroke-dasharray: pathLength;
stroke-dashoffset: pathLength;
/* transition stroke-dashoffset */
transition: stroke-dashoffset 2s linear;
}
 
svg:hover #path{
  stroke-dashoffset: 0;
}
    

?

上面的代碼中,當鼠標滑過SVG元素時,路徑會向前繪制2秒鐘。

在下面的這個例子中,我們使用相同的技術-一個帶延遲的CSS transition來制作一個電燈泡通電的效果。

      #cable {
  stroke: #FFF2B1;
  stroke-dasharray: 4000 4000;  
  stroke-dashoffset: 4000;
  stroke-width: 4;
  transition: stroke-dashoffset 8s linear;
}
 
svg:hover #cable {
  stroke-dashoffset: 0;
}
 
/* turn lamp on */
.inner-lamp{
  fill:grey;
  transition: fill .5s ease-in 6s;
}
 
svg:hover .inner-lamp {
  fill: #FBFFF8;
}
/* … */
    

?

DEMO

?

如果兩條線和間隙的值都相等的話,你也可以使用 stroke-dasharray: 4000; 來替換 stroke-dasharray: 4000 4000

有些時候你不知道動畫路徑的總長度,這時,你可以使用javascript的 getTotalLength() 方法來獲取路徑的長度。

      var path = document.querySelector('.drawing-path');
path.getTotalLength();
//set CSS properties up
path.style.strokeDasharray = length;
path.style.strokeDashoffset = length;
//set transition up
path.style.transition = 'stroke-dashoffset 2s ease-in-out';
// animate
path.style.strokeDashoffset = '0';
    

?

上面的代碼說明我們可以使用javascript來完成和CSS同樣的事情。

?

出處: http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/201503141522.html

本文: 如何使用CSS來修改SVG原點和制作SVG動畫

下載: 201503142148

?

如何使用CSS來修改SVG原點和制作SVG動畫


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日韩欧美精品在线视频 | 激情时刻 | 看久久 | 国产理论视频 | 在线视频一区二区日韩国产 | 久久网精品视频 | 2022国内精品免费福利视频 | 亚洲午夜在线观看 | 亚洲社区在线观看 | 中国性猛交xxxxx免费看 | baoyu777永久免费视频 | 日韩在线视频www色 日韩在线视频不卡 | 欧美成人一区二区三区 | 亚洲欧美日韩精品高清 | 日本亚洲成高清一区二区三区 | 日本一级看片免费播放 | a级在线观看视频 | 亚洲国产视频在线 | 亚洲人成网站999久久久综合 | 美国毛片一级e片黑人片 | 91热精品| 久久成人国产精品青青 | 香蕉国产人午夜视频在线 | 99资源站| 久久免费公开视频 | 亚洲精品一区二区在线播放 | 国产精品www视频免费看 | 日本精品中文字幕在线不卡 | 高清欧美一区二区三区 | 国产综合91 | 国产成人成人一区二区 | 日本视频播放免费线上观看 | 图片亚洲va欧美va国产综合 | 综合网激情| 久久99精品久久久久久水蜜桃 | 国产视频1| 欧美专区综合 | 欧美毛片日韩一级在线 | 全免费一级午夜毛片 | 奇米影视奇奇米色狠狠色777 | 日本乱人伦片中文字幕三区 |