关于mouseenter,css覆盖,交集选择器
欢迎来到我的博客!
使用 Markdown 格式编写。
今天学到了什么
- mouseenter使用时的注意要点
- css样式覆盖
- 交集选择器
mouseenter使用时的注意要点
mouseenter使用时的注意要点:如果事件类型是mouseenter,那就不要用e.target.tagName === ’***‘了,这是子元素被触发时的写法,而子元素被触发不会冒泡到父元素,也就是说middle的addEventListener不会执行
middle.addEventListener('mouseenter', show) middle.addEventListener('mouseleave', hide)
function show(e) { //错误写法 if (e.target.tagName === 'IMG') { large.style.display = 'block' } }
function hide(e) { //错误写法 if (e.target.tagName === 'IMG') { setTimeout(function () { large.style.display = 'none' }, 200) } }你说得很对,mouseenter 和 mouseleave 是不支持冒泡的,而 mouseover 和 mouseout 支持冒泡。
我们可以这样理解其中的区别:
-
关于冒泡:
- 因为
mouseenter不支持冒泡,当你把鼠标移入middle盒子时,事件直接在middle上被触发,e.target就直接是middle盒子本身,而不是里面的img。 - 所以原来的判断
if (e.target.tagName === 'IMG')会失败,因为实际拿到的是DIV。
- 因为
-
如果用
mouseover(支持冒泡):- 如果你把事件改成
mouseover,当你鼠标移到middle里的图片上时,图片会触发mouseover,并且这个事件会冒泡传递给父元素middle。 - 此时在
middle的监听函数里,e.target就会是IMG,原来的if判断就能成立了。
- 如果你把事件改成
总结:
既然现在用的是 mouseenter(这是推荐的,因为它避免了子元素反复触发干扰),那么事件源捕获到的就是绑定事件的容器盒子 middle,所以去掉那个 tagName === 'IMG' 的判断是完全正确的做法。
css样式覆盖
在这个案例中,造成这种现象的原因是 CSS 的优先级规则。
在 CSS 中,当同一个元素同时拥有两个类名(例如 <span class="right error">),如果这两个类设置了相同的属性(比如 background),浏览器会优先使用 在 <style> 或 CSS 文件中定义在后面 的那个类的样式。这里和 HTML 标签里类名的先后顺序无关,也和 JS 添加类名的先后顺序无关。
( <span class="right error">和 <span class="error right">都是一样的)
请看你的代码:
.error { color: red; background: url(./images/error1.png) no-repeat left center; }
.right { /* .right 写在了 .error 的后面 */ color: green; background: url(./images/right.png) no-repeat left center; }因为 .right 的样式定义在 .error 之后,所以如果你的标签同时有了这两个类(如 <span class="right error">),.right 的样式(绿色对号)会覆盖 .error 的样式。
解决方法:
既然是状态切换,我们不应该让它同时拥有两个状态类。在添加一个类之前,应该移除另一个类,或者直接重置 className。
交集选择器
如果不小心在中间加了空格变成 .alert .show,在这个案例里一定不能运行,样式会失效。
这两者在 CSS 里代表完全不同的含义:
-
.alert.show(连着写,无空格)- 含义:交集选择器。选中同一个元素,它既要有
class="alert",又要有class="show"。 - 你的代码逻辑:JS 里
myAlert.classList.add('show')是把show加到了自己身上,HTML 变成了<div class="alert show">。 - ✅ 所以必须连着写。
- 含义:交集选择器。选中同一个元素,它既要有
-
.alert .show(中间有空格)- 含义:后代选择器。选中
.alert元素内部的子元素,且子元素带有class="show"。 - 对应的 HTML:
<div class="alert"><div class="show">...</div> <!-- 只有这里会生效 --></div>
- ❌ 因为你的
show类是加在.alert本身,而不是它的子元素上,所以加空格会导致选中失败,提示框弹不出来。
- 含义:后代选择器。选中
赞助支持
如果这篇文章对你有帮助,欢迎赞助支持!
部分内容可能已过时