搜尋
首頁web前端css教學在SVG中創建UI組件

SVG賦能Web界面構建:探索自定義UI組件的無限可能

Creating UI Components in SVG

SVG在網頁界面構建方面展現出巨大的潛力。初學SVG可能略顯困難,但其規範設計初衷便是創建形狀,同時支持文本、鏈接和ARIA標籤等元素。雖然CSS也能實現部分相同效果,但在精確定位,特別是跨視窗和響應式開發方面,CSS的難度更大。

SVG的獨特之處在於其定位基於坐標系統,類似於遊戲“戰艦”。這意味著確定元素位置、繪製方式以及元素間的相對位置都非常直觀。 CSS定位主要用於佈局,這很好,因為文檔流中的元素彼此對應。但如果要創建具有重疊和精確放置元素的特定組件,這種特性反而會增加難度。

掌握SVG後,您可以繪製任何圖形,並使其在任何設備上都能縮放。甚至本網站也使用SVG創建自定義UI元素,例如上面的頭像(元數據!)。

本文不會涵蓋SVG的全部內容(您可以在這裡、這裡、這里和這裡學習一些基礎知識),但為了說明SVG為UI組件開髮帶來的可能性,讓我們討論一個具體的用例,並分解構建自定義組件的思路。

時間軸任務列表組件

最近,我在Netlify團隊參與了一個項目。我們需要向觀看者展示他們在課程視頻系列中當前觀看的視頻位置。換句話說,我們需要創建一個類似待辦事項列表的東西,但在完成項目時顯示整體進度。 (我們創建了一個免費的太空主題學習平台,非常酷炫。是的,我用了“非常酷炫”這個詞。)

效果如下:

我們該如何實現呢?我將分別展示Vue和React示例,以便您了解這兩種框架中的實現方式。

Vue版本

我們決定使用Next.js構建平台(為了試用我們自己的Netlify Next構建插件),但我更熟悉Vue,所以我用Vue編寫了初始原型,然後移植到React。

完整的CodePen演示: [此處應插入CodePen鏈接]

讓我們逐步分析代碼。首先,這是一個單文件組件(SFC),因此模板HTML、反應式腳本和作用域樣式都封裝在一個文件中。

我們將一些虛擬任務存儲在data中,包括每個任務是否已完成。我們還將創建一個方法,可以在點擊指令上調用該方法,以便切換狀態。

 export default {
  data() {
    return {
      tasks: [
        {
          name: 'thing',
          done: false
        },
        // ...
      ]
    };
  },
  methods: {
    selectThis(index) {
      this.tasks[index].done = !this.tasks[index].done
    }
  }
};

現在,我們要創建一個SVG,其viewBox根據元素數量靈活調整。我們還需要告訴屏幕閱讀器這是一個演示元素,我們將使用唯一ID“timeline”提供標題。 (獲取有關創建可訪問SVG的更多信息。)

<template>
  <div>
    <div>
      <svg :viewbox="`0 0 30 ${tasks.length * 50}`" aria-labelledby="timeline" fill="white" role="presentation" stroke="currentColor" width="30" xmlns="http://www.w3.org/2000/svg">
        <title>timeline element</title>
      </svg>
    </div>
  </div>
</template>

stroke設置為currentColor以提高靈活性——如果要在多個位置重用組件,它將繼承封裝div使用的顏色。

接下來,在SVG內部,我們要創建一個與任務列表長度相同的垂直線。線條非常簡單。我們有x1和x2值(線條在x軸上的繪製位置),類似地,還有y1和y2。

<line :y1="num2" :y2="tasks.length * num1 - num2" x1="10" x2="10"></line>

x軸始終保持在10,因為我們是從上向下繪製線條,而不是從左到右。我們將兩個數字存儲在data中:我們想要的間距,即num1,以及我們想要的邊距,即num2。

 data() {
  return {
    num1: 32,
    num2: 15,
    // ...
  }
}

y軸以num2開始,從末尾減去邊距。 tasks.length乘以間距num1。

現在,我們需要位於線條上的圓圈。每個圓圈都指示任務是否已完成。每個任務都需要一個圓圈,因此我們將使用v-for和唯一的鍵,即索引(在這裡使用是安全的,因為它們永遠不會重新排序)。我們將點擊指令與我們的方法連接起來,並將索引作為參數傳遞。

SVG中的圓圈由三個屬性組成。圓圈的中心位於cx和cy,然後我們用r繪製半徑。與線條一樣,cx從10開始。半徑為4,因為在這個比例下它是可讀的。 cy將像線條一樣進行間隔:索引乘以間距(num1),加上邊距(num2)。

