CSS第一个孩子悬停在一个元素上

Posted

技术标签:

【中文标题】CSS第一个孩子悬停在一个元素上【英文标题】:CSS first child hover with a element 【发布时间】:2015-12-27 00:51:18 【问题描述】:

我试图让 div 中的第一个 a:hover 具有不同的右边距,但我在这个论坛上找到的解决方案似乎都没有被浏览器识别(我使用的是 Chrome版本 45.0.2454.93 m)。

html:

 <div id="example">
     <a href="something1.html">Link 1</a>
     <a href="something2.html">Link 2</a>
     <a href="something3.html">Link 3</a>
 </div>

CSS:

a:hover 
    margin: 0px -1px;


#example:first-child:hover 
    margin-left: 0px;

这被完全忽略了,只是在悬停时使用 a:hover 边距。

完整源代码如下:

HTML:

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>removed</title>
        <link href="css/main.css" rel="stylesheet" type="text/css">
    </head>

    <body>
        <div id="container">
            <div id="heading">
                <h2>HOME</h2>
                <hr>
                <h3>removed</h3>
            </div>

            <img src="images/css_dev_smaller.png"    id="image_main" />
        </div>
        <div id="nagivation">
            <a href="index.html">Home</a> | <a href="removed.html">removed</a> | <a href="removed.html">removed</a>
        </div>
    </body>  
</html>

CSS:

@charset "utf-8";
html,body 
    margin: 0px;
    padding: 0px;
    border: 0px;
    height: 100%;
    width: 100%;
    background: #fff;


h2,h3 
    font-family: Segoe, "Segoe UI", Verdana, "DejaVu Sans", "Trebuchet MS", sans-serif;
    font-weight: 100;
    padding: 0px;


h2 
    margin-bottom: -14px;
    margin-top: 40px;



h3     
    margin-top: -5px;
    margin-bottom: 55px;


hr 
    width: 100%;
    border-color: #bdbbc2;
    border-width: 1px 0px 0px 0px;
    height: 1px;


#container 
    display: inline-block;
    text-align: center;
    display: block;
    margin: 0 auto;
    min-width: 51%;     
    padding-top: 10%;


#heading 
    display: inline-block;
    width: 15%; 
    min-width: 200px;
    padding-right: 10px;
    vertical-align: top;
    text-align: left;


#image_main 
    display: inline-block;      
    width: 35%;
    min-width: 250px;
    height: auto;
    margin: 0px auto;   
    padding: 0px;


#nagivation 
    margin: 50px auto;
    text-align: center;


a:link, a:visited 
    font-family: Segoe, "Segoe UI", Verdana, "DejaVu Sans", "Trebuchet MS", sans-serif;
    text-decoration: none;
    color: #000000;


a:hover 
    font-weight: 600;
    margin: 0px -1px;


#navigation a:first-child:hover 
    margin: 0px -1px 0px 0px;
    color: #B72C2F;  /* TESTING */
    font-size: 20px; /* TESTING */

【问题讨论】:

从您对 rblarsen 的评论中,您说“在第一个 上悬停时,我不希望它向左移动,这样整个链接集就不会移动我将鼠标悬停在第一个链接上”——这是否意味着当您悬停第二个和第三个链接等时,您确实希望链接集向左移动? @xec 否。基本上,当我悬停时,字体粗细会增加。因此,通过将每边的边距设置为 -1px,它可以防止相邻链接在悬停时移动一点。但是,如果我将鼠标悬停在第一个链接上,它仍会将其他所有内容移至左侧 -1px。所以,我希望第一个 在悬停时有一个修改的左边距,与其他的不同。 【参考方案1】:

选择器#example:first-child 表示具有 id 'example' 的第一个子节点,如果您想要第一个锚子节点,则需要 #example a:first-child 代替

您可以执行以下操作:

a:hover 
    margin: 0px -1px;


#example a:first-child:hover 
    margin: 0px; /* applies to left and right as well as top and bottom margins */
