前言

 过去零零星星地了解和使用:link::aftercontent等伪类、伪元素选择器,最近看书时发现这方面有所欠缺,于是决定稍微深入学习一下,以下为伪类部分的整理。

伪类

 伪类选择器实质上是让设计师可以根据元素特定的状态,设置不同的视觉效果。具体有:link:visited:hover:active:focus:focus-within:target:root:checked

HTMLAnchorElement的4大经典伪类

  1. :link,用于设置链接初始状态时的样式;
  2. :visited,用于设置链接被点击过后的样式;
  3. :hover,用于设置鼠标悬停在链接上方时,链接的样式;
  4. :active,用于设置鼠标按键按下,但未释放时,链接的样式。

 想必各位都和我一样,最初接触到的就是上述4个伪类了吧?!而且还死机硬背它们的设置顺序(LVAH)吧,哈哈。

设置当前目标元素样式

 还记得URL中的井号吗?从井号(#)开始到URL的末尾称为URL的hash或fragment,用于定位页面内某项资源。假设现在页面存在<h3 id="title">Target</h3>的元素,那么只要地址栏输入#title浏览器就会不断滚动(滚动不一定存在补间动效)直到元素h3#title位于可视区的特定位置。(注意:请不要和UI Routing混为一谈)

 而上述这个被定位的页面资源,被称为目标元素当前活动元素!可通过:target设置其样式。

 兼容性:IE9开始支持。

示例:

// 当前URL为http://foo.com#1
:target {
color: red;
}
.title{
color: blue; &:target{
border: solid 1px red;
}
} .title{I'm not target element.}
.title#1{Yes, I'm.}

设置元素获得焦点时的样式

:focus用于设置元素处于focus状态下的样式。

兼容性:IE8开始支持。

那么哪些元素支持focus状态呢?那要先弄清楚通过哪些操作可能实现focus。

它们分别是:

  1. 鼠标点击;
  2. Tab键;
  3. 通过JavaScript的HTMLElement.prototype.focus()方法。

那么传统上支持focus状态的元素必定是abuttoninputselecttextareas.

而HTML5中增加当元素设置了contenteditabletabindex属性时,该元素支持focus状态。

也就是符合以下选择器的元素均支持focus状态。

a,button,input,select,textarea,[contenteditable],[tabindex]

注意:若tabindex属性值小于0,则无法通过Tab键获得焦点。但可以通过鼠标点击 或 脚本时元素获得焦点。

JS获取当前得到焦点的元素

/*
* 加载完成时默认返回body
* 若某元素获得焦点时,则返回该元素
*/
document.activeElement :: HTMLElement

另外还有一个让人误会的属性

// 用于检测文档是否得到焦点,即用户是否正在与页面交互
// 页面仅仅位于屏幕可视区域,而用户没有与之交互时返回false。
document.hasFocus :: Void -> Boolean

设置子元素获得焦点时,该元素的样式

:focus-within,用于设置当子元素处于focus状态时,该元素的样式。

兼容性:Chrome63开始支持。

示例:二次确认密码时,密码框高亮

.form-control{
&:focus-within > input{
&:focus {
border: solid 1px skyblue;
} &:not(:focus){
border: solid 1px orange;
}
}
} .form-control>input.pwd[type=password]+input.confirm-pwd[type=password]

其他

  1. :root,用于设置<html>元素的样式,从IE9开始支持。
  2. :checked,用于设置单选和复选控件被选中的样式,从IE9开始支持。结合伪元素::beforecontent属性可以实现灵活高效的自定义单选和复选控件。
  3. :empty,用于设置没有子节点的元素的样式。div{ }为存在TEXT_NODE子节点的元素,而div{}则为没有子节点的元素。
  4. :not,作为谓语表达取反的语义。
  5. :placeholder-shown,用于设置元素placeholder显示时的样式。

总结

尊重原创,转载请注明来自:https://www.cnblogs.com/fsjohnhuang/p/9551799.html _肥仔John

参考

https://css-tricks.com/almanac/selectors/f/focus/

https://www.zhangxinxu.com/wordpress/2018/01/css-focus-within-pseudo-class-selector

CSS魔法堂:稍稍深入伪类选择器的更多相关文章

  1. HTML&CSS基础-子元素的伪类选择器

    HTML&CSS基础-子元素的伪类选择器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.html的源代码 <!DOCTYPE html> <html& ...

  2. Css详解之(伪类选择器)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. CSS中before、after伪类选择器的巧用

    大家好,今天给大家带来使用css中 before . after 实现两个效果,话不多说,我们先来看看, before 和 after 它们的作用是什么 选择器 作用 before 向选定的元素前插入 ...

  4. CSS魔法堂:一起玩透伪元素和Content属性

    前言  继上篇<CSS魔法堂:稍稍深入伪类选择器>记录完伪类后,我自然而然要向伪元素伸出"魔掌"的啦^_^.本文讲讲述伪元素以及功能强大的Contet属性,让我们可以通 ...

  5. 谈谈一些有趣的CSS题目(十)-- 结构性伪类选择器

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  6. css伪类选择器及伪元素选择器

    1.类选择器 在css中可以使用类选择器把相同的元素定义成不同的样式.比如: 结果如下: 标题背景未变 2.伪类选择器 类选择器和伪类选择器的区别在于,类选择器我们定义的,而伪类选择器是CSS中已经定 ...

  7. CSS伪类选择器

    一.CSS伪类选择器用于给某些选择器添加效果语法规则:选择器:伪选择器例:a:link {color: #FF0000} 未访问的链接 a:visited {color: #00FF00} 已访问的链 ...

  8. CSS魔法堂:选择器及其优先级

    一.前言    首先看看一道阿里这期网申的题目吧! 1.找出下面优先级相同的选择器 A. img.thumb:after B.[data-job="frontend"]::firs ...

  9. CSS动态伪类选择器温故-3

    动态伪类选择器 伪类选择器:大家熟悉的:[:link][:visited][:hover][:active]CSS3的伪类选择器分为六种:(1)动态伪类选择器(2)目标伪类选择器(3)语言伪类选择器( ...

随机推荐

  1. 不同路径II(一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。)

    示例 1: 输入: [   [0,0,0],   [0,1,0],   [0,0,0] ] 输出: 2 解释: 3x3 网格的正中间有一个障碍物. 从左上角到右下角一共有 2 条不同的路径: 1. 向 ...

  2. web发展阶段简介

     web1.0.web2.0和web3.0的区别前言: 其实并没有什么所谓的2.0.3.0,因为你没法准确的界定它是什么样的应用,也没法界定它是什么时候开始的,什么时候结束,它只是互联网本身发展的一种 ...

  3. 爬虫之 beautifusoup4

    1. 使用方法 2.解析器 3. 详细用法 4. find_all方法 5. 遍历文档树

  4. laravel启动过程简单解析

    :first-child{margin-top:0!important}img.plugin{box-shadow:0 1px 3px rgba(0,0,0,.1);border-radius:3px ...

  5. Best Cow Fences POJ - 2018 (二分)

    Farmer John's farm consists of a long row of N (1 <= N <= 100,000)fields. Each field contains ...

  6. The path is not a valid path to the xxx kernel header

    在安装vmtools时无意中出现了这样的问题 1.gcc错误 Searching for GCC- The path "" is not valid path to the gcc ...

  7. 001. Ansible简介

    一 简介 Ansible是一款极其简单的自动化运维工具, 基于Python开发, 集合了众多运维工具(puppet, cfengine, chef, func, fabric)的优点. 实现了批量系统 ...

  8. Java中位运算符的使用

    先预知识: 数据在计算机中是以二进制的形式进行存储的,而二进制在内存中是以补码的形式进行存储的.在介绍位运算之前,首先来看一下原码.反码和补码的概念.由于正数的原码.反码和补码的形式都是一样的,所以以 ...

  9. 在控制台下玩玩dotnet core内置原生的DI

    转载请注明出处:http://www.cnblogs.com/zhiyong-ITNote/ 在基于dotnet core的web开发中,我们会经常用到DI,那么如果单单使用dotnet core自身 ...

  10. Android的系统属性:build.propSystemProperties

    获取build.prop的键值信息: String sn = SystemProperties.get(SN_INFO); 其中key值为: public static final String SN ...