最後,我們將使用三元運算符設置填充。如果任務已完成,則填充currentColor。如果沒有,則填充白色(或任何背景顏色)。例如,這可以使用一個傳遞背景的prop填充,其中包含淺色和深色圓圈。

<circle :cy="i * num1   num2" :fill="task.done ? 'currentColor' : 'white'" :key="task.name" cx="10" r="4" v-for="(task, i) in tasks"></circle>

最後,我們使用CSS網格對齊包含任務名稱的div。佈局方式大致相同,我們遍歷任務,並將其綁定到相同的點擊事件以切換已完成狀態。

<template>
  <div>
    <div :key="task.name" v-for="(task, i) in tasks">
      {{ task.name }}
    </div>
  </div>
</template>

React版本

這是React版本的最終結果。我們正在努力將其開源,以便您可以查看完整的代碼及其歷史記錄。以下是一些修改:

  • 我們使用CSS模塊而不是Vue中的SFC
  • 我們導入Next.js鏈接,因此我們不是切換“已完成”狀態,而是將用戶帶到Next.js中的動態頁面
  • 我們使用的任務實際上是課程的階段——或者我們稱之為“任務”——它們在這裡被傳遞進來,而不是由組件持有。

其他大部分功能都相同:)

 // React 代碼片段(此處應粘貼完整的React代碼)

最終版本

您可以在這裡查看最終的運行版本:[此處應插入最終版本鏈接]

該組件足夠靈活,可以適應大小不同的列表、多個瀏覽器和響應式大小調整。它還使用戶能夠更好地了解他們在課程中的進度。

但這只是一個組件。您可以創建任意數量的UI元素:旋鈕、控件、進度指示器、加載器……可能性無限。您可以使用CSS或內聯樣式對其進行樣式設置,您可以根據prop、上下文或反應式數據對其進行更新,可能性無限!我希望這能為如何開發更引人入勝的Web UI元素打開一些思路。

以上是在SVG中創建UI組件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
什麼是CSS網格?什麼是CSS網格?Apr 30, 2025 pm 03:21 PM

CSS網格是創建複雜,響應式Web佈局的強大工具。它簡化了設計,提高可訪問性並提供了比舊方法更多的控制權。

什麼是CSS Flexbox?什麼是CSS Flexbox?Apr 30, 2025 pm 03:20 PM

文章討論了CSS FlexBox,這是一種佈局方法,用於有效地對齊和分佈響應設計中的空間。它說明了FlexBox用法,將其與CSS網格進行了比較,並詳細瀏覽了瀏覽器支持。

我們如何使用CSS使網站迅速響應?我們如何使用CSS使網站迅速響應?Apr 30, 2025 pm 03:19 PM

本文討論了使用CSS創建響應網站的技術,包括視口元標籤,靈活的網格,流體媒體,媒體查詢和相對單元。它還涵蓋了使用CSS網格和Flexbox一起使用,並推薦CSS框架

CSS盒裝屬性有什麼作用?CSS盒裝屬性有什麼作用?Apr 30, 2025 pm 03:18 PM

本文討論了CSS盒裝屬性,該屬性控制了元素維度的計算方式。它解釋了諸如Content-Box,Border-Box和Padding-Box之類的值,以及它們對佈局設計和形式對齊的影響。

我們如何使用CSS動畫?我們如何使用CSS動畫?Apr 30, 2025 pm 03:17 PM

文章討論使用CSS,關鍵屬性並與JavaScript結合創建動畫。主要問題是瀏覽器兼容性。

我們可以使用CSS向我們的項目添加3D轉換嗎?我們可以使用CSS向我們的項目添加3D轉換嗎?Apr 30, 2025 pm 03:16 PM

文章討論了Web項目的3D轉換,關鍵屬性,瀏覽器兼容性和性能注意事項的討論。 (角色計數:159)

我們如何在CSS中添加梯度?我們如何在CSS中添加梯度?Apr 30, 2025 pm 03:15 PM

文章討論了使用CSS梯度(線性,徑向,重複)來增強網站視覺效果,添加深度,焦點和現代美學。

CSS中的偽元素是什麼?CSS中的偽元素是什麼?Apr 30, 2025 pm 03:14 PM

文章討論了CSS中的偽元素,它們在增強HTML樣式方面的使用以及與偽級的差異。提供實用的例子。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。