javascript - 如何制作带有水平滚动导航的 magicline 动画?

标签 javascript jquery

这是我曾经写过的代码。如果没有滚动,则它可以正常工作。但是当您单击滚动区域中的其余元素时,将无法正常工作。点击Link4后面的元素即可了解问题。

$(function() {
  $(".li").click(function() {
    $(".magicline").css({
      width:
        $(this)
          .outerWidth() + "px",
      left:
        $(this)
          .position().left + "px"
    });
  });
  
  $(".li").first().trigger("click");
});
body {
  padding: 0;
  margin: 0;
}

ul,
li {
  list-style: none;
  padding: 0;
  margin: 0;
}

.nav {
  width: 300px;
  display: flex;
  border-top: 1px solid tomato;
  border-bottom: 1px solid tomato;
  margin-top: 100px;
  overflow: auto;
  position: relative;
}

.li {
  white-space: nowrap;
  position: relative;
  z-index: 2;
  cursor: pointer;
}

.item {
  display: block;
  text-decoration: none;
  color: #444;
  margin: 10px;
  padding: 10px;
}

.magicline {
  position: absolute;
  /* width js, left js */
  position: absolute;
  height: 50px;
  border-radius: 25px;
  background-color: pink;
  transition: 0.3s;
  top: 50%;
  transform: translateY(-50%);
}
<ul class="nav">
  <div class="magicline"></div>
  <li class="li"><a href="#0" class="item">Link 1</a></li>
  <li class="li"><a href="#0" class="item">Link 2</a></li>
  <li class="li"><a href="#0" class="item">Link 3</a></li>
  <li class="li"><a href="#0" class="item">Link 4</a></li>
  <li class="li"><a href="#0" class="item">Link 5</a></li>
  <li class="li"><a href="#0" class="item">Link 6</a></li>
  <li class="li"><a href="#0" class="item">Link 7</a></li>
  <li class="li"><a href="#0" class="item">Link 8</a></li>
  <li class="li"><a href="#0" class="item">Link 9</a></li>
</ul>

<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>

最佳答案

您需要添加父级的 scrollLeft 属性:

$(function() {
  $(".li").click(function() {
    var lft = $(this).parent().scrollLeft() + $(this).position().left; // <---
    $(".magicline").css({
      width:
        $(this)
          .outerWidth() + "px",
      left:
        lft + "px"
    });
  });
  
  $(".li").first().trigger("click");
});
body {
  padding: 0;
  margin: 0;
}

ul,
li {
  list-style: none;
  padding: 0;
  margin: 0;
}

.nav {
  width: 300px;
  display: flex;
  border-top: 1px solid tomato;
  border-bottom: 1px solid tomato;
  margin-top: 100px;
  overflow: auto;
  position: relative;
}

.li {
  white-space: nowrap;
  position: relative;
  z-index: 2;
  cursor: pointer;
}

.item {
  display: block;
  text-decoration: none;
  color: #444;
  margin: 10px;
  padding: 10px;
}

.magicline {
  position: absolute;
  /* width js, left js */
  position: absolute;
  height: 50px;
  border-radius: 25px;
  background-color: pink;
  transition: 0.3s;
  top: 50%;
  transform: translateY(-50%);
}
<ul class="nav">
  <div class="magicline"></div>
  <li class="li"><a href="#0" class="item">Link 1</a></li>
  <li class="li"><a href="#0" class="item">Link 2</a></li>
  <li class="li"><a href="#0" class="item">Link 3</a></li>
  <li class="li"><a href="#0" class="item">Link 4</a></li>
  <li class="li"><a href="#0" class="item">Link 5</a></li>
  <li class="li"><a href="#0" class="item">Link 6</a></li>
  <li class="li"><a href="#0" class="item">Link 7</a></li>
  <li class="li"><a href="#0" class="item">Link 8</a></li>
  <li class="li"><a href="#0" class="item">Link 9</a></li>
</ul>

<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>

关于javascript - 如何制作带有水平滚动导航的 magicline 动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59430125/

相关文章:

javascript - Safari 推送通知 Pushmanager 无法注册

javascript - 如何解析 form[0].submit 不是函数(...)

javascript - IE11 Javascript on-change 事件不适用于 html 表单元素

javascript - PDFBOX-1.8.10 中是否有任何字段可以保存图像?

javascript - Reactjs 添加和删除输入字段

php - jquery 插件 periodicalupdater 的含义

javascript - 如何使用javascript延迟标题标签中的脚本?

php - 事件日历网站上的幻灯片

javascript - 在 backbone.js 中添加 access_token

javascript - 使用 lodash 在数组列表中按字母排序名称