刨根问底,你知道:hover等4个伪类为什么要按顺序排列吗


引言

:link,:visited,:hover,:active这4个伪类大家都不陌生,4个伪类要按照LvHa这个爱恨原则来排(外国友人起的记忆方法),不然有些效果会出问题。

但是你们都想过这几个属性为什么要按顺序排吗?


:link:hover

当鼠标移动到a标签上时,会触发a标签上的:hover效果,但同时,此时的:link效果仍然存在于a标签上,既然两个效果都在a标签上起作用,那么根据css的就近原则,写在后面的css样式就覆盖了前面的效果,所以

<style>
#b1:hover{
color: red;
} #b1:link{
color: green;
} </style> <a href="#" id="b1">点击我</a>

效果:

#b1:hover{
color: red;
}

#b1:link{
color: green;
}

点击我


可以看到,由于此时link位于hover之后,所以当我们鼠标移上a标签时,发现hover效果被覆盖了,并没有变成红色,如果我们把顺序换过来,那么就会看到我们预想中的效果了

<style>

    #b2:link{
color: green;
}
#b2:hover{
color: red;
}
</style> <a href="#" id="b2">点击我</a>

效果:

#b2:link{
color: green;
}
#b2:hover{
color: red;
}

点击我

此时,hover效果起作用了,所以我们可以得出结论一:hover要位于link之后


:link:hover:active

还是原本的思路分析,当鼠标点击时,此时:link:hover:active都在a标签上产生效果,所以还是根据就近原则,上代码

<style>

    #b3:hover{
color: red;
}
#b3:active{
color: blue;
}
#b3:link{
color: green;
}
</style> <a href="#" id="b3">点击我</a>

#b3:hover{
color: red;
}
#b3:active{
color: blue;
}
#b3:link{
color: green;
}

点击我

由于:link放在最后面,所以不管是:hover还是:active的效果都被:link覆盖了,所以此时无论鼠标以上还是点击我们都无法看到效果


<style>
#b4:active{
color: blue;
}
#b4:link{
color: green;
} #b4:hover{
color: red;
}
</style> <a href="#" id="b4">点击我</a>

#b4:active{
color: blue;
}
#b4:link{
color: green;
}

#b4:hover{
color: red;
}

点击我

:hover放到了最后,此时我们可以看到,鼠标移上:hover产生了效果,同时点击时仍然无法看到:active的效果,因为此时的:active仍被:hover覆盖了


正确的代码

<style>

    #b5:link{
color: green;
}
#b5:hover{
color: red;
}
#b5:active{
color: blue;
}
</style> <a href="#" id="b5">点击我</a>

#b5:link{
color: green;
}
#b5:hover{
color: red;
}
#b5:active{
color: blue;
}

点击我

至此,我们终于看到了想要的效果,同时也得出第二个结论

hover必须位于link之后,同时active必须位于hover和link之后

所以目前我们的顺序就是link/hover/active


visited

那么visited应该放哪里呢?我们先试着把它放到最后

<style>

    #b6:link{
color: green;
} #b6:hover{
color: red;
}
#b6:active{
color: blue;
}
#b6:visited{
color: yellow;
}
</style> <a href="#1" id="b6">点击我</a>

#b6:link{
color: green;
}

#b6:hover{
color: red;
}
#b6:active{
color: blue;
}
#b6:visited{
color: yellow;
}

点击我

鼠标移上,点击,乍一看好像没问题呀,所有的效果都正确的产生了。但是,当我们点击完了第一次a标签,再次进行点击的时候,发现:hover:active都不起效果了,原来是因为此时:visited起了作用,同时也由于:visited写在最后,所以第二次点击的时候覆盖了之前的效果


最终的代码

<style>

    #b7:link{
color: green;
} #b7:visited{
color: yellow;
} #b7:hover{
color: red;
}
#b7:active{
color: blue;
} </style> <a href="#2" id="b7">点击我</a>

#b7:link{
color: green;
}

#b7:visited{
color: yellow;
}

#b7:hover{
color: red;
}
#b7:active{
color: blue;
}

点击我

我们改了一下位置,把:visited放到了:link之后,这时,无论是第一次点击,还是第二次点击,:visited的效果都正确的产生了,同时又没有覆盖:hover:active的效果,而最终的这个顺序,也正是我们说的LvHa原则

看完此文,希望大家能够对这4个伪类有更深刻的认识,同时也能理解它们排列的顺序,其实如果理解了这几个伪类为什么这样排之后,就不再需要借助LoHa这样的窍门来记忆了,理解才是最好的记忆方法。

