jquery - 滚动上带有过渡 Logo 的导航菜单

标签 jquery html css nav

我正在尝试获取一个 Logo 来更改滚动状态。 (示例:www.digitalblb.com)

它应该如何工作; 1. 大Logo原样显示 - 滚动时更改为 2. 迷你标志 - 具有 360' 的旋转过渡效果

标题.html

<div class="navbar-header">
    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
    </button>
<%= link_to image_tag("biglogo-160x80.png", alt: "BigLogo"), root_url,class:"menu__biglogo" %>
<%= link_to image_tag("minilogo.png", alt: "MiniLogo"), root_url, class:"menu__minilogo" %>
</div>

CSS /* 过渡标志*/

.menu__minilogo{
    opacity: 1;
    visibility: visible;
    margin-left: 60px;
    -webkit-transform: rotate(360deg);
    -moz-transform: rotate(360deg);
    -o-transform: rotate(360deg);
    transform: rotate(360deg);
}

.menu__biglogo{
    width: 220px;
    overflow: hidden;
}

JS

$(document).ready(function(){
  var logo = $(".navbar-header");
  logo.find(".menu__minilogo").hide();
  $(window).scroll(function() { // check if scroll event happened
    if ($(document).scrollTop() > 50) { // check if user scrolled more than 50 from top of the browser window
      $(".navbar").css("background-color", "#fff"); // if yes, then change the color of class "navbar-fixed-top" to white (#f8f8f8)
      $(".nav a").css('color', '#0a4f6f');
      logo.find(".menu__biglogo").hide();
      logo.find(".menu__minilogo").show();

      console.log(logo.find(".menu__biglogo"))
    } else {
      $(".navbar").css("background-color", "transparent"); // if not, change it back to transparent
      $(".nav a").css('color', 'white');
      logo.find(".menu__minilogo").hide();
      logo.find(".menu__biglogo").show();

    }
  });
});

当前状态。 显示大 Logo ,滚动时显示迷你 Logo ,但没有任何旋转过渡。

有时,当单击网站时, Logo 会随机堆叠在一起,但刷新该页面时,它会再次恢复为大 Logo (因此这只是加载时的一个小错误)。

任何帮助将不胜感激。谢谢

最佳答案

您正在使用 jQuery 的 .show().hide() 函数来显示/隐藏您的 Logo 。这是可行的,但他们实际上所做的是将 Logo 的 display 属性从 block 切换到 none,反之亦然。

显示的问题是它不可动画化display:nonedisplay:block 之间不能有转换。它是开启关闭

所以你可以做什么:

  • 始终显示您的两个 Logo
  • 对其动画的初始状态进行编码
  • 当他们有自定义类时,对动画的最终状态进行编码(通常是事件 - 但您可以使用任何类,只要它不与任何内容冲突)。
  • 您想要在其上设置动画的所有属性都应该是可动画(w3schools 在这方面是一个很好的资源)
    • 最重要的是不透明度,因为它将控制 Logo 的可见性。
  • 加载带有 active 类的大 Logo 和没有 active 类的小 Logo 的页面。
  • 在滚动/单击/鼠标触发器/任何事件上切换两个 Logo 上的类(“事件”),从一个 Logo 中删除并在另一个 Logo 上添加。因为它们具有可动画化属性和为这些动画设置的过渡,所以它们可以很好地制作动画。

这是一个例子:

$(document).ready(function(){
  var navbar = $(".navbar-header");
  $(window).scroll(function() {
    if ($(document).scrollTop() > 50) { 
      $(".navbar").css("background-color", "#fff"); 
      $(".nav a").css('color', '#0a4f6f');
      
      navbar.find(".menu__biglogo").removeClass('active');
      navbar.find(".menu__minilogo").addClass('active');

    } else {
      $(".navbar").css("background-color", "transparent");
      $(".nav a").css('color', 'white');
      navbar.find(".menu__biglogo").addClass('active');
      navbar.find(".menu__minilogo").removeClass('active');

    }
  });
});
.navbar-header {
  position: fixed;
}

.menu__minilogo{
    width: 200px;
    height: auto;
    position: absolute;
    opacity: 0;
    margin-left: 0;
    transform: rotate(0deg);
    transition: all .6s cubic-bezier(.4,0,.2,1);
}
.menu__minilogo.active {
  width: 60px;
  margin-left: 60px;
  opacity: 1;
  transform: rotate(360deg);
}

.menu__biglogo{
    width: 220px;
    height: auto;
    opacity: 0;
    transition: opacity .6s cubic-bezier(.4,0,.2,1);
}
.menu__biglogo.active {
  opacity: 1;
  transition: opacity .3s cubic-bezier(.4,0,.2,1) .3s;
}

body {
  min-height: 200vh;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="navbar-header">
    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
    </button>
  <img src="http://lorempixel.com/g/400/400/fashion" class="menu__minilogo" />
  <img src="http://lorempixel.com/g/400/400/fashion" class="menu__biglogo active" />
</div>

我没有在其中加载 Bootstrap,但我假设您已经涵盖了该部分。
旁注:如果您的大 Logo 和小 Logo 是相同的图像,则没有必要同时使用它们。您可以将大的位置调整大小/旋转到小位置并返回,仅对其 transform 属性进行动画处理,而不是不透明度。

关于jquery - 滚动上带有过渡 Logo 的导航菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42355756/

相关文章:

javascript - 如何在数组中随机选择随机数量的项目

jQuery 在屏幕上一点一点地移动一个 div

html - 边框0px虚线

jquery - 将鼠标悬停在特定部分

css - Windows 10 邮件不会呈现最大宽度

jquery - HTML 表格标题与正文不对齐

javascript - 更少的 switch 语句行?

jquery ui 可拖动约束 ina 轴 x 和给定坐标

jquery - 表格即将超出 div

javascript - 1000 个元素的 Jquery 可拖动性能与重新渲染元素的对比