如何仅用CSS切换非Checkbox兄弟元素的HTML元素可见性?
仅通过CSS切换第二个div内p标签可见性的方案
问题背景
现有如下HTML代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> #check:checked+p { display: none; } </style> </head> <body> <div> <label for="check">Toggle</label> <input type="checkbox" name="" id="check"> <p>Lorem ipsum dolor sit amet.</p> </div> <div> <p>Lorem, ipsum dolor sit amet consectetur adipisicing el nemo natus atque in cupiditate sint.</p> </div> </body> </html>
当前CSS仅能切换Checkbox同级p标签的可见性,现需仅通过CSS切换第二个div内p标签的可见性,询问是否有可用伪选择器。
解决方案说明
1. 不修改现有HTML结构的情况
纯CSS无法实现该需求。因为CSS选择器是单向向下/同级向后解析的,目前规范中没有提供「父选择器」,无法从<input id="check">(第一个div的子元素)向上定位到其父div,也就没法选中父div的同级第二个div,自然无法控制其中的p标签。
2. 微调HTML结构的情况
如果允许调整HTML,将<input id="check">移到第一个div外部,就可以利用CSS的**兄弟选择器(~)**实现需求:
修改后的代码示例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> /* 可选:保留第一个div内p标签的切换效果 */ #check:checked ~ div:first-child p { display: none; } /* 控制第二个div内p标签的可见性 */ #check:checked ~ div:nth-of-type(2) p { display: none; } </style> </head> <body> <input type="checkbox" name="" id="check"> <div> <label for="check">Toggle</label> <p>Lorem ipsum dolor sit amet.</p> </div> <div> <p>Lorem, ipsum dolor sit amet consectetur adipisicing el nemo natus atque in cupiditate sint.</p> </div> </body> </html>
核心逻辑是:当checkbox被勾选时,通过兄弟选择器~选中它之后的第二个div,再定位到内部的p标签进行隐藏控制。
内容的提问来源于stack exchange,提问作者Sanjay Lamba
相关产品推荐
相关产品推荐