你知道hover、active这四个伪类为什么要按顺序写吗的更多相关文章

  1. <a>链接的四个伪类顺序

    <a>元素的作用是可以创建一个链接,链接对应4个状态:未访问,已访问,鼠标悬停,鼠标点击瞬间. 为了给链接的4个状态应用样式,引入伪类的概念. 什么是伪类呢?简单点说,就是你没定义这个类, ...

  2. a 标签的四个伪类

    link        有链接属性时visited    链接地址已被访问过active     被用户激活(在鼠标点击与释放之间发生的事件)hover      其鼠标悬停 <!DOCTYPE ...

  3. a标签的四个伪类

    A标签的css样式   CSS为一些特殊效果准备了特定的工具,我们称之为“伪类”.其中有几项是我们经常用到的,下面我们就详细介绍一下经常用于定义链接样式的四个伪类,它们分别是: :link    :v ...

  4. a链接四种伪类状态切换实现人机交互

    常见的color, font-family, background 等css属性都能够设置链接的样式,a链接的特殊性在于能够根据它们所处的状态来设置它们的样式.a标签与人交互的4个状态属于伪类状态切换 ...

  5. html中a标签伪类的优先级与顺序

    /** 这四个伪类的优先级相同,前一个会覆盖后一个 建议书写顺序: lvha => love hate(好记) */ a:link { color: red; } a:visited { col ...

  6. css伪类选择器的查找顺序

    当伪类选择器last-child.first-child无效时,就是因为不了解css伪类选择器的查找顺序造成选中某一元素失败. 先给出一段dom <body> <div>第一个 ...

  7. 【CSS学习笔记】a标签的四种伪类

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

  8. a标签的四个伪类是什么?如何排序?为什么?

    爱恨分明原则: l v h a 注释:为了产生预期的效果,在 CSS 定义中,a:hover 必须位于 a:link 和 a:visited 之后 ! 注释:为了产生预期的效果,在 CSS 定义中,a ...

  9. a:link a:visited a:hover a:active四种伪类选择器的区别

    a:link选择网页中所有没有被visited的a标签,就是没有鼠标悬停hover或者点击click(a链接没有被访问时的样式) a:visited选择网页中所有已经被click的a链接,用来告诉用户 ...

随机推荐

  1. Linux升级Python提示Tkinter模块找不到解决

    一.安装tkinter 在Linux中python默认是不安装Tkinter模块, [root@li250- ~]# python Python (r266:, Feb , ::) [GCC (Red ...

  2. 自动分组+合并完整的sql脚本

    BEGIN#前提:指定字符串长度为8字符定长#逻辑:循环8次,比对2个字符串相同索引位置下的数值大小,并取结果最大值.#示例:merge1(输入参数source1,输入参数source2,输出结果re ...

  3. Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器

    Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器 MVC概念 MVC的含义是 “模型-视图-控制器”.MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程 ...

  4. STL之queue(单向队列)

    单向队列中的数据是先进先出(First In First Out,FIFO).单向队列一共6个常用函数(front().back().push().pop().empty().size()) #inc ...

  5. eclipse安装PyDev插件出错No software site found at jar:file:[离线包路径]!/. Do you wish to edit the location?

    解决方法是直接将下载的离线包解压,得到plugins和features文件夹,放到Eclipse的dropins目录下.重启Eclipse,PyDev插件即可安装成功. 离线包下载地址:http:// ...

  6. RSA, ACS5.X 集成配置

    目的是RSA和ACS集成,ACS作为RADIUS服务器提供二次验证服务. ①配置RSA SecurID Token Servers   按照如下网址配置: http://www.cisco.com/c ...

  7. jacksonall的使用,解析json

    转自:http://www.cnblogs.com/lee0oo0/archive/2012/08/23/2652751.html , Jackson可以轻松的将Java对象转换成json对象和xml ...

  8. open和fopen的区别:

    1.缓冲文件系统缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量.执行 ...

  9. Qt学习 之 多线程程序设计(QT通过三种形式提供了对线程的支持)

    QT通过三种形式提供了对线程的支持.它们分别是, 一.平台无关的线程类 二.线程安全的事件投递 三.跨线程的信号-槽连接. 这使得开发轻巧的多线程Qt程序更为容易,并能充分利用多处理器机器的优势.多线 ...

  10. poj3308Paratroopers(最小割)

    题目请戳这里 题目大意:给一个n*m的矩阵,给一些点(ri,ci)表示该点在第ri行第ci列.现在要覆盖所有的点,已知覆盖第i行代价为Ri,覆盖第j列代价为Cj.总代价是累乘的,求最小总代价能覆盖所有 ...