使导航悬停下划线响应浏览器调整大小

时间:2019-04-17 21:46:54

标签: javascript html css resize nav

我目前有以下工作导航,其中下划线动画显示了链接悬停。但是,我注意到,当我调整浏览器大小时,下划线不会重置为正确的位置。我以为如果我从鼠标离开功能中重用了一些JS,并在窗口调整大小功能中使用了它,就可以正常工作,但是我一直遇到错误。有什么想法吗?

https://codepen.io/anon/pen/MRQaMm

JS:

$(".underline-nav").css("width", $("#one").width());
   $(".underline-nav").css("margin-left", $("#one").css("margin-left"));
   var unav = $(".underline-nav");
   $('nav a').mouseover(function(){
     $(".underline-nav").css("transition", "all ease 0.43s" );
       var position = $(this).position();
       unav.css({
         "width": $(this).width(),
         "margin-left": $(this).css("margin-left"),
         "left": position.left
       });
   })
   $('nav').mouseleave(function() {
               $(".underline-nav").css("transition", "all ease 0.7s" );
     var firstChild = $(this).find('a:first-child');
     var position = firstChild.position();
       unav.css({

         "width": firstChild.width(),
         "margin-left": firstChild.css("margin-left"),
         "left": position.left
       });
   })

//NEW BUT CAUSES ERROR
     var resizeTimer;
     $(window).resize(function() {
         clearTimeout(resizeTimer);
        $(".underline-nav").css("transition", "all ease 0.7s" );
        var firstChild = $(this).find('a:first-child');
        var position = firstChild.position();
            unav.css({

                "width": firstChild.width(),
                "margin-left": firstChild.css("margin-left"),
                "left": position.left
            });
     })

1 个答案:

答案 0 :(得分:0)

在匿名$(this)函数内部,undefined的值为resize。如果将$(this)替换为$('nav'),则一切正常。

简而言之,将其替换...

$(window).resize(function() {
  …
  var firstChild = $(this).find("a:first-child");
}

…与此

$(window).resize(function() {
  …
  var firstChild = $("nav").find("a:first-child");
}

演示

$(".underline-nav").css("width", $("#one").width());
$(".underline-nav").css("margin-left", $("#one").css("margin-left"));
var unav = $(".underline-nav");
$("nav a").mouseover(function() {
  $(".underline-nav").css("transition", "all ease 0.43s");
  var position = $(this).position();
  unav.css({
    width: $(this).width(),
    "margin-left": $(this).css("margin-left"),
    left: position.left
  });
});
$("nav").mouseleave(function() {
  $(".underline-nav").css("transition", "all ease 0.7s");
  var firstChild = $(this).find("a:first-child");
  var position = firstChild.position();
  unav.css({
    width: firstChild.width(),
    "margin-left": firstChild.css("margin-left"),
    left: position.left
  });
});

//NEW BUT CAUSES ERROR
var resizeTimer;
$(window).resize(function() {
  clearTimeout(resizeTimer);

  $(".underline-nav").css("transition", "all ease 0.7s");
  var firstChild = $("nav").find("a:first-child");
  var position = firstChild.position();
  console.log("position", position);
  unav.css({
    width: firstChild.width(),
    "margin-left": firstChild.css("margin-left"),
    left: position.left
  });
});
html {
  background-color: blue;
}

body {
  margin: 0;
}

.underline-nav {
  background: tomato;
  height: .25rem;
  position: absolute;
  top: 6vh;
  margin-top: 1vw;
  transform: translatex(4vw);
  transition: all ease 0.37s;
  z-index: 0;
}

.mainnav {
  padding-top: 1vh;
  width: 100%;
  position: absolute;
  z-index: 4;
  font-size: 0.8vw;
  text-align: center;
  display: flex;
  justify-content: center;
  align-items: center;
}

nav img {
  padding-left: 4vw;
  height: 3.5vw;
}

a {
  color: #fff;
  text-decoration: none;
  font-weight: 700;
  padding-left: 4vw;
  letter-spacing: 0.4em;
}

.sectionone {
  height: 100vh;
  background: url('media/bg.jpg') no-repeat center center fixed;
  background-size: cover;
  color: #fff;
  font-family: 'Raleway';
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<nav>
  <div class="mainnav">
    <a id="one" href="#">HOME</a>
    <a href="#">LINK 1</a>
    <a href="#">LINK 2</a>
    <img src="/media/Asset 1.png" alt="logo">
    <a href="#">LINK 3</a>
    <a href="#">LINK 4</a>
    <a href="#">LINK 5</a>
    <div class="underline-nav">
    </div>
  </div>
</nav>