【问题标题】:Marking navigation button as active using CSS使用 CSS 将导航按钮标记为活动状态
【发布时间】:2017-12-20 12:02:49
【问题描述】:

我有方形导航按钮,我想在其中直观地显示哪些是活动的,例如使用:

目前我为此使用background: linear-gradient。然而,这很难制作动画,因此我正在寻找替代品。 HTML 结构如下所示:

<div class='navigation-button'>
    <div class='navigation-button-container'>
        <i class='fa fa-bars'></i>
    </div>
</div>

对应的CSS:

.navigation-button {
    width: 50px;
    height: 50px;
    background: purple;
}

.navigation-button-container {
    width: 100%;
    height: 100%;
    text-align: center; 
}

.navigation-button-container i {
    margin-top: 25%;
    margin-bottom: 25%;
    color: white;
}

.active {
    background: linear-gradient(right, blue 0%, blue 10%, rgba(0,0,0,0) 10%);
}

active 类可以应用于navigation-button-container 以获得所需的效果。但是,我想淡入淡出,据我所知,linear-gradients 不能动画。

我已经考虑在navigation-button-container 之前添加一个元素并为其宽度设置动画并使用CSS ::before 语法,但似乎都没有帮助。有没有一种高效的 CSS 方法可以使用 @keyframestransition 获得所需的效果?

【问题讨论】:

  • 我不确定您希望如何为按钮设置动画,是纯色 -> 渐变吗?如果是这样,您可以在具有linear-gradient 背景的按钮后面放置一个元素(或::before),然后使用opacity 淡化它。
  • 对不起,我想为蓝色的宽度从左到右设置动画。滑入说。
  • 哦,好吧,...如果元素位于窗口边缘,您可以使用::before 元素并实际将其从屏幕外滑出?
  • 现在不是元素而是背景色

标签: html css vue-router


【解决方案1】:

这是您需要的吗? .nb-container 上有一个 ::before 伪元素,它具有宽度过渡。

.nb {
  background-color: #f00;
  display: block;
  height: 50px;
  width: 50px;
}

.nb-container {
  width: 100%;
  height: 100%;
  position: relative;
  text-align: center; 
}

.nb-container i {
  color: white;
  display: inline-block;
  margin: 25% 0 25%;
}

.nb-container ::before {
  background-color: #00f;
  content: "";
  display: block;
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  transition: width .2s;
  width: 0;
}

.nb-container:hover ::before, .nb-container:focus ::before {
  width: 20%;
}
Mouse over the elements to see the effect:
<div class="nb">
  <div class="nb-container">
    <i class="fa fa-bars">∆</i>
  </div>
</div>
<div class="nb">
  <div class="nb-container">
    <i class="fa fa-bars">®</i>
  </div>
</div>
<div class="nb">
  <div class="nb-container">
    <i class="fa fa-bars">©</i>
  </div>
</div>

::before 元素的动画方式非常灵活。因此,如果您想要淡入而不是滑入:

.nb {
  background-color: #f00;
  display: block;
  height: 50px;
  width: 50px;
}

.nb-container {
  width: 100%;
  height: 100%;
  position: relative;
  text-align: center; 
}

.nb-container i {
  color: white;
  display: inline-block;
  margin: 25% 0 25%;
}

.nb-container ::before {
  background-color: #00f;
  content: "";
  display: block;
  height: 100%;
  left: 0;
  opacity: 0;
  position: absolute;
  top: 0;
  transition: opacity .2s;
  width: 20%;
}

.nb-container:hover ::before, .nb-container:focus ::before {
  opacity: 1;
}
Mouse over the elements to see the effect:
<div class="nb">
  <div class="nb-container">
    <i class="fa fa-bars">∆</i>
  </div>
</div>
<div class="nb">
  <div class="nb-container">
    <i class="fa fa-bars">®</i>
  </div>
</div>
<div class="nb">
  <div class="nb-container">
    <i class="fa fa-bars">©</i>
  </div>
</div>

【讨论】:

  • 我可以看到动画正常工作,但由于某种原因,我的 标签在使用 ::before 时的宽度为 0px,这可能是什么原因?
  • 你确定是::before造成的吗?使用字体 Awesome 可能会有一些问题,所以我不建议将伪元素样式直接应用于 .fa 元素——我认为(我不确定)字体 Awesome 使用伪元素来实际显示其图标。此外,在上面的示例中,我将display: inline-block 应用于i 元素,而.fa 很可能不需要...
  • 我检查过,当在&lt;i&gt; 标签(或例如)中使用常规内容时,它确实有效,删除display: inline-block。但是 ::before 并没有直接应用于i 标签,对吧?
  • 不,我的示例中的::before 应用于.nb-container
猜你喜欢
  • 2014-10-01
  • 2012-06-11
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多