HTML/CSS 實作 SVG 漸層按鈕的完整指南

HTML 與 CSS 實作 SVG 漸層按鈕

在版面開發時,常會收到設計師提供帶有複雜漸層、特殊邊框或不規則圖示的按鈕設計。如果單純使用 CSS 的 linear-gradient 或 border-image,有時難以完全還原設計稿的細節,甚至在不同螢幕尺寸下會出現變形破版的問題。

遇到這類需求,最穩健的做法是採用 SVG 結合 CSS 變數。將按鈕的漸層背景與形狀交由 SVG 渲染,文字部分則維持 HTML 結構,透過絕對定位覆蓋在上方。這樣不僅能確保圖形在任何解析度下都能保持清晰,後續維護或修改按鈕文字時,也不需要重新匯出圖片,兼顧了視覺完美與程式碼的靈活性。

步驟一:定義全域漸層資源

首先,將 SVG 的漸層定義(defs)獨立出來,這段程式碼可以放在頁面的底端或統一的共用區塊中。賦予 radialGradient 一個專屬的 ID,讓全站的按鈕都可以重複引用這個漸層,減少冗餘的原始碼。

<svg width="0" height="0" style="position:absolute; visibility:hidden;">
  <defs>
    <radialGradient id="shared-brand-gradient" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(201.724 -4.49998) rotate(166.519) scale(182.313 336.654)">
      <stop stop-color="#E8DFD6"/>
      <stop offset="1" stop-color="#9B6C3A"/>
    </radialGradient>
  </defs>
</svg>

步驟二:按鈕 HTML 結構

按鈕本體包含外層連結、SVG 圖形以及獨立的文字節點。在 SVG 的矩形區塊中,透過 fill 屬性指向剛剛設定好的漸層 ID 即可載入效果。

<a href="https://example.com/sample-path/" class="button-link">
  <div class="consultation-button">
    <svg viewBox="0 0 147 53" fill="none" xmlns="http://www.w3.org/2000/svg">
      <rect x="0.5" y="0.5" width="146" height="52" rx="26" stroke="#9B6C3A"/>
      <rect x="3.5" y="3.5" width="140" height="46" rx="23" fill="url(#shared-brand-gradient)"/>
      <path d="M121 26.2333L113 22.5L115.667 26.2333L113 30.5L121 26.2333Z" fill="white"/>
    </svg>
    <span class="button-text">預約諮詢</span>
  </div>
</a>

步驟三:CSS 樣式與變數控制

利用 CSS 變數(CSS Variables)來集中管理按鈕的寬高與字級,後續只要修改 :root 內的數值,就能連動更新按鈕外觀。文字部分則透過絕對定位與 transform 精準置中於 SVG 上方。

<style>
/* 按鈕大小控制 - 可以自由調整這些數值 */
:root {
  --button-width: 147px;     /* 預設寬度,可改成 200px, 15vw, 100% 等 */
  --button-height: 53px;     /* 預設高度,可改成 60px, 4vw 等 */
  --button-font-size: 16px;  /* 文字大小,可改成 1rem, 1.2vw 等 */
}

/* 連結樣式 */
.button-link {
  text-decoration: none;
  color: inherit;
  display: inline-block;
}

.consultation-button {
  position: relative;
  width: var(--button-width);
  height: var(--button-height);
  cursor: pointer;
  display: inline-block;
  /* 自適應:最小寬度保護 */
  min-width: 120px;
  min-height: 40px;
}

.consultation-button svg {
  width: 100%;
  height: 100%;
  /* 保持比例不變形 */
  display: block;
}

.button-text {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  color: var(--fcfcfc, #FCFCFC);
  font-family: "Noto Serif TC", serif;
  font-size: var(--button-font-size);
  font-style: normal;
  font-weight: 900;
  line-height: 1.2;
  letter-spacing: 0.15em;
  text-align: center;
  pointer-events: none;
  white-space: nowrap;
  /* 自適應:防止文字過長 */
  max-width: 90%;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* 滑鼠懸停效果 */
.button-link:hover .consultation-button {
  opacity: 0.9;
  transition: opacity 0.2s ease;
}

/* 點擊效果 */
.button-link:active .consultation-button {
  transform: scale(0.98);
  transition: transform 0.1s ease;
}

/* 移除連結的預設樣式 */
.button-link:focus {
  outline: none;
}
</style>

踩坑提醒與實務建議

在實際套用至專案時,有幾個影響跨瀏覽器相容性與使用者體驗的細節需要特別留意:

避開 Safari 的漸層消失陷阱
用來存放 defs 的全域 SVG 容器,務必使用 visibility: hidden; position: absolute; 來隱藏。如果直接設定 display: none;,在 iOS 或 Safari 瀏覽器中會導致漸層資源無法被渲染,按鈕背景將會變成空白。
  • 處理文字層的事件穿透:在 .button-text 加上 pointer-events: none; 是不可省略的。若未加上此設定,當游標精準停留在文字上時,會干擾外層 <a> 標籤的 hover 偵測,導致按鈕產生不自然的閃爍或點擊失效。
  • 維持 SVG 原生比例:利用 CSS 變數覆寫外層寬高時,SVG 標籤本身的 viewBox 屬性必須保留。這樣才能確保內部圖形(如圓角矩形、箭頭)在縮放時進行向量運算,不會發生生硬的裁切或變形。

實作懶人包,照作就能用

  1. 在 WordPress 後台新增一個頁面,或是進入現有頁面的 Elementor 編輯器。
  2. 在左側控制面板中搜尋「HTML」小工具。
  3. 將「HTML」小工具拖曳到你想放置漸層按鈕的位置。
  4. 將上述文章中的「全域漸層資源」、「按鈕 HTML 結構」與「CSS 樣式」三段原始碼,完整複製並貼入該 HTML 小工具的程式碼輸入框中。
  5. 點擊更新或發佈頁面,前往網站前台即可確認按鈕顯示效果。
如果啟用後網站出現異常,回到 Snippets 將該片段停用即可立刻復原,不會影響其他設定。
文章分享