在CSS中查找一個(gè)類是否被包含,可以使用CSS偽類:
:has。
這個(gè)偽類可以用于匹配一個(gè)元素是否包含了某個(gè)選擇器,例如:
.box:has(.red) { background-color: lightblue; }
這將會(huì)選中所有包含有類名為 "red" 的子元素的 "box" 元素,并設(shè)置背景顏色為淺藍(lán)色。
然而,這個(gè)偽類雖然在CSS規(guī)范中被提到,但是目前還沒有被實(shí)現(xiàn)。因此,我們需要使用其他的方法來模擬這個(gè)功能。
一種方法是使用JavaScript,通過遍歷所有匹配的元素,判斷它們是否包含目標(biāo)類名:
function hasClass(element, className) { return (' ' + element.className + ' ').indexOf(' ' + className + ' ') >-1; } var elements = document.querySelectorAll('.box'); for (var i = 0; i< elements.length; i++) { var element = elements[i]; if (hasClass(element, 'red')) { element.style.backgroundColor = 'lightblue'; } }
這種方法雖然可行,但是需要耗費(fèi)較多的DOM操作,不太適合在大型頁面上使用。
另一種方法是使用CSS變量的特性,給目標(biāo)元素添加一個(gè)自定義屬性,然后用CSS選擇器判斷其值是否包含目標(biāo)類名:
.box::before { content: attr(data-classes); display: none; } .box[data-classes*="red"] { background-color: lightblue; }
在這個(gè)例子中,我們給每個(gè) ".box" 元素添加了一個(gè)自定義屬性 "data-classes",其值為所有包含的類名,通過CSS變量的特性,將這個(gè)屬性值賦值到 ":before" 偽元素的內(nèi)容屬性中。然后,我們用包含選擇器 "*=" 來判斷屬性值中是否包含目標(biāo)類名。
這種方法比起JavaScript方法來說,更加輕量級(jí),但是需要在HTML中添加一些額外的結(jié)構(gòu)。
總而言之,雖然目前CSS規(guī)范中提到了 ":has" 偽類,但是目前還沒有被瀏覽器實(shí)現(xiàn)。我們可以使用JavaScript和CSS變量的特性來模擬這個(gè)功能,但是需要根據(jù)具體情況進(jìn)行選擇,保證頁面性能和HTML結(jié)構(gòu)清晰。