javascript - mouseover() mouseout() jQuery 添加/删除类问题

标签 javascript jquery css rollover

我正在尝试使用 mouseover、mouseout、addClass 和 removeClass 的组合来创建简单的鼠标悬停效果。基本上,当用户将鼠标悬停在某个元素上时,我想应用不同的边框(1px 灰色虚线)。初始状态是“1px 纯白色”。我有一个名为“highlight”的类,其中只有“border: 1px dashed grey”。我想在 onmouseover 上添加该类并在 onmouseout 上将其删除,但我无法获得我想要的效果,除非我在“高亮”类中使用 !important。

最佳答案

听起来好像您的 javascript 可以正常工作,但这只是 specificity of your CSS rules 的问题,这就是 !important 让它起作用的原因。

您只需要使突出显示的 css 规则比非突出显示的规则更具体即可。

#someItem ul li { /* Specificity = 102 */
    border-color: white;
}

.highlight { /* Specificity = 10 -- not specific enough! */
    border-color: grey;    
}

#someItem ul li.highlight { /* Specificity = 112 -- this will work */
    border-color: grey;    
}

编辑进一步解释:
假设您的 HTML 的相关部分如下所示:

<div id="someItem">
    <ul>
        <li>Item 1</li>
        <li>Item 2</li>
        <li>Item 3</li>
    </ul>
</div>

你有这个 CSS:

#someItem ul li {
    border: 1px solid white;
}
.highlight {
    border-color: grey;
}

目前,#someItem divul 中的所有列表项都将有一个白色边框,并且没有任何内容具有 highlight 类,所以没有什么是灰色的。

通过任何你想要的方式(在你的例子中是 jQuery 中的悬停事件),你将一个类添加到其中一个元素:

$(this).addClass('highlight'); 

HTML 现在看起来像这样:

<div id="someItem">
    <ul>
        <li>Item 1</li>
        <li class="highlight">Item 2</li>
        <li>Item 3</li>
    </ul>
</div>

到目前为止,您的 Javascript 和 HTML 工作正常,但您没有看到灰色边框!问题是你的 CSS。当浏览器试图决定如何设置元素的样式时,它会查看所有以元素为目标的不同选择器以及这些选择器中定义的样式。如果有两个不同的选择器都定义了相同的样式(在我们的例子中,边框颜色是有争议的),那么它必须决定应用哪种样式以及忽略哪种样式。它通过所谓的“特异性”来做到这一点——也就是说,一个选择器有多具体。如 HTML Dog article 中所述,它通过为选择器的每个部分分配一个值来实现这一点,得分最高的部分获胜。重点是:

  • 元素选择器(例如:“ul”、“li”、“table”)= 1 点
  • 类选择器(例如:“.highlight”、“.active”、“.menu”)= 10 分
  • id 选择器(例如:“#someItem”、“#mainContent”)= 100 分

还有一些规则,例如:关键字 !important 以及内联样式,但这与此无关,呃...“教训”。您应该知道的另一件事是,如果两个选择器具有相同的特异性,则文件中稍后定义的选择器获胜。

回到你的问题,鉴于我们之前的 CSS,我们可以看到为什么它仍然没有灰色边框:

#someItem ul li = id + element + element = 100 + 1 + 1 = 102 points
.highlight = class = 10 points

如前所述,解决方案是创建一个更具体的选择器:

#someItem ul li.highlight
   = id + element + element + class
   = 100 + 1 + 1 + 10
   = 112 points

要在评论中回答您的问题,您无需更改任何 javascript 或 HTML 即可使其正常工作。如果你分解那个选择器,它的意思是:

Look for the element with id "someItem", inside that look for a ul element, and then an li element which has the class "highlight" on it.

...现在,鉴于您之前进行的简单 .addClass() 调用,li 满足这些条件,因此边框应变为灰色。

关于javascript - mouseover() mouseout() jQuery 添加/删除类问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/846417/

相关文章:

javascript - 错误: [$injector:unpr] Unknown provider: RestangularProvider <- Restangular <- ctrlAG

javascript - 如何访问 ServiceWorker 保存在缓存中的资源?

javascript - 数据表提交表单服务器端数据

jQuery:如何读取动态变化的图像源?

jquery - 将图像放在 div 元素中并保持图像比例

html - 为什么 div 的位置受其子元素的 margin-top 影响?

php - 是否可以使用 JS 打开具有所需内容类型的浏览器窗口?

javascript - 检测 Firefox 扩展的安装

javascript - jQuery ajax 无法正常工作

html - 显示 flex - 将网格元素推向左侧,同时保持网格元素之间的空间