|CSS|Focus Effect with :has(:hover)

Focus Effect with :has(:hover)

本篇將介紹如何利用 CSS 的 :has() 選擇器,製作一個在滑鼠懸停時自動聚焦的卡片特效。不需依賴 JavaScript,即可實現簡潔高效的互動設計。

以下是卡片 html 部分,整體結構以 <ul> 為容器,內含數個 <li> 作為卡片項目。每張卡片內包含背景圖層、遮罩層、內容區塊及按鈕。

html
  • Card A

    Lorem Ipsum is simply dummy text of the printing and typesetting industry.

  • Card B

    Lorem Ipsum is simply dummy text of the printing and typesetting industry.

  • Card C

    Lorem Ipsum is simply dummy text of the printing and typesetting industry.

  • Card D

    Lorem Ipsum is simply dummy text of the printing and typesetting industry.


CSS 實作,聚焦效果的核心,僅需兩段簡單的 CSS:

css
ul.card-list:has(li:hover) li:hover{ justify-content:center; margin-inline:min(1.85vw, 0.7rem); transform:scale(1.06); filter:drop-shadow(0px 0px 20px var(--drop-shadow-focus)) brightness(1.1); cursor:pointer; z-index:5;}

ul.card-list:has(li:hover) li:not(:hover){ margin-inline:min(0.6vw, 0.18rem); filter:grayscale(65%) brightness(0.92) blur(0px); transform:scale(0.98); 
                                           transform-origin:center;
                                          }

這樣的設定能夠自然地將使用者的視覺集中於互動對象,並減少其他元素的干擾。

  • ul.card-list:has(li:hover):
    :has(li:hover) 確保當 ul.card-list 列表中有任一個 .card-item 被 hover 時,才觸發卡片樣式變更。
  • ul.card-list:has(li:hover) li:hover:
    針對目前被懸停的卡片,套用放大、變亮,並發光暈,使其從整體中突顯出來。
  • ul.card-list:has(li:hover) li:not(:hover):
    :not() 是用來排除符合條件的元素。在這裡,代表「所有沒有被滑鼠懸停的卡片」,這些卡片會微微縮小、降低飽和度與亮度,進一步凸顯當前聚焦的卡片。