Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign up神奇的选择器 :focus-within #36
Open
Comments
|
还可以,主流基本都支持。不过国产移动端浏览器估计要等一等 |
|
@fengcms 本来是锦上添花的。无妨无妨 |
|
这个选择器太有用了!幸好我看了你的文章,不然就孤陋寡闻了。 |
|
学习了 |
|
从效果上来理解的话,是不是可以理解为类父类选择器? |
|
@liuliangsir 其实 CSS 在这方面很谨慎,有子类选择器,但是没有父选择器。 所以这里出现了父类选择器也是因为,这种伪类状态父选择器并不会影响页面绘制的速度。 |
|
本质上,就是对 |
|
对于这样的结构 |
|
我看不能。应该必须使用JS。 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
CSS 的伪类选择器和伪元素选择器,让 CSS 有了更为强大的功能。
有个错误有必要每次讲到伪类都提一下,有时你会发现伪类元素使用了两个冒号 (::) 而不是一个冒号 (:),这是 CSS3 规范中的一部分要求,目的是为了区分伪类和伪元素,大多数浏览器都支持下面这两种表示方式。
通常而言,
符合标准而言,单冒号(:)用于 CSS3 伪类,双冒号(::)用于 CSS3 伪元素。
当然,也有例外,对于 CSS2 中已经有的伪元素,例如 :before,单冒号和双冒号的写法 ::before 作用是一样的。
所以,如果你的网站只需要兼容 webkit、firefox、opera 等浏览器或者是移动端页面,建议对于伪元素采用双冒号的写法,如果不得不兼容低版本 IE 浏览器,还是用 CSS2 的单冒号写法比较安全。
伪类选择器
:focus-within言归正传,今天要说的就是
:focus-within伪类选择器。它表示一个元素获得焦点,或,该元素的后代元素获得焦点。划重点,它或它的后代获得焦点。
这也就意味着,它或它的后代获得焦点,都可以触发
:focus-within。:focus-within的冒泡性这个属性有点类似 Javascript 的事件冒泡,从可获焦元素开始一直冒泡到根元素
html,都可以接收触发:focus-within事件,类似下面这个简单的例子这样:就是这样:
CodePen Demo -- :focus-within 冒泡触发
这个选择器的存在,让 CSS 有了进一步的让元素持久停留在一种新状态的的能力。
下面几个例子,看看
:focus-within可以提供什么能力,做些什么事情。感应用户聚焦区域
它或它的后代获得焦点,这一点使得让感知获焦区域变得更大,所以,最常规的用法就是使用
:focus-within感应用户操作聚焦区域,高亮提醒。下面的效果没有任何 JS 代码:
这里是什么意思呢?
:focus-within做了什么呢?:focus伪类,而是可以给需要的父元素设置,这样当元素获焦时,我可以一并控制它的父元素的样式核心思想用 CSS 代码表达出来大概是这样:
DEMO -- CSS focus-within INPUT
运用上面思想,我们可以把效果做的更炫一点点,在某些场景制作一些增强用户体验的效果:
DEMO -- PURE CSS FOCUS By :focus-within
TAB导航切换
在之前的一篇文章里,介绍了两种纯 CSS 实现的 TAB 导航栏切换方法:
纯CSS的导航栏Tab切换方案
现在又多了一种方式,利用了
:focus-within可以在父节点获取元素获得焦点的特性,实现的TAB导航切换:DEMO -- focus-within switch tab
主要的思路就是通过获焦态来控制其他选择器,以及最重要的是利用了父级的
:not(:focus-within)来设置默认样式:配合
:placeholder-shown伪类实现表单效果:focus-within一个人能力有限,通常也会配合其他伪类实现一些不错的效果。这里要再简单介绍的是另外一个有意思的伪类:placeholder-shown。意思大概就是,当
input类型标签使用了 placeholder 属性有了默认占位的文字,会触发此伪类样式。配合:not()伪类,可以再改变当默认文字消失后的样式,再配合本文的主角,我们可以实现表单的一系列效果。CSS 代码大概呈现成这样:
实际效果如下:
可以看到,上面的效果没有用到任何 JS,可以实现:
CodePen Demo -- :placeholder-shown && :focus-within
实现离屏导航
这个是其他很多文章都有提到过的一个功能,利用
focus-within便捷的实现离屏导航,可以说将这个属性的功能发挥的淋漓尽致,这里我直接贴一个 codepen 上 Dannie Vinther 对这个效果的实现方案:CodePen Demo -- Off-screen nav with :focus-within [PURE CSS]
实现掘金登录动效切换
juejin.im是我很喜欢的一个博客网站,它的登录有一个小彩蛋,最上面的熊猫在你输入帐号密码的时候会有不同的状态,效果如下:
利用本文所讲的
focus-within,可以不借助任何 Javascript,实现这个动效:感兴趣的可以戳这里看看完整的Demo代码:
CodePen Demo -- 掘金登录效果纯CSS实现
兼容性
好了,例子举例的也差不多了,下面到了杀人诛心的兼容性时刻,按照惯例,这种属性大概率是一片红色,看看 CANIUSE,截图日期(2018/08/02),其实也还不算特别惨淡。
最后
感谢耐心读完。本文只是抛砖引玉,期待发掘
focus-within更多有意义的用法。更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。
好了,本文到此结束,希望对你有帮助 :)
如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
最后,新开通的公众号求关注,形式希望是更短的篇幅,质量更高一些的技巧类文章,包括但不局限于 CSS: