一篇带你了解全新的的 CSS 选择器 :Has()

网站建设5年前发布
50 0 0

大家好,我是 CUGGZ。,你有没有想过使用CSS选择器来检查父元素中是否存在特定的元素?例如,如果一个卡片组件中有图片,就给它添加一个display:flex。这以前在CSS中是无法实现的,而全新的 CSS 选择器:has就可以帮助我们选择包含特定元素的父元素。下面来看看这个全新的 CSS 选择器吧!,在CSS中,我们无法根据元素中是否存在特定的元素来设置父元素的样式,要想实现这一点,就必须创建CSS类,并根据需要进行类的切换。来看下面的例子:,20230306152142830cb38558c82fa110e6921d82527472c169f9988,这里有两种卡片:包含图片和不包含图片。在CSS中需要这样做:,这里创建了一个类card-plain,专门用于没有图片的卡片,在没有图片时就不需要flex布局。如果使用 CSS 中的父选择器 :has 就不需要再写这个类,只需要使用它来检查卡片中是否包含.card-image即可:,​根据 CSS 规范,:has 选择器可以检查父元素是否包含至少一个元素,或者一个条件,例如输入是否获取到焦点。,:has 选择器不仅可以检查父元素是否包含特定的子元素,还可以检查一个元素后面是否跟有另一个元素:,这将检查 <h2> 元素是否直接跟在 <p> 元素之后。,我们也可以将它与表单元素一起使用来检查输入是否获取到了焦点:,下面来看看一些使用:has选择器实现页面效果的案例吧!,当处理章节标题时有两种情况,一种是只包含标题,另一种包含标题和链接。,2023030615234246199b0506b837a7ccf59605259091d60bf64d486,根据是否有链接来定义不同的样式:,这里使用了:has(> a),它表示只选择直接子元素。,有两种类型的卡片操作:一种只有一个操作(链接),另一种具有多个操作(保存、分享等)。,20230307014855b91586a2032657c96c53350779c96c6e3267c8409,当图片具有多个操作时需要给这些操作添加display: flex,可以这样来实现:,根据是否有图片来重置卡片组件的border-radius。,20230306152143c9ce80a060e9e900a87859d1b8b27c7242d5d3388,实现效果如下:,20230306152143a2e1f4e22192d1872a6791a8ef8085a0c50201395,有一个具有多个选项的组件,当它们没有被选中时,不显示重置按钮。当选中其中一个选项时,显示重置按钮。,20230306152342c6b77216178166807b7908dabb55e48bdd1631860,可以使用 :has选择器轻松实现这个功能:,有时可能需要根据之前的选择来显示特定的表单字段。在下面的例子中,当下拉框选中“other”字段时,就展示 other reason 输入框:,20230306152145f8a1626955490255f6c380b7b075e5318c6b5d558,使用 CSS :has 选择器就可以检查选择菜单是否选择了 other 字段,并在此基础上显示 other reason 输入框:,有一个带有子菜单的导航栏,当鼠标悬停在菜单项上时展示子菜单:,2023030615214545f75e9658370bbc21716448d4d6d420b2ec2e379,我们需要做的就是根据是否展示子菜单来显示或隐藏右侧的箭头。可以使用:has 选择器轻松实现这一点,这里只需检查li元素中是否包含ul即可:,在某些仪表板中,可能需要用户必须注意重要警报。在这种情况下,拥有页内警报可能还不够。例如,在这种情况下,可能会为标题元素添加红色边框和暗红色背景色。这样会增加用户快速注意到警报的可能性。20230306152145f87c8608042464c182e44489d76631d74c0453102,CSS :has 就可以检查.main元素是否有警报。如果有,将以下样式添加到标题中:,可以使用 CSS :has 来更改网站的配色方案。例如,如果有多个使用 CSS 变量构建的主题,可以通过<select>菜单来进行切换。,2023030615234262c02c7145ace346e0a448d0cb2c9447e2c2b2765,当选择另一个主题时,CSS 变量将被更改:,显示效果如下:,2023030615214789a9102325277a8c2297120c15d1a3b545a4c5128,有一个默认的按钮样式。当按钮中包含图标时,使用 flexbox 来居中对齐按钮的内容:,20230306152148213a8260195b2dcb55f856896b1dbda1754a99130,有一组操作按钮,如果超过 2 个按钮,则最后一个按钮显示在右侧:,202303061521481218d7d43f0dccf7ef51719a34cbddd8de6606230,可以使用数量查询来实现这一点。下面的 CSS 将检查按钮的数量是否为 3 或更多。如果是,则最后一个 flex 项目将使用 margin-left: auto:,使用 CSS grid 布局中,可以使用 minmax() 功能创建真正响应式和自动调整大小的网格项。然而,这可能还不够,我们还想根据项目数量来改变网格。,20230306152149f7f9c195517e497f4e2969ac7a778a12fe02f8599,当有 5 个项目时,最后一个将换行:,20230306152149861318400c2309ab624032e052851867cb4de8190,可以通过检查.wrapper中是否有 5 个或更多项目来解决这个问题。同样,这是使用到了数量查询的概念。,实现效果如下:,20230306152344d3c21da04132236d1eb100a06a660a973f71bd460,:has 选择器的支持情况如下:,2023030615282753690193099f8d7abb4218b6cdc25573ee01ee990,可以使用 CSS 中的@supports规则来判断浏览器是否支持该选择器:

© 版权声明

相关文章