【问题标题】:BUTTON - go to anchor URL 1 on hover, go to URL 2 on click [closed]按钮 - 悬停时转到锚定 URL 1,单击时转到 URL 2 [关闭]
【发布时间】:2019-09-05 22:06:35
【问题描述】:

我正在主页上创建一个“单页”导航。

我的菜单导航中有一个“图书”按钮。

我想要实现的是,如果访问者“悬停”在“书籍”按钮上,主页会向下滚动到主页上“书籍”部分的位置,因此这应该是一个锚链接 - #books

但是当用户点击按钮时,它会将他们带到实际的“书籍”页面 - example.com/books

所以我需要一个悬停时的锚链接,以及点击时的常规链接。

这可能吗?

除了在点击时创建常规链接之外,不幸的是我没有尝试太多,我真的不知道从哪里开始悬停动作。

【问题讨论】:

  • 在jquery中使用鼠标进入并滚动到鼠标悬停和常规锚点进行点击
  • 感谢@EvikGhazarian,如果说我的按钮 css 类是 .menu-books 并且我需要在主页上滚动到的部分是 #home-books ,那么 jquery 代码应该是什么样子?
  • 当用户悬停书籍按钮并且屏幕滚动时......书籍按钮会发生什么?它是停留在鼠标指针下方的同一个地方还是滚动离开?
  • 我会为你写一个答案,但请记住,如果不是用户无法点击它,滚动将会延迟
  • 感谢@EvikGhazarian

标签: javascript jquery html css wordpress


【解决方案1】:

这将向下滚动到 div,但请记住,我为滚动添加了一秒钟的延迟,以便用户可以单击它。您可以根据需要增加/减少延迟。

$(document).ready(function () {
  $('div.top').mouseenter(function() {
  $('html, body').stop(true, true).delay(1000).animate({
    scrollTop: $("div.middle").offset().top
  }, 1000);
  })
});
body,
html {
  width: 100%;
  height: 100%;
  margin: 0;
  display: inline;
}

.top {
  background-color: green;
  height: 20%;
  width: 20%;
  display: flex;
  margin: 15px auto 55px auto;
  padding: 15px;
}

.middle {
  background-color: yellow;
  height: 100%;
  width: 100%;
  display: flex;
}
a {
  color: white;
  text-decoration: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="top">
  <a href="http://google.com">Hover for scroll or Click for Google</a>
</div>
<div class="middle">
  <h1>Hello!</h1>
</div>

【讨论】:

    【解决方案2】:

    这是可能的,但可能不是对用户过于友好(毕竟触摸屏没有“悬停”功能)。为此,您需要使用 JavaScript,并且可以执行以下操作:

    // Get all 'hover' links
    let hoverLinks = document.querySelectorAll('[data-scrollto]');
    
    // Loop through, and add 'mouseenter' events
    Array.from(hoverLinks).forEach(link => {
      // Add hover state
      link.addEventListener('mouseenter', () => {
        // Find associated div
        let div = document.getElementById(link.dataset.scrollto) || null;
    
        // If div doesn't exist, return
        if(!div) return;
    
        // Scroll to div
        div.scrollIntoView(true);
      });
    });
    html,
    body{
      scroll-behavior: smooth;
    }
    
    nav {
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      background: #fff;
      padding: 1em 0;
      height: 1em;
      line-height: 1em;
      z-index: 2;
    }
    
    section {
      height: 100vh;
      box-sizing: border-box;
      padding: 3em 0;
    }
    <nav>
      <a href="home.html">Home</a>
      <a href="books.html" data-scrollto="books-wrapper">Scroll to books</a>
    </nav>
    
    <section>
      Hello
    </section>
    
    <section>
      Hello
    </section>
    
    <section id="books-wrapper">
      BOOKS!
    </section>
    
    <section>
      Hello
    </section>
    
    <section>
      Hello
    </section>

    简而言之,您只需通过 JavaScript 向链接添加一个事件侦听器(在本例中为“mouseenter”事件侦听器),当触发该链接时(例如,当用户将鼠标悬停在链接上时)将搜索关联的滚动位置并滚动到它。要链接到页面,只需使用标准的&lt;a href=""&gt;&lt;/a&gt; 链接即可。

    在上面的示例中,我使用id 为滚动到位置创建唯一标识符,然后将其作为字符串保存在链接的属性中。这样,您也可以重新使用此事件侦听器将滚动添加到其他链接。例如,您可以将contact 中的id 添加到页面上的另一个元素,并将data-scrollto="contact" 添加到新的&lt;a&gt; 标记以滚动它。

    编辑:

    为了使这更相关:

    document.querySelector('.menu-button').addEventListener('mouseenter', () => {
      let div = document.getElementById('books-home') || null;
      
      if(!div) return;
      
      div.scrollIntoView(true);
    });
    html,
    body{
      scroll-behavior: smooth;
    }
    
    nav {
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      background: #fff;
      padding: 1em 0;
      height: 1em;
      line-height: 1em;
      z-index: 2;
    }
    
    section {
      height: 100vh;
      box-sizing: border-box;
      padding: 3em 0;
    }
    <nav>
      <a href="home.html">Home</a>
      <a href="books.html" class="menu-button">Scroll to books</a>
    </nav>
    
    <section>
      Hello
    </section>
    
    <section>
      Hello
    </section>
    
    <section id="books-home">
      BOOKS!
    </section>
    
    <section>
      Hello
    </section>
    
    <section>
      Hello
    </section>

    【讨论】:

    • 谢谢@Oliver,非常感谢您的回答..
    • 太好了,这能解决您当时遇到的问题吗?
    • 如果我们知道按钮的 CSS 类是 .menu-button 并且它需要滚动到的 ID 锚点是 #books-home ,代码将如何变化?
    • 您可以简单地更改querySelectorAll() 选择器,并将div.datalist.scrollto 替换为'books-home',但如果您知道所有选择器并且它们不会更改,那么您可以修剪JavaScript 权利向下。请查看我最近的编辑以了解如何操作。
    • 非常感谢奥利弗
    猜你喜欢
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 2016-08-30
    • 2023-03-19
    相关资源
    最近更新 更多