讓按鈕在移動設備上更大一些

在桌面設備上,網頁中的一些按鈕設計可能會小一點 (可能是為了設計 or 好看), 對於可以精準點擊的滑鼠游標來說,小按鈕在使用體驗上不會有問題, 但在移動設備上,過小的按鈕可能會讓用戶的大拇指在觸控時,難以精確的點擊。

<!-- 這個只有 size-6 的按鈕,在桌面設備上用滑鼠點擊可能相當容易,設計上也很好看 -->
<!-- 但在移動設備上,size-6 可能就有點過小了,對用戶的拇指不太友善 -->
<button
  type="button"
  class="flex size-6 items-center justify-center rounded-md transition hover:bg-zinc-900/15"
  aria-label="Toggle navigation"
>
  <!-- ... -->
</button>

在不改變按鈕外觀與設計的前提下,如果想要讓按鈕的點擊範圍在移動設備上大一點,可以怎麼做呢? Tailwind CSS 的作者提供了一個很酷的方式。

就是在 <button> 裡面直接加上一個大一點 <span> 標籤。

<button
  type="button"
  class="relative flex size-6 items-center justify-center rounded-md transition hover:bg-zinc-900/15"
  aria-label="Toggle navigation"
>
  <!-- 在 button 裡面加上一個大一點的 span 標籤,尺寸為 size-12 -->
  <!-- 透過 absolute 絕對定位,讓 span 不影響其他元素的排版 -->
  <!-- 使用 top-1/2 left-1/2 -translate-1/2 實現置中的效果  -->
  <!-- 這可以讓按鈕在不改變大小與設計的狀況下,讓點擊範圍大一點 -->
  <span class="absolute top-1/2 left-1/2 size-12 -translate-1/2"></span>
  <!-- ... -->
</button>

雖然這個方法很好的解決了按鈕在移動裝置上不夠大的問題, 但是你會發現在桌面設備上,當滑鼠只是靠近但還沒移動到按鈕上時,就會觸發按鈕的 hover 樣式。 這是因為只要進入 <span> 的範圍,就會觸發 <button>hover 效果。

你當然可以用 md:hidden,透過螢幕大小來判斷要不要隱藏 <span>, 但是作者請我們仔細思考一下,這樣的做法真的是對的嗎?

要不要顯示 <span> 應該是要用螢幕大小來判斷嗎?

實際上並不是,應該是根據用戶是否是使用手指來觸控才對。 CSS 本身提供了一個語法,可以判斷用戶是使用滑鼠游標還是使用手指觸控來瀏覽網頁。

/* 如果用戶是使用滑鼠游標,就顯示以下的效果 */
@media (pointer: fine) {
  /* ... */
}

/* 如果用戶是使用手指觸控,就顯示以下的效果 */
@media (pointer: coarse) {
  /* ... */
}

在 Tailwind CSS 中,雖然沒有提供 pointer 的 Variant Class Name, 但我們可以使用 Tailwind CSS 的客製化 Variant 功能。

<!-- 使用 [@media(pointer:fine)]:hidden,當用戶使用滑鼠游標時,隱藏 span -->
<span
  class="absolute top-1/2 left-1/2 size-12 -translate-1/2 [@media(pointer:fine)]:hidden"
></span>

This site uses Just the Docs, a documentation theme for Jekyll.