这里的::after伪元素设置背景不完全生效?

实际效果: https://codepen.io/clarence-sampson/pen/poQMjvb

demo:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>direction-aware effects</title>
    <style>
        * {
            font-family: system-ui;
            margin: 0;
            padding: 0;
        }

        html {
            color-scheme: dark;
        }

        html,
        body {
            height: 100%;
        }

        body {
            font-family: system-ui;
            font-size: 2.25rem;
        }

        nav ul {
            list-style: none;
            display: flex;
            --item-gap: 2rem;
        }

        nav a {
            color: inherit;
            opacity: 0.7;
            text-decoration: none;
            text-transform: uppercase;
            font-weight: 500;
        }

        nav li {
            position: relative;
            overflow: hidden;
            padding: calc(var(--item-gap) / 2);
            /* min-inline-size: 3rem; */
        }

        nav a:hover,
        nav a:focus-visible {
            opacity: 1;
            color: #B70075;
        }

        nav li::after {
            content: "";
            position: absolute;
            background-color: orangered;
            /* bottom: -2rem; */
            /* left: 0; */
            bottom: 0;
            height: 3px; 
            width: 100%;
        }
    </style>            
</head>

<body>
    <nav>
        <ul>
            <li><a href="">Home</a></li>
            <li><a href="">Blog</a></li>
            <li><a href="">About</a></li>
            <li><a href="">Contact me</a></li>
        </ul>
    </nav>
</body>

</html>

问题

  • 为什么background-color没有全部生效,是因为脱离文档流候被覆盖了吗?
    phenomenon display
  • 红色箭头指的这两个数字是什么?
    box model
阅读 3.1k
3 个回答

两个问题都是因为你给 ::after 伪类元素指定了 position:absolute 绝对定位导致的。
设置完 position:absolute 之后如果没有指定定位信息,就出现会在元素原本的位置并移出文档流。所以你选中 ::after 伪类之后,页面中高亮提示的部分就会超出 li 元素(overflow: hidden)的可见范围。指定 ::after 伪类的 left 值为 0 就可以解决问题了。

第二个问题的定位信息,就是 ::after 伪类定位方式修改为绝对定位后元素的定位信息。至于为什么不设置绝对定位时看不到这些数值,是因为非定位元素的 lefttoprightbottom 四个定位属性是无效的,所以也不会展示在 DevTools盒模型 视图中。

1、因为父元素设置了overflow: hidden;溢出隐藏了
2、数字代表元素实际的left值

十分好奇为什么你要把 left: 0; 给注释掉,除非你对于 position: absolute; 了解地非常透彻,否则不建议你只写一个方向属性。

现在你这里只是写了 bottom: 0;,但实际上感觉你应该是要让下划线对齐文本底部,而文本的宽度又不固定,那要不这样试试:

left: 0;
right: 0;
bottom: 0;

写上这三个方向值看看。

按照截图的情况来看,::after 这条线是超出了 li 的范围,然后被你 overflow: hidden; 干掉了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题