SVG入門理解

  • SVG入門
    • SVG 元素
    • 簡單的形狀
      • rect
      • circle
      • ellipse
      • line
      • text
      • path
    • SVG 樣式
    • 分層和繪圖順序
    • 透明度

SVG入門

當我們用SVG生成和操作一些炫酷的效果時,D3是最佳選擇。使用div和其他原生HTML元素繪圖也是可以的,但是太笨重,而且會受到不同瀏覽器的限制,傳達出的視覺效果會有不一致的影響。使用SVG更可靠,視覺上更一致,最重要的就是方便,快捷。

Illustrator這樣的矢量繪圖軟件可用于生成SVG文件,但我們更需要學習如何使用代碼生成它們。

SVG 元素

可縮放矢量圖形是基于文本的圖像格式。每一個SVG圖像都是使用類似HTML的標識代碼定義生成的。SVG代碼可以直接包含在任何HTML文檔中。除了IE 8及更早的版本外,其他每一個Web瀏覽器都支持SVG

SVG是基于XML的,因此你會注意到沒有結束標記的元素必須是自動關閉的,例如:

<element></element>   <!-- 結束標記 -->
<element/>            <!-- 自動關閉標記 -->

在繪制任何SVG圖像之前,必須創建一個SVG元素。將SVG元素視為渲染視覺效果的畫布。其實這方面,SVG在概念上有點類似于HTML中的canvas元素。SVG是可以指定寬度和高度的,如果不指定那么SVG將在其封閉元素中占用盡可能多的空間大小。

下面是一個指定空間大小的SVG

<svg width="500" height="50">
</svg>

如果你將這段代碼放在你的HTML中,會形成一塊空白區域,此時你可以鼠標右鍵選擇空白區域,選擇檢查,將會發現:

image

會看一個SVG元素,它占用了500個水平像素和50個垂直像素。但是看起來不像,下面解釋。

瀏覽器將像素視為默認度量單位。我們指定的尺寸是50050,而不是500px50px。我們可以明確指定px,或者是任意數量的其他被支持的單位,比如:emptincmmm

簡單的形狀

SVG標記之間包含很多可視化的元素,包括rectcircleellipselinetextpath

如果你比較熟悉計算機圖形編程,那么你一定知道通常基于像素的坐標系統,其中(0,0)是我們桌面的最左上角。在(x,y)中,x表示x軸,y代表y軸,此時增加x值向右移動,而增加y值向下移動。

image
圖像代碼如下:

<svg width="505" height="65"><line x1="5" y1="5" x2="5" y2="50" stroke="gray" stroke-width="1"></line><line x1="5" y1="50" x2="0" y2="45" stroke="gray" stroke-width="1"></line><line x1="5" y1="50" x2="10" y2="45" stroke="gray" stroke-width="1"></line><line x1="5" y1="5" x2="500" y2="5" stroke="gray" stroke-width="1"></line><line x1="500" y1="5" x2="495" y2="0" stroke="gray" stroke-width="1"></line><line x1="500" y1="5" x2="495" y2="10" stroke="gray" stroke-width="1"></line><circle cx="5" cy="5" r="3" fill="#008"></circle><text x="10" y="20">0,0</text><circle cx="105" cy="25" r="3" fill="#008"></circle><text x="110" y="40">100,20</text><circle cx="205" cy="45" r="3" fill="#008"></circle><text x="210" y="60">200,40</text>
</svg>

rect

使用rect繪制一個矩形。使用xy指定左上角的坐標,使用寬度高度指定尺寸。這個矩形填滿了SVG整個空間:

<svg width="500" height="50"><rect x="0" y="0" width="500" height="50"/>
</svg>

效果:

image

circle

circle標簽可以畫一個圓圈。使用cxcy指定中心的坐標,使用r指定半徑。這個圓圈位于我們500個像素寬的SVG中間,因為它的cx(center x)值為250。

<svg width="500" height="50"><circle cx="250" cy="25" r="25"/>
</svg>

效果:

image

ellipse

ellipsecircle是類似的,但是每個軸需要單獨的半徑值,由rxry指定。

<svg width="500" height="50"><ellipse cx="250" cy="25" rx="100" ry="25"/>
</svg>

效果:

image

line

line是畫一條直線。使用x1y1指定線一端的坐標,使用x2y2指定另一端的坐標。必須為要顯示的指定畫筆顏色。

<svg width="500" height="50"><line x1="0" y1="0" x2="500" y2="50" stroke="black"/>
</svg>

效果:

image

text

text用來渲染文字的。使用x指定左邊緣的位置,使用y指定類型基線的垂直位置。

<svg width="500" height="50"><text x="250" y="25">Easy-peasy</text>
</svg>

效果:

image

