搜尋
首頁web前端css教學在網格容器中有條件造型選定的元素

Conditionally Styling Selected Elements in a Grid Container

許多應用場景都需要在網格中顯示可選擇的項目,例如日曆、購物車、圖庫、文件瀏覽器和在線圖書館,甚至那些要求你選擇所有帶有斑馬線的圖片的安全檢查。

本文介紹一種巧妙的方法來顯示網格中的可選項目,並非重新創建reCAPTCHA,而是能夠選擇多個項目。當選擇兩個或多個相鄰項目時,我們可以巧妙地使用:nth-of-type組合器、偽元素和:checked偽類來設計它們,使它們看起來組合在一起。

這種組合器和偽元素來實現圓角複選框的想法源於我之前寫的一篇文章。那是一個簡單的單列設計:

然而,這一次,圓角效果應用於網格上垂直和水平軸上的元素。你不需要閱讀我關於復選框樣式的上一篇文章,因為我將在這裡涵蓋你需要知道的一切。但是,如果你對本文中所做內容的簡化版本感興趣,那麼那篇文章值得一看。

開始之前…

注意以下幾點將非常有用。例如,為了簡單起見,我在我的演示中使用了靜態HTML 和CSS。根據你的應用程序,你可能需要動態生成網格及其中的項目。為了專注於效果,我省略了輔助功能的實際檢查,但在生產環境中,你肯定需要考慮這類事情。

此外,我使用CSS Grid 進行佈局。我推薦這樣做,但這只是一個個人偏好,你的體驗可能會有所不同。對我來說,使用網格允許我輕鬆使用同級選擇器來定位項目的::before::after偽元素。

因此,無論你可能想要在你的應用程序中使用什麼佈局標準,請確保偽元素仍然可以在CSS 中被定位,並確保佈局在不同的瀏覽器和屏幕上保持不變。

開始吧

正如你在之前的演示中可能注意到的那樣,選中和取消選中復選框元素會修改框的設計,具體取決於周圍其他復選框的選擇狀態。這是因為我使用相鄰元素的偽元素而不是它自己的元素來設置每個框的樣式。

下圖顯示了每個(第一列除外)中框的::before偽元素如何與它們左側的框重疊,以及每個(第一行除外)中框的::after偽元素如何與上面的框重疊。

這是基本代碼

標記非常簡單:

<main></main>

初始CSS 中還有更多內容。但是,首先是網格本身:

 /* 網格*/
main {
  display: grid;
  grid: repeat(5, 60px) / repeat(4, 85px);
  align-items: center;
  justify-items: center;
  margin: 0;
}

這是一個包含複選框的五行四列的網格。我決定清除複選框的默認外觀,然後賦予它們我自己的淺灰色背景和超圓角邊框:

 /* 所有復選框*/
input {
  -webkit-appearance: none;
  appearance: none;
  background: #ddd;
  border-radius: 20px;
  cursor: pointer;
  display: grid;
  height: 40px;
  width: 60px;
  margin: 0;
}

還要注意,複選框本身也是網格。這是放置其::before::after偽元素的關鍵。說到這裡,讓我們現在就做吧:

 /* 除第一列和第一行外的偽元素*/
input:not(:nth-of-type(4n 1))::before,
input:nth-of-type(n 5)::after {
  content: '';
  border-radius: 20px;
  grid-area: 1 / 1;
  pointer-events: none;
}

我們只選擇不在網格第一列或第一行的複選框的偽元素。 input:not(:nth-of-type(4n 1))從第一個複選框開始,然後選擇從那裡開始的每四個項目的::before 。但是請注意我們說的是:not() ,所以實際上我們所做的是跳過從第一個開始的每個第四個複選框的::before偽元素。然後,我們從第五個複選框開始,將樣式應用於每個複選框的::after偽元素。

現在我們可以為不在網格第一列或第一行的每個複選框設置::before::after偽元素的樣式,以便它們分別向左或向上移動,默認情況下隱藏它們。

 /* 除第一列外的偽元素*/
input:not(:nth-of-type(4n 1))::before {
  transform: translatex(-85px);
}

/* 除第一行外的偽元素*/
input:nth-of-type(n 5)::after {
  transform: translatey(-60px);
}

設置:checked 狀態的樣式

現在是設置複選框處於:checked狀態時的樣式。首先,讓我們給它們一個顏色,比如青檸綠背景:

 input:checked { background: limegreen; }

一個選中的框應該能夠重新設置所有相鄰選中框的樣式。換句話說,如果我們選擇網格中的第11 個複選框,我們也應該能夠設置其上方、下方、左側和右側周圍框的樣式。

這是通過定位正確的偽元素來完成的。我們如何做到這一點?好吧,這取決於網格中列的實際數量。如果在5×4 網格中選中兩個相鄰框,則CSS 如下:

 /* 選中框的右邊界(如果其右側的元素已選中)*/
input:not(:nth-of-type(4n)):checked input:checked::before {
  border-top-right-radius: 0;
  border-bottom-right-radius: 0;
  background: limegreen;
}
/* 選中框的下邊界(如果下面的元素已選中)*/
input:nth-last-of-type(n 5):checked * * * input:checked::after {
  border-bottom-right-radius: 0;
  border-bottom-left-radius: 0;
  background: limegreen;
}
/* 選中框的相鄰(右側)選中框的左邊界*/
input:not(:nth-of-type(4n)):checked input:checked input::before {
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
  background: limegreen;
}
/* 選中框的相鄰(下方)選中框的上邊界*/
input:not(:nth-of-type(4n)):checked * * * input:checked input::before {
  border-top-left-radius: 0;
  border-top-right-radius: 0;
  background: limegreen;
}

