svg高級應用及動畫

来源:https://www.cnblogs.com/edwardloveyou/archive/2020/06/04/13040649.html
-Advertisement-
Play Games

canvas 和 webGL 這兩項圖形技術結合 css3 可以說能完成絕大部分的動畫和需求。但 canvas 和 webGL 畢竟是偏向底層的繪製引擎,某些場景使用起來還是過於繁瑣的,不分場合一律使用錘子解決的行為不值得提倡。svg 在解決排版,圖標,相關動畫還是非常高效的,而且 svg 還是矢量 ...


canvas 和 webGL 這兩項圖形技術結合 css3 可以說能完成絕大部分的動畫和需求。但 canvas 和 webGL 畢竟是偏向底層的繪製引擎,某些場景使用起來還是過於繁瑣的,不分場合一律使用錘子解決的行為不值得提倡。svg 在解決排版,圖標,相關動畫還是非常高效的,而且 svg 還是矢量圖形,高清還原各種屏幕尺寸的設計簡直就是神器。

svg 基礎知識不再講解,結合svg特點和應用場景,主要介紹如下幾方面的內容

  • svg sprite
  • css background-image 插入svg
  • 文字路徑
  • 路徑動畫

SVG sprite

SVG sprite 之於 font-face 的優勢就是矢量圖的抗鋸齒效果,再也不需要為適配高清屏而操心。使用方式就是 svg 標簽結合 symbol元素即可,其中 svg 是容器,而symbol 則是組件模板。怎麼把svg組件顯示出來呢?使用 use 元素指向組件的id即可,如下所示:

<svg>
    <symbol id="ok">
        <!-- svg元素或組合 -->
    </symbol>
    <!-- ... -->
</svg>

<use href="#ok"/>

當然網上有很多工具可以幫我們把圖標自動sprite,比如:iconfotgulp-svg-symbols

在css中插入svg

SVG 添加到網頁中有多種方法,最常見的是:

  1. 在 HTML 中內聯
  2. objectiframeembed 標簽插入
  3. img 標簽
  4. CSS background-image 屬性

html 內聯方式

<svg>
  <title>line</title>
  <line x1="20" y1="20" x2="100" y2="100">
</svg>

使用 object、iframe 或 embed 標簽插入

<object data="flag.svg" type="image/svg+xml"></object>
<iframe src="flag.svg" frameborder="0"></iframe>
<embed src="flag.svg" type="" />

使用img標簽插入

<img src="flag.svg"/>

現在重點介紹一下使用 css background屬性插入的方式;既可以使用圖片路徑也可以使用 base64 格式的data URI 方式

.svg-bg {
  background-image: url("./bg.svg");
}
.svg-background {
  background-image: url("data:image/svg+xml;<DATA>");
}

我認為使用 background base64 引入svg是最具靈活性的一種方式,還可以加入svg動畫,不需要額外載入圖標,只需引入css即可。同時跟普通圖片相比它又有著抗鋸齒的優勢,因此元素尺寸隨意調整不擔心失真。比如下麵使用background data URI 引入的載入動畫css:

<style>
.loading{
  width: 50px;
  height: 50px;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='80' height='80'%3E%3Cpath d='M10 40a30 30 0 1130 30' stroke-width='4' stroke='hsl(220,90%,60%)' fill='none'%3E%3CanimateTransform attributeName='transform' begin='0s' dur='1.4s' type='rotate' from='0 40 40' to='360 40 40' repeatCount='indefinite'/%3E%3C/path%3E%3C/svg%3E")
  no-repeat center / cover;
}
</style>

<body>
<div class="loading"></div>
</body>

文字路徑

svg 除了繪製圖形,插入文字也是很方便的,方式也簡單,使用 text 元素包裹文本內容即可

<text fill="hsla(260,80%,50%,1)" x="10" y="40" font-size="30"> I Love SVG </text>

還有一種很實用的效果就是文字路徑,也就是文字按照定義好的 path 進行排列顯示,這需要使用到另一個標簽 textPath。實現方式:首先定義一個path元素(這裡使用三次貝塞爾曲線),然後 textPath元素使用 xlink:href 屬性引入path,最後再用 text標簽包裹。

<g>
  <title> 文字路徑 </title>
  <path id="path" d="M 10 100 C 100 0 150 300 250 100" fill="none" stroke="#555"/>
  <text x="10" y="100" stroke="hsl(280,100%,50%)">
    <textPath xlink:href="#path">I Love SVG I Love SVG I Love SVG</textPath>
  </text>
</g>
文字路徑 I Love SVG I Love SVG I Love SVG I Love SVG

svg路徑動畫