如果沒有有意指定text的字體樣式,那么text將繼承其父元素的CSS指定字體樣式(稍后詳細介紹樣式文本)。上面的文字樣式,我們可以自定義設置,如下:

<svg width="500" height="50"><text x="250" y="25" font-family="sans-serif"font-size="25" fill="gray">Easy-peasy</text>
</svg>

效果:

image

另外注意,當任何可視化元素在SVG的邊緣上運行時,它將被剪裁。使用文字時要小心,否則會出現y操作設置無效,當我們將基線y設置為50時,可以看到這種情況發生,與SVG的高度相同。

<svg width="500" height="50"><text x="250" y="50" font-family="sans-serif"font-size="25" fill="gray">Easy-peasy</text>
</svg>

效果:

image

path

path用于繪制比上面的形狀更復雜的東西(如地圖的國家輪廓),這個后續我們再做介紹,現在暫時使用一些簡單的形狀入門。

SVG 樣式

SVG的默認樣式是黑色填充,沒有畫筆。如果需要其他任何內容,則必須將樣式應用于元素。

常見的SVG屬性是:

  • fill - 填充的顏色。與CSS一樣,顏色可以指定為
    • named colors - orange
    • hex values - #3388aa or #38a
    • RGB values - rgb(10, 150, 20)
    • RGB width alpha transparency - rgba(10, 150, 20, 0.5)
  • stroke - Stroke屬性定義一條線,文本或元素輪廓顏色
  • stroke-width - 定義了一條線,文本或元素輪廓厚度
  • opacity - 透明度,一個在0.0-1.0之間的數值

使用text,您還可以使用這些屬性,就像在CSS中一樣:

  • font-family
  • font-size

其實SVG的樣式可以使用CSS樣式規則。

以下是一些直接應用于圓形的樣式屬性作為屬性:

<svg width="500" height="50"><circle cx="25" cy="25" r="22"fill="yellow" stroke="orange" stroke-width="5"/>
</svg>

效果:

image

或者,我們可以去除樣式屬性,為圓圈分配一個class(就像它是一個普通的HTML元素)

<svg width="500" height="50"><circle cx="25" cy="25" r="22" class="pumpkin"/>
</svg>

然后將fillstrokestroke-width規則放入以新類為目標的CSS樣式中:

.pumpkin {fill: yellow;stroke: orange;stroke-width: 5;}

CSS方法有一些明顯的好處:

  1. 可以同時對多個元素進行樣式設定,比如:
<svg width="500" height="50"><circle cx="25" cy="25" r="22" class="pumpkin"/><circle cx="80" cy="25" r="20" class="pumpkin"/>
</svg>.pumpkin {fill: yellow;stroke: orange;stroke-width: 5;}
  1. CSS代碼更方便閱讀(相比內聯屬性)
  2. CSS代碼可能更易于維護,并且可以更快的實現設計更改要求

但是,使用CSS代碼定義SVG的樣式可能會讓一些人感到不安。畢竟,fillstrokestroke-width不是CSS屬性。(與之CSS等價物是背景顏色和邊框)。

分層和繪圖順序

Layering and Drawing Order(分層和繪圖順序)。

SVG中沒有,也沒有真正的深度概念,就好比z-indexSVG不支持CSSz-index屬性,因此形狀只能排列在二維xy平面內。

然而,如果我們繪制多個形狀,它們會發生重疊,如下:

<svg width="500" height="50"><rect x="0" y="0" width="30" height="30" fill="purple"/><rect x="20" y="5" width="30" height="30" fill="blue"/><rect x="40" y="10" width="30" height="30" fill="green"/><rect x="60" y="15" width="30" height="30" fill="yellow"/><rect x="80" y="20" width="30" height="30" fill="red"/>
</svg>

效果:

image

元素編碼的順序決定了對應元素的深度順序。紫色方塊第一個出現,因此第一個被渲染,然后藍色方塊呈現在紫色方塊的頂部,接下來就是綠色方塊,依此類推。

當有一些不應該被其他元素遮擋的視覺元素時,繪制順序就變得很重要。例如,在一個散點圖上顯示軸或值標簽,軸和標簽應該是最后渲染,所以它們出現在任何其他元素的上層。

透明度

Transparency(透明度)

當可視化中的元素重疊但是又必須保持可見,這時可以使用透明度;或者希望突出顯示其他元素和不強調某些元素時,透明度就非常有用。

有兩種方法可以應用透明度:

  • 使用帶有alphaRGB顏色
  • 設置不透明度值。

可以在任何一個設定顏色的元素中使用rgba(),例如填充或者描邊。對于紅色,綠色和藍色,rgba() 需要0到255之間的三個值,以及介于0.0到1.0之間的alpha(透明度)值。

例如:

