【问题标题】:Scroll when hover arrow - like amazon website悬停箭头时滚动 - 像亚马逊网站
【发布时间】:2021-04-07 10:54:36
【问题描述】:

你们有没有看到亚马逊的下拉菜单,当你将鼠标悬停在底部的箭头上时,它会像使用鼠标滚轮一样滚动。如何使用 css 实现相同的效果并进行一般性的反应?

有什么建议吗? 到目前为止,这是我的代码,但现在只有按钮滚动而不是所有菜单。

 return (
      <div className="menu-wrapper">
        <div>
          <a className="menu-item">Pizza</a>
          <a className="menu-item">Hamburguers</a>
          <a className="menu-item">Guacamole</a>
          <a className="menu-item">Sushi</a>
          <button className="scroll-button-down">{"⌄"}</button>
        </div>
      </div>
    );

css

  .scroll-button-down:hover {
    animation: moveMenushow 0.6s linear forwards;
  }

  @keyframes moveMenushow {
    100% {
      transform: translateY(-40%);
    }
  }

【问题讨论】:

    标签: javascript html css reactjs react-hooks


    【解决方案1】:

    这只是一个“屏蔽”&lt;select&gt; 标记。 The scrolling is built-in to browsers and will happen when the number of options exceeds the height of the viewport.

    有多种方法可以制作自定义设计的下拉菜单,包括a fully custom solution,但最简单的方法,亚马逊的做法是在&lt;select&gt;标签上覆盖一个元素,并禁用指针事件这样您的点击就会触发&lt;select&gt;标签的原生下拉实现。

    从那里您可以使用onChangeuseState 存储&lt;select&gt; 标记的值,然后将叠加层中的“全部”文本绑定到该状态变量。

    这是一个 CSS 示例:

    label {
      position:relative;
      display:block;
      width:max-content;
    }
    
    span {
      display:block;
      pointer-events:none;
      background:yellow;
      border-top-left-radius:20px;
      border-bottom-left-radius:20px;
      position:relative;
      z-index:1;
      padding:.25em 1.75em .25em 1em;
    }
    
    span::after {
      content:"";
      position:absolute;
      top:50%;
      right:10px;
      transform:translateY(-50%);
      width: 0;
      height: 0;
      border-style: solid;
      border-width: 5px 5px 0 5px;
      border-color: #000000 transparent transparent transparent;
    }
    
    select {
      cursor:pointer;
      position:absolute;
      top:0;
      left:0;
      width:100%;
      height:100%;
      background:red;
      opacity:0;
    }
    <label class="select-wrapper">
      <span>? All</span>
      <select>
        <option>Red</option>
        <option>Green</option>
        <option>Blue</option>
      </select>
    </label>

    【讨论】:

    • 感谢@Riley 的回复,但是卷轴呢?我想知道当我们将插入符号悬停时如何工作......
    • 它实际上只是一个内置的浏览器功能。一旦下拉菜单变得太长而无法显示所有选项,滚动就会变得可用。如果你想在&lt;select&gt; 标签的上下文之外实现类似的东西,你可以重新排列你的HTML,使按钮首先出现,然后使用带有悬停的兄弟选择器将动画应用到另一个元素。 button:hover + ul { animation: moveMenuShow 1s; } 但它需要一堆额外的 CSS。
    • 明白了!在这种情况下,我会将 div 元素更改为 select 元素。谢谢同行! @赖利
    • 原生实现在可访问性方面也更好。要使用支持屏幕阅读器的自定义版本完全正确地完成操作,除了在 React 中实现所有处理程序之外,您还必须管理键盘焦点和处理 ARIA 状态。一个很好的通用提示是,您只想使用&lt;a&gt; 标签导航到您的应用/网站中的不同页面。
    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    相关资源
    最近更新 更多