有没有更简单的方法,初学者可以理解?

Is there an easier way, that would be understandable for beginners?

我发现这个菜单在底部显示边框,我想学习如何做,但我不知道了解它是如何完成的,有没有更简单的方法可以实现同样的事情? 这是URL:https://codepen.io/atomas/pen/zBoEZe?editors=1100

HTML:

<ul>
  <li class="elm selected">Home</li>
  <li class="elm">Services</li>
  <li class="elm">About</li>
  <li class="elm bar">Contact</li>
</ul>

CSS:

$elementsNumber: 4; 
$width: 1/$elementsNumber;


* {
  box-sizing: border-box;
}

ul { 
  position: relative;
  margin: 50px auto;
  width: 80%;
  padding: 0;
  list-style: none;
  color: #000;
  overflow: auto;
  overflow: hidden;

  li {
    float: left;
    padding: 15px;
    font-size: 18px;
    font-family: Roboto;
    font-weight: 700;
    width: percentage($width);
    text-align: center;
    cursor: pointer;
    border-bottom: 4px solid #555;



  }
      .bar:before {
      overflow: hidden;
      content: "";
      position: absolute;
      top: 54px;
      bottom: 0;
      transition: all 0.25s;
      left: 0;
      width: percentage($width);
      height: 4px;
      background: red;
    }


}

@for $i from 1 through $elementsNumber {

    li:nth-child( #{$i} ) {
      &.selected~.bar:before,
      &.elm:hover~.bar:before,      
      &.selected.bar:before,
      &.elm.bar:hover:before
       {
        left: percentage( ( $i - 1 ) * $width );
      }
    }

}

如果您只想在菜单的 底部 上添加 边框 ,您可以使用 border-bottom:

body, html {
    margin: 0;
    padding: 0;
}
header {
    background-color: #eee;
}
ul {
    list-style-type: none;
    padding-left: 0;
    margin: 0;
    border-bottom: 5px solid #ccc;
}
ul>li {
    display: inline-block;
    padding: 0 15px 0 15px;
    margin-left: -4px;
}
ul>li:first-child {
    margin-left: 0;
}
ul>li>a {
    display: block;
    color: #333;
    text-decoration: none;
    padding: 5px 0 5px 0;
}
ul>li:hover {
    border-bottom: 5px solid #555;
    margin-bottom: -5px
}
<header>
    <nav>
        <ul>
            <li class="active"><a href="#" title="Home">Home</a>
            </li>
            <li><a href="#" title="About">About</a>
            </li>
            <li><a href="#" title="Contact">Contact</a>
            </li>
        </ul>
    </nav>
</header>

* {  box-sizing: border-box;}
ul { 
  padding: 0;
  list-style: none;
  color: #000;
  }
li {
    float: left;
    padding: 15px;
    font-size: 18px;
    font-family: Roboto;
    font-weight: 700;
    text-align: center;
  
    border-bottom: 4px solid #555; 
    transition: all 0.3s;
}
li:hover {
    border-bottom: 4px solid red;
}
<ul>
  <li class="elm selected">Home</li>
  <li class="elm">Services</li>
  <li class="elm">About</li>
  <li class="elm bar">Contact</li>
</ul>

css 不仅仅是在底部添加边框。

您在底部看到的灰色边框是通过以下方式显示的:

li {
    float: left;
    padding: 15px;
    font-size: 18px;
    font-family: Roboto;
    font-weight: 700;
    width: percentage($width);
    text-align: center;
    cursor: pointer;
    ***border-bottom: 4px solid #555***;
  }

但是,css 还添加了一个组件,突出显示悬停在其上的特定 li 元素,使底部边框变为红色。

顶部的宽度 属性 只是确保每个 li 元素在浏览器中水平 space 相等:

$elementsNumber: 4; 
$width: 1/$elementsNumber;

为了实现与代码笔所示相同的红色悬停,您需要编写一些 css 例如 li:hover 等来模拟相同的效果。

你拥有的 css 肯定比它需要的更复杂,但可以达到预期目的。看看这里的 w3schools link 应该可以帮助您理解悬停 属性 和 CSS.

中的其他有用属性

希望对您有所帮助!