如果你願意,你可以動態生成上面的代碼。但是,對於一個典型的網格(例如圖片庫),列的數量將很小,並且可能是固定數量的項目,而行可能會不斷增加。特別是如果設計用於移動屏幕。這就是為什麼這種方法仍然是一種有效的方法。如果由於某種原因你的應用程序恰好具有有限的行和擴展的列,那麼考慮將網格旋轉成側面,因為對於一系列項目,CSS Grid 將它們從左到右、從上到下(即逐行)排列。

我們還需要為網格中的最後一個複選框添加樣式——它們並非都由偽元素覆蓋,因為它們是每個軸中的最後一項。

 /* 選中框(最後一列)的左邊界*/
input:nth-of-type(4n-1):checked input:checked {
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
}
/* 選中框(最後一列)的相鄰(下方)選中框的上邊界*/
input:nth-of-type(4n):checked * * * input:checked {
  border-top-left-radius: 0;
  border-top-right-radius: 0;
}

這些選擇器很棘手!第一個……

 input:nth-of-type(4n-1):checked input:checked

……基本上是這樣說的:

在倒數第二列中,一個選中的元素緊挨著一個選中的元素。

nth-of-type的計算方式如下:

 <code>4(0) - 1 = 无匹配项4(1) - 1 = 第3 个项目4(2) - 1 = 第7 个项目4(3) - 1 = 第11 个项目等等。</code>

所以,我們從第三個複選框開始,從那裡選擇每個第四個複選框。如果該序列中的複選框被選中,那麼如果它們也被選中,我們也會設置相鄰複選框的樣式。

以及這一行:

 input:nth-of-type(4n):checked * * * input:checked

是這樣說的:

一個元素,前提是它被選中,直接與一個元素相鄰,該元素又直接與另一個元素相鄰,該元素又直接與另一個元素相鄰,而該元素又直接與一個處於選中狀態的元素相鄰。

這意味著我們正在選擇每個第四個被選中的複選框。如果該序列中的複選框被選中,那麼如果它也被選中,我們將設置從該複選框開始的下一個第四個複選框的樣式。

使用它

我們剛才看到的只是設計背後的普遍原則和邏輯。同樣,它在你的應用程序中的實用性將取決於網格設計。

我使用了圓角邊框,但你可以嘗試其他形狀,甚至可以嘗試背景效果(Temani 為你提供了想法)。既然你知道公式是如何工作的,剩下的完全取決於你的想像力。

這是一個在簡單日曆中可能的樣子:

同樣,這只是一個使用靜態標記的粗略原型。而且,在日曆功能中需要考慮很多輔助功能方面的考慮。

就是這樣!很巧妙,對吧?我的意思是,發生的事情沒有什麼完全“新的”。但它是一個關於在CSS 中選擇事物的好例子。如果我們掌握了更多使用組合器和偽元素的高級選擇技術,那麼我們的樣式能力就可以超越只設置一個項目的樣式——正如我們所看到的,我們可以根據另一個元素的狀態有條件地設置項目的樣式。

以上是在網格容器中有條件造型選定的元素的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
光標的下一個CSS樣式光標的下一個CSS樣式Apr 23, 2025 am 11:04 AM

具有CSS的自定義光標很棒,但是我們可以將JavaScript提升到一個新的水平。使用JavaScript,我們可以在光標狀態之間過渡,將動態文本放置在光標中,應用複雜的動畫並應用過濾器。

世界碰撞:使用樣式查詢的鑰匙幀碰撞檢測世界碰撞:使用樣式查詢的鑰匙幀碰撞檢測Apr 23, 2025 am 10:42 AM

互動CSS動畫和元素相互啟動的元素在2025年似乎更合理。雖然不需要在CSS中實施乒乓球,但CSS的靈活性和力量的增加,可以懷疑Lee&Aver Lee有一天會成為一種

使用CSS背景過濾器進行UI效果使用CSS背景過濾器進行UI效果Apr 23, 2025 am 10:20 AM

有關利用CSS背景濾波器屬性來樣式用戶界面的提示和技巧。您將學習如何在多個元素之間進行背景過濾器,並將它們與其他CSS圖形效果集成在一起以創建精心設計的設計。

微笑嗎?微笑嗎?Apr 23, 2025 am 09:57 AM

好吧,事實證明,SVG的內置動畫功能從未按計劃進行棄用。當然,CSS和JavaScript具有承載負載的能力,但是很高興知道Smil並沒有像以前那樣死在水中

'漂亮”在情人眼中'漂亮”在情人眼中Apr 23, 2025 am 09:40 AM

是的,讓#039;跳上文字包裝:Safari Technology Preview In Pretty Landing!但是請注意,它與在鉻瀏覽器中的工作方式不同。

CSS-tricks編年史XLIIICSS-tricks編年史XLIIIApr 23, 2025 am 09:35 AM

此CSS-tricks更新了,重點介紹了年鑑,最近的播客出現,新的CSS計數器指南以及增加了幾位新作者,這些新作者貢獻了有價值的內容。

tailwind的@Apply功能比聽起來更好tailwind的@Apply功能比聽起來更好Apr 23, 2025 am 09:23 AM

在大多數情況下,人們展示了@Apply的@Apply功能,其中包括Tailwind的單個property實用程序之一(會改變單個CSS聲明)。當以這種方式展示時,@Apply聽起來似乎很有希望。如此明顯

感覺就像我沒有釋放:走向理智的旅程感覺就像我沒有釋放:走向理智的旅程Apr 23, 2025 am 09:19 AM

像白痴一樣部署的部署歸結為您部署的工具與降低複雜性與添加的複雜性之間的獎勵之間的不匹配。

See all articles

熱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

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

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中