<svg width="500" height="50"><circle cx="25" cy="25" r="20" fill="rgba(128, 0, 128, 1.0)"/><circle cx="50" cy="25" r="20" fill="rgba(0, 0, 255, 0.75)"/><circle cx="75" cy="25" r="20" fill="rgba(0, 255, 0, 0.5)"/><circle cx="100" cy="25" r="20" fill="rgba(255, 255, 0, 0.25)"/><circle cx="125" cy="25" r="20" fill="rgba(255, 0, 0, 0.1)"/>
</svg>

效果:

image

使用rgba() 時,透明度將獨立應用于填充和描邊顏色。以下圓圈填充的是75%不透明,而它們的筆畫只有25%不透明:

<svg width="500" height="50"><circle cx="25" cy="25" r="20"fill="rgba(128, 0, 128, 0.75)" stroke="rgba(0, 255, 0, 0.25)" stroke-width="10"/><circle cx="75" cy="25" r="20"fill="rgba(0, 255, 0, 0.75)"stroke="rgba(0, 0, 255, 0.25)" stroke-width="10"/><circle cx="125" cy="25" r="20"fill="rgba(255, 255, 0, 0.75)"stroke="rgba(255, 0, 0, 0.25)" stroke-width="10"/>
</svg>

效果:

image

將透明度應用于整個元素,請設置不透明度屬性。這是一些完全不透明的圓圈。

效果:

image

下面是不同透明度的圓圈:

<svg width="500" height="50"><circle cx="25" cy="25" r="20" fill="purple" stroke="green" stroke-width="10"opacity="0.9"/><circle cx="65" cy="25" r="20" fill="green"stroke="blue" stroke-width="10"opacity="0.5"/><circle cx="105" cy="25" r="20" fill="yellow"stroke="red" stroke-width="10"opacity="0.1"/>
</svg>

效果圖:

image

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536080.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536080.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536080.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【哈佛幸福課筆記】【1】

【哈佛幸福課筆記】【1】 ? ? 一個月的時間看完了哈佛幸福課&#xff0c;正如Tal所說課程的結束才是學習的開始。對于課程觀點的思考&#xff0c;對于個人習慣的培養&#xff0c;對于思維模式的轉變還需要花大量的時間去練習。這個系列的帖子將作為我個人的讀書筆記&#x…

Angular 6+ 之新版service

Angular 6+ 之新版service Angular 6已經發布了,Angular 6中有一些新功能,其中一個就是提供service的共享實例。 回首Angular 5- 下面是一段熟悉的代碼,可以為整個應用程序提供服務。我們將它添加到AppModule中的providers[]。 自定義服務類 // data.service.ts export c…

Angular CDK Layoout 檢測斷點

Angular CDK檢測斷點 Angular CDK有一個布局包,其服務可以輕松檢測窗口大小并與媒體查詢匹配。這使得你可以完全控制UI并適應不同的屏幕尺寸。 讓我們快速了解一下如何使用CDK的布局模塊。 Setup 首先,您需要確保在您的應用中安裝了Angular CDK: $ npm install @angular/c…

Angular Render2

Angular Render2 Renderer2類是Angular以service的形式提供的抽象,允許操作應用程序的元素而無需直接觸摸DOM。這是推薦的方法,因為它可以更容易地開發可以在沒有DOM訪問的環境中呈現的應用程序,例如在服務器上,web worker,或者原生移動上。 需要注釋的是,現在已棄用原始…

數據分析方法

數據分析方法 什么是數據分析 從數據到信息的這個過程&#xff0c;就是數據分析。數據本身并沒有什么價值&#xff0c;有價值的是我們從數據中提取出來的信息。 分類 分類分析的目標是&#xff1a;給一批人(或者物)分成幾個類別&#xff0c;或者預測他們屬于每個類別的概率…

RAID陣列基礎知識

RAID陣列基礎知識 獨立硬盤冗余陣列 &#xff08;RAID, Redundant Array of Independent Disks&#xff09;,舊稱廉價磁盤冗余陣列&#xff08;Redundant Array of Inexpensive Disks&#xff09;&#xff0c;簡稱磁盤陣列。 RAID的種類 這里我們只介紹比較常用的RAID類型&am…

timeshift備份你的Linux系統

timeshift備份你的Linux系統 安裝 打開終端&#xff08;ctrl alt T&#xff09;并逐個執行以下命令 sudo apt-add-repository -y ppa:teejee2008/ppa sudo apt-get update sudo apt-get install timeshift 創建 點擊Create按鈕 默認不能備份用戶下的文件&#xff0c;所以…

Go語言vscode環境配置