<div id="example">
     <a href="something1.html">Link 1</a>
     <a href="something2.html">Link 2</a>
     <a href="something3.html">Link 3</a>
 </div>

这将防止悬停的第一个孩子的边距发生变化。

这在技术上是您所要求的,但我怀疑不是您想要的,因为您仍在操纵 Link 2 和 Link 3 上的边距,因此将它们悬停会导致抖动。

您的评论说“基本上,当我悬停时,字体粗细会增加。因此,通过将每一侧的边距设置为 -1px,它可以防止相邻链接在悬停时移动一点。” - 这是一个坏主意。不同的浏览器和操作系统会以不同的方式呈现粗体字体,1px 永远不会正确。

没有简单的解决方案,但有几个解决方法:

    悬停时不要更改字体粗细,请改用下划线或颜色更改。 使所有链接都具有固定宽度(因此它们不依赖于其内容宽度,如下所示:

#example a 
    display: inline-block;
    width: 100px;


#example a:hover 
    font-weight: bold;
<div id="example">
     <a href="something1.html">Link 1</a>
     <a href="something2.html">Link 2</a>
     <a href="something3.html">Link 3</a>
 </div>

谷歌搜索“css hover bold”给了我这个,这可能对你有用:Inline elements shifting when made bold on hover

【讨论】:

【参考方案2】:

应该是:

#example a:first-child:hover 
    margin-right: 0px;

按照您的编写方式,它会选择#example 的第一个实例(如果它是第一个孩子)并将CSS 添加到其中。

编辑: 正如您在此 JSFiddle 中看到的那样,它有效 - 我添加了 color:red; 以显示更多信息。

其余的链接“移动”,因为链接的两边在悬停时都有-1px的边距,可以这样固定:

a:hover 
    margin: 0 0 0 -1px;

【讨论】:

它不是“采用#example 的第一个实例”,而是“如果它 :first-child,则选择#example” - 区别不大,但重要的;) 如果它第一个孩子?如果只有一个 #example 实例,它将始终是第一个,因此 CSS 将应用于该实例。 抱歉,上面写错了。第一个孩子的左边距应该是 0px。 IE。在第一个 上悬停时,我不希望它向左移动,这样当我将鼠标悬停在第一个链接上时,整个链接集就不会移动。我尝试了上述并添加了一种颜色:红色;以确保我可以看到它是否正在服用它,并且它仍然被完全忽略。我还尝试了 #example>a:first-child:hover 来尝试强制它,但什么也没有。 @rblarsen 这正是我的意思 - #example 不一定是第一个孩子,即使它是页面上唯一具有该 ID 的元素,请参阅 jsfiddle.net/wwLjp6y7 @Beaker 您在 HTML 中拼写“导航”错误【参考方案3】:

试试这个。选择'a:first-child'

a:hover 
    color: red;


#example a:first-child:hover 
    color: black;
    font-size: 20px;
<div id="example">
     <a href="something1.html">Link 1</a>
     <a href="something2.html">Link 2</a>
     <a href="something3.html">Link 3</a>
 </div>

【讨论】:

完全忽略它:/ 据我所知,这是一个很好的答案,因为它准确地展示了如何将单独的悬停效果应用于第一个孩子,因为问题似乎是关于的。如果这不能回答您的问题,我们可以使用更多信息 @xec 我将在上面进行编辑以显示完整的源代码,希望对您有所帮助

以上是关于CSS第一个孩子悬停在一个元素上的主要内容,如果未能解决你的问题,请参考以下文章

CSS减轻父鼠标悬停的子元素

将悬停样式应用于任何孩子但不是父母

悬停后如何定位内部元素(Selenium)

CSS第n个孩子元素写法

当我将鼠标悬停在div上时,我希望它根据所悬停的第n个孩子的数量来更改其旁边的元素

使用纯 css 隐藏除第一个元素之外的所有元素