【问题标题】:Adding a fade-in effect to submenu using CSS使用 CSS 向子菜单添加淡入效果
【发布时间】:2016-04-17 04:34:32
【问题描述】:

我有一个简单的问题。我正在尝试向this page 中的子菜单添加淡入效果,但我不太了解ul li ul 选择器的概念,因此它不正确。,

这似乎并不难,但我做错了我无法弄清楚的事情!

如何添加这个 CSS 过渡效果?我曾尝试使用 animate.css 库,但该库的使用不是强制性的,我也可以使用不使用它的解决方案。

.classname li:hover > ul{
  display:block;
  -moz-animation: fadeInUp .3s ease-in  ;
  -webkit-animation: fadeInUp .3s ease-in ;
  animation:fadeInUp .3s ease-in ;
}

.classname ul li:hover > ul{
  display:block;
  -moz-animation: fadeInRight .3s ease-in ;
  -webkit-animation: fadeInRight .3s ease-in ;
  animation:fadeInRight .3s ease-in ;
}

演示:下面是我当前的编码尝试的 sn-p。

/* MENU NAVIGATION */

#nav span {
  display: none;
}
#nav,
#nav ul {
  list-style: none outside none;
  margin: 0;
  padding: 0;
}
#nav {
  font-family: 'Josefin Sans', sans-serif;
  float: left;
  margin-left: 1%;
  margin-right: 1%;
  position: relative;
  width: 98%;
}
#nav ul.subs {
  background-color: #FFFFFF;
  box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2);
  color: #333333;
  display: none;
  left: 0;
  padding: 2%;
  position: absolute;
  top: 54px;
  width: 96%;
}
#nav > li {
  border-bottom: 5px solid transparent;
  float: left;
  margin-bottom: -5px;
  text-align: left;
  -moz-transition: all 300ms ease-in-out 0s;
  -ms-transition: all 300ms ease-in-out 0s;
  -o-transition: all 300ms ease-in-out 0s;
  -webkit-transition: all 300ms ease-in-out 0s;
  transition: all 300ms ease-in-out 0s;
}
#nav li a {
  display: block;
  text-decoration: none;
  -moz-transition: color 450ms ease-in-out 0s, background-color 450ms ease-in-out 0s;
  -ms-transition: color 450ms ease-in-out 0s, background-color 450ms ease-in-out 0s;
  -o-transition: color 450ms ease-in-out 0s, background-color 450ms ease-in-out 0s;
  -webkit-transition: color 450ms ease-in-out 0s, background-color 450ms ease-in-out 0s;
  transition: color 450ms ease-in-out 0s, background-color 450ms ease-in-out 0s;
  white-space: normal;
}
#nav > li > a {
  color: #333333;
  display: block;
  line-height: 49px;
  padding: 0 15px;
  text-transform: uppercase;
}
#nav > li:hover > a,
#nav > a:hover {
  background-color: #F55856;
  color: #FFFFFF;
}
#nav li.active > a {
  background-color: #333333;
  color: #FFFFFF;
}
/* submenu */

#nav li:hover ul.subs {
  display: block;
}
#nav ul.subs > li {
  display: inline-block;
  float: none;
  padding: 10px 1%;
  vertical-align: top;
  width: 33%;
}
#nav ul.subs > li a {
  color: #777777;
  line-height: 20px;
}
#nav ul li a:hover {
  color: #F55856;
}
#nav ul.subs > li > a {
  font-size: 1.3em;
  margin-bottom: 10px;
  text-transform: uppercase;
}
#nav ul.subs > li li {
  float: none;
  padding-left: 8px;
  -moz-transition: padding 150ms ease-out 0s;
  -ms-transition: padding 150ms ease-out 0s;
  -o-transition: padding 150ms ease-out 0s;
  -webkit-transition: padding 150ms ease-out 0s;
  transition: padding 150ms ease-out 0s;
}
#nav ul.subs > li li:hover {
  padding-left: 15px;
}
<div class="container">
  <ul id="nav">
    <li><a href="#">Home</a>
    </li>
    <li><a href="#s1">Prodotti</a>
      <span id="s1"></span>
      <ul class="subs">
        <li><a href="#">Header a</a>
          <ul>
            <li><a href="#">Submenu x</a>
            </li>
            <li><a href="#">Submenu y</a>
            </li>
            <li><a href="#">Submenu z</a>
            </li>
          </ul>
        </li>
        <li><a href="#">Header b</a>
          <ul>
            <li><a href="#">Submenu x</a>
            </li>
            <li><a href="#">Submenu y</a>
            </li>
            <li><a href="#">Submenu z</a>
            </li>
          </ul>
        </li>
      </ul>
    </li>
    <li><a href="#">Shop</a>
    </li>
    <li><a href="#">Area Privata</a>
    </li>
    <li><a href="#">Contatti</a>
    </li>

  </ul>
</div>

【问题讨论】:

  • 嗨 Harry,我想做的是在鼠标悬停时向子菜单添加动画,我正在尝试使用其中一个 daneden.github.io/animate.css
  • 但我不确定我正在尝试做的事情是否正确。你能帮帮我吗?!
  • 不使用库我可能没问题,重要的是要了解我必须将正确信息放在 css 中的位置,我想做的是像这样web2feel.com/freeby/css-menu/index.html .. .. 如果可能的话,动画必须在子菜单上(第二级)
  • 这是上一页,(web2feel.com/working-with-css-drop-down-menus-and-animate-css)他使用了 animate.css 中的“淡入淡出”动画……动画必须在子菜单上悬停 PRODOTTI。
  • 你需要this吗?悬停 PRODOTTI 时有一个 fadeInUp 动画,悬停 Header 1 和 Header 2 时有一个 fadeInRight 动画(就像在您链接的页面中一样)。

