目錄
時間軸任務列表組件
React版本
最終版本
首頁 web前端 css教學 在SVG中創建UI組件

在SVG中創建UI組件

Mar 31, 2025 pm 02:01 PM

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

熱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

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1269
29
C# 教程
1248
24
如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 Apr 11, 2025 am 11:29 AM

您是否曾經在項目上需要一個倒計時計時器?對於這樣的東西,可以自然訪問插件,但實際上更多

HTML數據屬性指南 HTML數據屬性指南 Apr 11, 2025 am 11:50 AM

您想了解的有關HTML,CSS和JavaScript中數據屬性的所有信息。

使Sass更快的概念證明 使Sass更快的概念證明 Apr 16, 2025 am 10:38 AM

在一個新項目開始時,Sass彙編發生在眼睛的眨眼中。感覺很棒,尤其是當它與browsersync配對時,它重新加載

當您看上去時,CSS梯度變得更好 當您看上去時,CSS梯度變得更好 Apr 11, 2025 am 09:16 AM

我關注的一件事是Lea Verou&#039; s conic-Gradient()Polyfill的功能列表是最後一項:

靜態表單提供商的比較 靜態表單提供商的比較 Apr 16, 2025 am 11:20 AM

讓我們嘗試在這裡造成一個術語:“靜態表單提供商”。你帶上html

如何在WordPress主題中構建VUE組件 如何在WordPress主題中構建VUE組件 Apr 11, 2025 am 11:03 AM

內聯式模板指令使我們能夠將豐富的VUE組件構建為對現有WordPress標記的逐步增強。

三種代碼 三種代碼 Apr 11, 2025 pm 12:02 PM

每次啟動一個新項目時,我都會將我正在查看的代碼分為三種類型,或者如果您願意的話。我認為這些類型可以應用於

php是A-OK用於模板 php是A-OK用於模板 Apr 11, 2025 am 11:04 AM

PHP模板通常會因促進Subpar代碼而變得不良說唱,但這並不是這樣的情況。讓我們看一下PHP項目如何執行基本的

See all articles