• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

如何构建 MouseOver 导航幻灯片效果

您是否曾经在项目中使用过 Slider Revolution  wordpress 插件?如果答案是“是”,您可能已经注意到出现在插件配置页面右上角的迷你工具栏

如何构建 MouseOver 导航幻灯片效果  第1张

最初,只有图标是可见的,使整个东西保持美观和紧凑。然后,每次将鼠标悬停在图标上时,其相关文本都会以平滑的滑入动画显示。

在今天的练习中,让我们从该效果中获取灵感并构建类似的东西。以下是我们将努力的方向:

See the Pen  Quick Tip: How to Animate a Menu on Hover by Envato Tuts+ (@tutsplus)  on CodePen.

我们将很快完成,首先写出我们的标记,用 css 设置样式,最后添加一些 javascript 行为。在收工之前,我们还要看一下纯 CSS 的方法。让我们开始吧!

1. 从页面标记开始

我们将从包含标题和无序列表的标题开始。每个列表项都将包含一个按钮。此元素将用作 svg 图标及其相应文本的包装器。

这是所需的标记:

<header>

  <h1>Mini Toolbar</h1>

  <ul>

    <li>

      <button>

        <svg>...</svg>

        <span>Pages</span>

      </button>

    </li>

    <li>

      <button>

        <svg>...</svg>

        <span>Collection</span>

      </button>

    </li>

    <li>

      <button>

        <svg>...</svg>

        <span>Appearance</span>

      </button>

    </li>

    <li>

      <button>

        <svg>...</svg>

        <span>Options</span>

      </button>

    </li>

    <li>

      <button>

        <svg>...</svg>

        <span>Search</span>

      </button>

    </li>

  </ul>

</header>

此处使用的图标取自Envato Elements。您可能会认出这个图标集,因为我已经在 之前的教程中将它用作 SVG 精灵的一部分。

如何构建 MouseOver 导航幻灯片效果  第2张

仪表板图标

2. 用 CSS 定义样式

标头将充当弹性容器。它的孩子将垂直居中并分布在主轴上。我们还将给它一个最大宽度并使其水平居中:

/*CUSTOM VARIABLES HERE*/

 

header {

  display: flex;

  align-items: center;

  justify-content: space-between;

  max-width: 1000px;

  padding-left: 15px;

  margin: 0 auto;

  border-radius: 5px;

  background: var(--blue);

}

列表和按钮都将是具有垂直居中内容的弹性容器:

header ul,

header button {

  display: flex;

  align-items: center;

}

所有按钮都将具有不同的颜色,并且某些颜色值将与 Slider Revolution 的迷你工具栏的值匹配。当一个按钮被悬停在上面时,它的颜色会稍微变亮,这要归功于 CSS 的原生 filter()功能。 

我们也会给他们overflow: hidden,因为我们想在幻灯片动画期间隐藏他们溢出的内容:

/*CUSTOM VARIABLES HERE*/

 

header button {

  padding: 15px;

  overflow: hidden;

  transition: filter 0.25s;

}

 

header li:nth-child(1) button {

  background: var(--green);

}

 

header li:nth-child(2) button {

  background: var(--lightblue);

}

 

header li:nth-child(3) button {

  background: var(--gray);

}

 

header li:nth-child(4) button {

  background: var(--red);

}

 

header li:nth-child(5) button {

  background: var(--orange);

}

 

header button:hover {

  filter: brightness(110%);

}

SVG 图标

SVG 将具有白色。而且,如前所述,文本最初将被隐藏。当我们将鼠标悬停在父按钮上时,它将变得可见:

/*CUSTOM VARIABLES HERE*/

 

header button svg {

  fill: var(--white);

}

 

header button span {

  opacity: 0;

  visibility: hidden;

  transition: all 0.25s ease-out;

}

 

header button:hover span {

  margin-left: 15px;

  opacity: 1;

  visibility: visible;

}

3.  JavaScript:监听鼠标事件

dom 准备好后,我们将抓取所有标题按钮。然后,我们将遍历它们并执行以下操作:

  1. 抓住他们的文本元素并计算它的默认宽度。

  2. 然后,将该元素的宽度设置为 0。

  3. 每次我们将鼠标悬停在按钮上时,我们都会重置其文本元素的默认宽度。

  4. 然后,每次我们停止将鼠标悬停在按钮上时,我们都会将其宽度设置为 0。

这是完成此行为的 javaScript:

const buttons = document.queryselectorAll("header button");

 

buttons.forEach(el => {

  // 1

  const span = el.lastElementChild;

  const width = span.offsetWidth;

  // 2

  span.style.width = 0;

  // 3

  el.addeventListener("mouseenter", () => {

    span.style.width = `${width}px`;

  });

  // 4

  el.addEventListener("mouseleave", () => {

    span.style.width = 0;

  });

});

纯 CSS 解决方案

是时候讨论最后一件事了。我最初的尝试是构建一个纯 CSS 的演示。所以最初,我将max-width所有spans 的属性设置为 0。接下来,当按钮悬停时,我将该值更改为固定的 110 像素。这在这里工作得很好,但是这个解决方案有局限性,因为循环中有一个硬编码的值。 

检查下面的 CSS 解决方案(也许您对如何改进它有一些想法?):

See the Pen  Quick Tip: How to Animate a Menu on Hover (CSS-only) by Envato Tuts+ (@tutsplus)  on CodePen.

如果我们添加一个包含更多文本的新菜单项,我们就会遇到问题。您可能认为可以将max-width值设置为auto,但不幸的是,此解决方案根本不起作用! 

这些限制促使我首先考虑快速的 JavaScript 解决方案。

结论

伙计们,另一个简短的教程到此结束!感谢您的关注,我希望您今天学到了一些新东西。随意扩展演示并(例如)使其适用于点击事件而不是鼠标事件。另外,如果您这样做,请务必使其可访问。

再次感谢阅读!


文章目录
  • 1. 从页面标记开始
  • 2. 用 CSS 定义样式
    • SVG 图标
  • 3. JavaScript:监听鼠标事件
    • 纯 CSS 解决方案
  • 结论