标签: css css-transitions css-animations animate.css


【解决方案1】:

不需要动画或单独的库来实现您需要的效果。这些可以通过使用过渡和一些 CSS 变换来实现。

演示:(说明如下)。

/* MENU NAVIGATION */

#nav span {
  display: none;
}
#nav,
#nav ul {
  list-style: none outside none;
  margin: 0;
  padding: 0;
}
#nav {
  font-family: 'Josefin Sans', sans-serif;
  float: left;
  margin-left: 1%;
  margin-right: 1%;
  position: relative;
  width: 98%;
}
#nav ul.subs {
  background-color: #FFFFFF;
  box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2);
  color: #333333;
  left: 0;
  padding: 2%;
  position: absolute;
  top: 54px;
  width: 96%;
}
#nav > li {
  border-bottom: 5px solid transparent;
  float: left;
  margin-bottom: -5px;
  text-align: left;
  transition: all 300ms ease-in-out 0s;
}
#nav li a {
  display: block;
  text-decoration: none;
  transition: color 450ms ease-in-out 0s, background-color 450ms ease-in-out 0s;
  white-space: normal;
}
#nav > li > a {
  color: #333333;
  display: block;
  line-height: 49px;
  padding: 0 15px;
  text-transform: uppercase;
}
#nav > li:hover > a,
#nav > a:hover {
  background-color: #F55856;
  color: #FFFFFF;
}
#nav li.active > a {
  background-color: #333333;
  color: #FFFFFF;
}
/* submenu */

#nav ul.subs > li {
  display: inline-block;
  float: none;
  padding: 10px 1%;
  vertical-align: top;
  width: 33%;
}
#nav ul.subs > li a {
  color: #777777;
  line-height: 20px;
}
#nav ul li a:hover {
  color: #F55856;
}
#nav ul.subs > li > a {
  font-size: 1.3em;
  margin-bottom: 10px;
  text-transform: uppercase;
}
#nav ul.subs > li li {
  float: none;
  padding-left: 8px;
  transition: padding 150ms ease-out 0s;
}
#nav ul.subs > li li:hover {
  padding-left: 15px;
}
#nav > li > ul {
  opacity: 0;
  transform: translateY(25%);
  transition: all 150ms ease;
  pointer-events: none;
}
#nav > li:hover > ul {
  opacity: 1;
  transform: translateY(0%);
  pointer-events: auto;
}
#nav > li > ul > li > ul {
  opacity: 0;
  transform: translateX(50%);
  transition: all 150ms ease;
}
#nav > li > ul > li:hover > ul {
  opacity: 1;
  transform: translateX(0%);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<div class="container">
  <ul id="nav">
    <li><a href="#">Home</a>
    </li>
    <li><a href="#s1">Prodotti</a>
      <span id="s1"></span>
      <ul class="subs">
        <li><a href="#">Header a</a>
          <ul>
            <li><a href="#">Submenu x</a>
            </li>
            <li><a href="#">Submenu y</a>
            </li>
            <li><a href="#">Submenu z</a>
            </li>
          </ul>
        </li>
        <li><a href="#">Header b</a>
          <ul>
            <li><a href="#">Submenu x</a>
            </li>
            <li><a href="#">Submenu y</a>
            </li>
            <li><a href="#">Submenu z</a>
            </li>
          </ul>
        </li>
      </ul>
    </li>
    <li><a href="#">Shop</a>
    </li>
    <li><a href="#">Area Privata</a>
    </li>
    <li><a href="#">Contatti</a>
    </li>

  </ul>
</div>

代码解释:

为了产生类似于您链接的页面中的效果(即,一级子菜单在悬停时执行淡入+移动,二级子菜单执行淡入+移动悬停),需要做以下事情:

  • 当前,当您将鼠标悬停在 PRODOTTI 上时,您正在切换包含第一级子菜单的 uldisplay 属性。但是display 属性的值更改是不可转换的,因此子菜单将立即出现。只需删除导致此问题的行。
#nav ul.subs {
    background-color: #FFFFFF;
    box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2);
    color: #333333;
    /*display: none; comment out or remove this line */
    left: 0;
    padding: 2%;
    position: absolute;
    top: 54px;
    width: 96%;
}
/* remove these */
#nav li:hover ul.subs {
  display: block;
}
  • 之后,将包含子菜单的ul 的初始状态设置为opacity: 1,并将transform: translateY(25%) 添加到其中。这会将子菜单的容器向下推至其高度的 25%。
#nav > li > ul{
  opacity: 0;
  transform: translateY(25%);
  transition: all 150ms ease;
  pointer-events: none;
}
  • 当 PRODOTTI 链接悬停时,将子菜单的 opacity 更改为 1,并通过设置 `transform: translateY(0%) 将其转换回原来的位置。这使它看起来好像子菜单正在淡入并同时向上移动。
#nav > li:hover > ul{
  opacity: 1;
  transform: translateY(0%);
  pointer-events: auto;
}
  • 对于第二级子菜单,除了使用translateY 而不是使用translateX 之外,遵循相同的步骤,因为它必须向右移动而不是向下移动。
#nav > li > ul > li > ul{
  opacity: 0;
  transform: translateX(50%);
  transition: all 150ms ease;
}
#nav > li > ul > li:hover > ul{
  opacity: 1;
  transform: translateX(0%);
}

【讨论】:

    猜你喜欢
    • 2015-11-30
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多