Go語言vscode環境配置 此教程在GO已經安裝成功的前提下。 安裝vscode擴展 在vscode擴展里面搜索go&#xff0c;然后下載擴展。 安裝go 插件 在$GOPATH目錄下創建bin,pkg,src切換到$GOPATH/bin目錄下&#xff0c;打開終端輸入以下命令&#xff0c;不需要翻墻&#xff1a; go…

Angular實現懸浮球組件

Angular實現懸浮球組件 在手機 App 上,我們經常會看到懸浮球的東東,用著可能很舒服,但是 web 網頁上卻很少見,今天我們就通過 Angular 來實現,當然使用其他框架也是可以的。 功能要求: 支持設置直徑支持點擊觸發信號支持設置鼠標按壓時間實現的過程中省略的部分天填坑過…

Docker+Nginx部署Angular國際化i18n

Docker+Nginx部署Angular國際化i18n 在Angular項目中添加default.conf文件 default.conf 為了支持局域網,增加一個域名,即本地的局域網ip地址。 server {listen 80;server_name localhost;server_name 192.168.2.172;location / {root /usr/share/nginx/html;lo…

消息隊列-Message Queue

消息隊列-Message Queue 目前隨著互聯網的普及以及上網用戶的增多&#xff0c;擁有一套 安全、穩定、低耦合、高性能的內部通信工具尤為重要。 什么是消息隊列&#xff1f; 消息隊列&#xff08;英語&#xff1a;Message queue&#xff09;是一種進程間通信或同一進程的不同線…

Angular 第一章 開始

第一章 開始 用 JavaScript 開發應用程序是一個很大的挑戰。由于它的延展性和缺少類型檢查,在 JavaScript 中構建一個適當大小的應用程序是很困難的。除此之外,我們對所有類型的處理都使用JavaScript,例如用戶界面(UI),操作、客戶端-服務器交互和業務處理/驗證。因此,我們…

Typescript實現單例之父類調用子類

Typescript實現單例之父類調用子類 設計要求 在程序中,需要一個對象可以全局使用,并且只有一個實例Breakpoint 類是一個可以被繼承的類,然后子類必須實現 updateView函數updateView 這個函數可以被自動調用,當窗口發生變化的時候構思 UML 圖 Layout 是一個單例類,也就是全局只…

Angular性能優化之臟檢測

Angular性能優化之臟檢測 當我們在使用 Angular 框架搭建項目時,隨著組件越來越多,頁面也來越復雜,性能會越來越低,主要表現在 CPU 使用率 很高。所以我們要對項目做一定的優化。 Angular臟檢查(Change Detection)機制 Angular 的臟檢測主要是指 zone.js,這是一個開源的…

第一章、第一節 Angular基礎

第一章、第一節 Angular基礎 讓我們先來看看Angular是如何實現組件模式的。 組件模式 Angular 應用程序使用組件模式。你可能聽說過這個模式&#xff0c;它不僅用于軟件開發&#xff0c;還用于制造、建筑和其他領域。簡單地說&#xff0c;它涉及到將更小的、離散的構建塊組合…

Angular Chart.js第三方庫ng-chartjs基礎使用

Angular Chart.js第三方庫ng-chartjs基礎使用 項目github地址 這個項目支持基本的Chart.js圖表,并且支持內聯插件和全局插件的使用。 Demo地址 支持圖表類型 linebarradarpiepolarArea安裝 npm install ng-chartjs --save npm install chart.js --save導入 正常導入模塊i…

linux一鍵安裝node+npm

分享一個linux下一鍵安裝nodenpm腳本。 使用方式為&#xff1a; ./install-node.sh&#xff0c;然后輸入版本號&#xff0c;node.js版本查詢 切記不需要加 sudo 執行!!! 默認安裝10.15.0。 #! /bin/bash############################################################ # …

Angular Material 陰影使用

Angular Material 陰影使用 依托于 Angular Material 庫,可以直接使用通用的符合 Material Design 風格的陰影。 使用 使用方式有兩種: 外聯樣式設定,即在css或scss中設定通過class名稱設定,即 元素的class名稱方式一:外聯樣式使用 在scss或css文件中導入@import ~@ang…

typescript或javascript深拷貝Object json

typescript或javascript深拷貝Object json Object的json對象很多時候我們需要深拷貝,我寫了兩個工具函數,供大家參考。 deepCopyObject 深拷貝一個Object對象&#xff0c;返回深復制的對象。 /** * method 深復制一個json對象 * param source 需要深復制的對象 * return 返…

linux安裝zsh終端

linux安裝zsh終端 ZSH 已經被收錄到了 Ubuntu 18.04 LTS 的官方軟件包存儲庫中了 sudo apt install zshZSH Shell 安裝好之后&#xff0c;可以使用如下命令查看其版本&#xff1a; zsh --version取代bash&#xff0c;設為默認shell sudo usermod -s /bin/zsh username也可以…