/
CATEGORY
HTML / CSS
/
如何使用純 CSS 製作固定於右下角的 CTA 按鈕

如何使用純 CSS 製作固定於右下角的 CTA 按鈕

MUKI AI Summary

本文介紹如何使用純 CSS 製作固定於右下角的 CTA 按鈕,無需依賴 JavaScript。主要方法包括使用 CSS 的 `position: sticky` 和 `position: fixed` 屬性來固定按鈕位置,並利用 `place-self: end` 來調整按鈕在網格中的定位。這樣的設計不僅減少頁面載入時間,還能降低維護成本。

此外,文章還介紹了如何使用 CSS 動畫來增強按鈕的視覺效果,透過 `animation-timeline: scroll()` 語法實現平滑過渡效果。由於某些瀏覽器尚未支援該語法,因此使用 `@supports` 進行兼容性檢查。這些技術使得在不使用 JavaScript 的情況下,仍能創建出互動性強且視覺效果豐富的按鈕。...

不知道大家有沒有想過這個問題:如何在不使用 JavaScript 的情況下,做出 CTA (Call-To-Action) 按鈕呢?

這兩天在 Twitter 看到 @jh3yy 大神的發文,實際分享了如何不依賴 JavaScript,純靠 CSS 做到這一切,這樣做不僅可以減少頁面載入時間,還可以減少維護 JavaScript 帶來的時間成本。

@jh3yy 分享了兩種寫法,我實際研究後做成筆記如下,有興趣的朋友可以參考看看。

使用 Sticky 按鈕

這種方式利用 CSS 中的 position: sticky 屬性來固定按鈕的位置,讓它隨著頁面捲動到特定位置後,就固定在螢幕上,讓用戶隨時可以看到它。這樣的按鈕特別適合用於長內容頁面,當用戶捲到某一部分內容時,CTA 自然而然地黏住在視窗中,提供了一個方便的操作入口。

使用 position: sticky

position: sticky 是一個非常有用的 CSS 屬性,當元素滾動到某個閾值時,它可以讓元素「黏住」在頁面的某個位置。這意味著,我們可以讓 CTA 按鈕在滾動到一定位置後保持可見,這在提升用戶體驗上非常有效。

程式碼範例

將網站的 body 設為 display: grid 的佈局,讓主要內容和 CTA 按鈕各自佔據不同的空間,因為主要內容佔據的空間最大,所以 CTA 按鈕只能放在最尾端。

<body>
  <div class="content">
    <!-- 網站內容 -->
  </div>
  <button class="cta">Call to Action</button>
</body>
body {
  display: grid;
  grid-template-columns: auto 0;
}

.content {
  height: 200vh;
}

.cta {
  position: sticky;
  margin-top: 100vh;
  bottom: 2rem; /* 當到達這個位置後固定 */
  place-self: end; /* 將 CTA 按鈕對齊到結尾 */
}

接著當捲軸捲到指定位置 (100vh) 時,就利用 position: sticky 讓 CTA 固定在頁面底部,再繼續捲動頁面時,按鈕就會保持在同樣的位置。

使用 place-self: end

我們還使用了 place-self: end 來控制按鈕的位置。

place-self 是 CSS Grid 佈局中的屬性,允許我們快速對齊元素,place-self: end 會讓元素在它所在的網格中對齊到結束位置,這樣可以更加方便地控制按鈕在網格中的定位。

CodePen

▼ 試著滑動捲軸看效果吧

使用 CSS 動畫

如果想要讓按鈕出現時有動畫效果,例如讓按鈕在捲動時逐漸變大,或者加上些平滑過渡的效果,那麼我們可以利用 CSS 動畫的 animation-timeline: scroll() 語法。

animation-timeline: scroll() 的瀏覽器支援度

參考 Can I Use 網站來取得 animation-timeline: scroll() 的瀏覽器支援度,可以看到 Safari 和 Firefox 都尚未支援該語法,所以我們會用 supports 來協助判斷,如果支援才會讓語法生效。

程式碼範例

HTML 部分保持不變

<body>
  <div class="content">
    <!-- 網站內容 -->
  </div>
  <button class="cta">Call to Action</button>
</body>

CSS 加入了動畫與自定義屬性 (@property)

:root {
 --elastic: cubic-bezier(0.68, -0.55, 0.27, 1.55);
}

body {
 height: 200vh;
}

.cta {
 position: fixed;
 bottom: 2rem;
 right: 2rem;
 translate: 0 calc(20vh - (var(--show) * 20vh));
 transition: translate 0.875s var(--elastic);
}

@property --show {
 syntax: '<number>';
 initial-value: 0;
 inherits: true;
}

@supports (animation-timeline: scroll()) {
  body {
   animation: show-cta both steps(1);
   animation-timeline: scroll(root);
   animation-range: 0 10vh;
  }
  
  @keyframes show-cta {
   to { --show: 1; }
  }
}

動畫步驟說明

首先將 CTA 的位置固定於右下角 (position: fixed),再搭配這段 CSS 語法:

translate: 0 calc(20vh - (var(--show) * 20vh));

這樣 CTA 的初始位置,就會根據我們自定義屬性 --show 的值而改變,當 --show 的值改變時,按鈕會從初始位置移動到新的位置。

也就是說,按鈕不會一開始就顯示在視窗的右下角,而是會隨著滾動進行平滑移動,直到滾動到特定的位置後按鈕才會完全顯示出來。因此,如果想要讓按鈕始終固定在視窗右下角,可以試著移除 translate 屬性,就能看到按鈕出現了。

接著使用 @property 可以自定義動畫屬性(例如 --show),並且在 @supports 中檢查瀏覽器是否支援 animation-timeline,這樣我們可以在支援的瀏覽器中使用更流暢的滾動動畫。如果不支援,那麼按鈕還是會有作用,只是少了一段平滑的動畫而已。

CodePen

▼ 試著滑動捲軸看效果吧

結論

以上兩種方法完全不需要 JavaScript,就可以建立一個吸人眼球的 CTA,我們使用 CSS 的 position: stickyposition: fixed,搭配 @property 及 CSS 動畫,就能做出效果豐富、互動性強的按鈕,真的不得不讚嘆想出這方法的 @jh3yy。

透過這個範例我也學到很多,關於使用 CSS 來製作視覺上流暢的動畫效果,並且學到如何使用 @property 來自定義動畫屬性,不得不說,CSS 的動畫世界真的是很博大精深!

歡迎給我點鼓勵,讓我知道你來過 :)

5
2
1
MUKI says:

如果文章有幫助到你,歡迎分享給更多人知道。文章內容皆為 MUKI 本人的原創文章,我會經常更新文章以及修正錯誤內容,因此轉載時建議保留原出處,避免出現版本不一致或已過時的資訊。

本文地址:https://muki.tw/pure-css-for-cta-button/ 已複製

Subscribe
Notify of
guest

0 則留言
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Copyright © since 2008 MUKI space* / omegaSS theme All Rights Reserved.