svg動畫既可以使用 css3 相關屬性實現,也可以使用自己獨有的api實現。svg方式主要用以下標簽:

  • animate:基礎動畫元素,實現單屬性的動畫過渡效果

  • animateTransform: 實現transform變換動畫效果

  • animateMotion:路徑動畫效果

這裡只介紹路徑動畫,基礎動畫和變換動畫與css動畫相似,就不再介紹。來看一個基於 css3 的 animation 實現百分比載入的動畫。這裡用到了兩個關鍵屬性:

  • stroke-dasharray:設置線條斷開為虛線,數值越大,線就越長

  • stroke-dashoffset:設置線條的偏移,設置後,線段就會偏移相應的值,實現線條動畫只要動態改變這個偏移值就好

首先需要通過js獲取路徑的總長度

//獲取路徑長度
const arc = document.getElementById('circle');
console.log(arc.getTotalLength()); //250.92141723632812

接著編寫svg相關

<style>
  circle {
    fill: transparent;
    stroke-width: 10px;
  }
  #circle {
    stroke-dasharray: 250.921;
    stroke-dashoffset: 250.921;
    animation: round 3s linear infinite;
  }
  @keyframes round {
    to {
      stroke-dashoffset: 0;
    }
  }
</style>
<g>
  <circle cx="100" cy="60" r="40" stroke="#ccc" />
  <circle id="circle" cx="100" cy="60" r="40" stroke="hsl(160,80%,50%)" />
</g>

當然其他stroke線條動畫也類似

Click Me

接著我們再基於svg animateMotion標簽來實現path路徑動畫,其中path是運動路徑,dur 是持續時間,repeatCount設置是否迴圈

<g id="pathAnimate">
  <title> 路徑動畫 </title>
  <path stroke="hsl(0,0%,60%)" d="M 10 300 Q 150 100 300 300 T 490 300Z" stroke-width="2" fill="none"/>
  <circle cx="0" cy="0" r="8" stroke-width="1" stroke="hsl(300,10%,40%)" fill="hsl(300,100%,50%)">
    <animateMotion path="M 10 300 Q 150 100 300 300 T 500 300Z" dur="4s" repeatCount="indefinite"/>
  </circle>
</g>
路徑動畫

使用svg實現路徑動畫真是性價比超高。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • HTML+CSS+JS模仿win10亮度調節效果 代碼 <!doctype html> <html> <head> <meta charset="utf-8"> <title>模仿win10的亮度調節</title> <style> .control_bar{ height:200px; width ...
  • 項目要求是:html生成圖片(圖片格式不限),長按圖片能夠保存到本地,主要在移動端 1、初試html2canvas 最初選擇的是html2canvas插件,將html轉為canvas 再通過Canvas2Image,將canvas轉為想要的圖片 問題:只能截取一屏的內容,當出現滾動條時,不在滾動視區 ...
  • 插槽 作用:官方解釋就是vue實現一套內容分發機制,將元素作為承載分發內容的出口 ,就是視圖層和數據層進行展示的時候不要直接綁定數據,而是進行數據的上傳 個人理解,就還是父子組件的傳值 就像是父組件你把東西給我,我用用,然後我把我全部的加上你給我的一塊給你 在官網上邊 父到子 是prope 傳值 , ...
  • <div class="layui-inline" id=‘’ onclick="changeType(id)"> <label class="layui-form-label"></label> </div> function changeType(id){//id是通過綁定事件傳過來的 var ...
  • 看別人的博客總是花里胡哨,早已羡慕不已,花了點時間整理了下自己博客園的背景 參考原博主鏈接:https://www.cnblogs.com/Penn000/p/6947472.html,https://www.cnblogs.com/Tangent-1231/p/10393759.html 以下為原 ...
  • 解決Tab切換echarts圖表不能正常顯示問題: // 繪圖div父容器的寬度 let w = $('.figure').width(); $('#fig-t').css('width', w); // 獲取父容器的寬度直接賦值給圖表以達到寬度100%的效果 $('#fig-f').css('wi ...
  • Vue.directive 1.作用: 使用vue 函數構造自定義方法。 2.基本概念: 在主函數中構造自定義方法 併在模板中使用 構造方法: Vue.directive('demo',function(el,binding,vnode){ el.style='color:'+binding.val ...
  • 在開發中修改第三方組件樣式是很常見,但由於 scoped 屬性的樣式隔離,可能需要去除 scoped 或是另起一個 style 。 這些做法都會帶來副作用(組件樣式污染、不夠優雅),樣式穿透在css預處理器中使用才生效。 我們可以使用 >>> 或 /deep/ 解決這一問題: <style scop ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...