【问题标题】:Ruby on Rails - Change logo image on page scroll not activatingRuby on Rails - 更改页面滚动上的徽标图像未激活
【发布时间】:2017-08-23 19:33:12
【问题描述】:

Ruby 2.3.1

Rails 5.1.2

当我开始滚动时,我正在尝试将导航栏中的徽标图像更改为另一个,但到目前为止没有成功。在常规 HTML 中,通过这种方式可以正常工作:

<div class="logo">
  <a class="logo-wrap" href="index.html">
    <img class="logo-img logo-img-main" src="img/logo/ymk_logo_lw.png" alt="Ymk Logo">
    <img class="logo-img logo-img-active" src="img/logo/ymk_logo.png" alt="Ymk Logo">
  </a>
</div>

并具有以下 CSS 属性:

.header .logo-img-main {
  display: inline-block;
  transition-duration: 400ms;
  transition-property: all;
  transition-timing-function: cubic-bezier(0.7, 1, 0.7, 1);
}

.header .logo-img-active {
  display: none;
  transition-duration: 400ms;
  transition-property: all;
  transition-timing-function: cubic-bezier(0.7, 1, 0.7, 1);
}

.header .logo .logo-img-main {
  display: none;
}
  .header .logo .logo-img-active {
  display: inline-block;
}

.page-on-scroll .header .logo-img-main {
  display: none;
  transition-duration: 400ms;
  transition-property: all;
  transition-timing-function: cubic-bezier(0.7, 1, 0.7, 1);
}
.page-on-scroll .header .logo-img-active {
  display: inline-block;
  transition-duration: 400ms;
  transition-property: all;
  transition-timing-function: cubic-bezier(0.7, 1, 0.7, 1);
}

还有 JS:

var Layout = function () {
    'use strict';

    // handle on page scroll
    var handleHeaderOnScroll = function() {
        if ($(window).scrollTop() > 60) {
            // var colorLogoPath = "#{asset_path('logo/ymk_logo.png')}";
            $('body').addClass('page-on-scroll');
            // $('.logo-img .logo-img-active').attr('src', colorLogoPath);
        } else {
            // var whiteLogoPath = "#{asset_path('logo/ymk_logo_lw.png')}";
            $('body').removeClass('page-on-scroll');
            // $('.logo-img .logo-img-main').attr('src', whiteLogoPath);
        }
    }

return {
        init: function () {
            handleHeaderOnScroll(); // initial setup for fixed header

            // handle minimized header on page scroll
            $(window).scroll(function() {
                handleHeaderOnScroll();
            });
        }
    };
}();

$(document).ready(function() {
    Layout.init();
});

在 JS 部分,我注释掉了一些部分,因为我试图实现此 SO question 中的一些代码,但由于它向我显示图像,所以只能到达某个点。

所以我回去决定在html中实现和if声明:

        <div class="logo">
          <a class="logo-wrap">
           <% if image_tag("logo/ymk_logo_lw.png", :class => "logo-img logo-img-main", :alt => "Ymk Logo White") %>
            <%= image_tag("logo/ymk_logo_lw.png", :class => "logo-img logo-img-main", :alt => "Ymk Logo White") %>
           <% else %>
            <%= image_tag("logo/ymk_logo.png", :class => "logo-img logo-img-active", :alt => "Ymk Logo OG") %>
           <% end %>
          </a>
        </div>

现在,当我加载页面时,应该出现的第一个徽标 ymk_logo_lw.png 没有显示,但是当我开始滚动时,第二个徽标出现 ymk_logo.png

如果有任何建议,我将不胜感激,我对 Ruby 还很陌生,而且我刚刚得到它。谢谢!

application.js 要求:

//= require jquery-3.2.1.min.js
//= require bootstrap-sprockets
//= require swiper/js/swiper.jquery.min.js
//= require components/swiper.min.js
//= require jquery.easing.js
//= require jquery.back-to-top.js
//= require jquery.smooth-scroll.js
//= require jquery.wow.min.js
//= require jquery.parallax.min.js
//= require masonry/jquery.masonry.pkgd.min.js
//= require masonry/imagesloaded.pkgd.min.js
//= require components/wow.min.js
//= require components/masonry.min.js
//= require components/gmap.min.js
//= require rails-ujs
//= require turbolinks
//= require_tree .

`_navbar.html.erb:

    <header class="header navbar-fixed-top">
      <!-- Navbar -->
      <nav class="navbar" role="navigation">
        <div class="container">
          <!-- Brand and toggle get grouped for better mobile display -->
          <div class="menu-container">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".nav-collapse">
              <span class="sr-only">Toggle navigation</span>
              <span class="toggle-icon"></span>
            </button>

            <!-- Logo -->
            <div class="logo">
              <a class="logo-wrap" href="/">
                <%= image_tag("logo/ymk_logo_lw.png", :class => "logo-img logo-img-main", :alt => "Ymk Logo White") %>
                <%= image_tag("logo/ymk_logo.png", :class => "logo-img logo-img-active", :alt => "Ymk Logo OG") %>
              </a>
            </div>
            <!-- End Logo -->
          </div>

          <!-- Collect the nav links, forms, and other content for toggling -->
          <div class="collapse navbar-collapse nav-collapse">
            <div class="menu-container">
              <ul class="navbar-nav navbar-nav-right">
                <li class="nav-item">
                  <%= link_to "Home", root_path, class: "nav-item-child nav-item-hover #{yield(:root_active)}", :"data-no-turbolink" => true, method: "get" %>
                </li>
                <li class="nav-item">
                  <%= link_to "About", about_path, class: "nav-item-child nav-item-hover #{yield(:about_active)}", :"data-no-turbolink" => true, method: "get" %>
                </li>
                <li class="nav-item">
                  <%= link_to "Contact", contact_path, class: "nav-item-child nav-item-hover #{yield(:contact_active)}", :"data-no-turbolink" => true, method: "get" %>
                </li>
              </ul>
            </div>
          </div>
          <!-- End Navbar Collapse -->
        </div>
      </nav>
      <!-- Navbar -->
    </header>

【问题讨论】:

    标签: javascript html css ruby-on-rails


    【解决方案1】:

    您不能在那里使用 ERB 解决方案。 ERB 模板在服务器端解析和生成,然后发送到浏览器,因此您的 if/else 子句将在服务器上进行评估,结果将发送到浏览器,您最终拥有一个图像标签。呈现视图后,您无法通过服务器端代码对其进行更改。所以你在你的观点中用 Ruby 做的逻辑是不正确的。

    像这样更改您的代码:

    html:

    <div class='header'>
      <div class="logo">
        <a class="logo-wrap" href="index.html">
          <%= image_tag("logo/ymk_logo_lw.png", :class => "logo-img logo-img-main", :alt => "Ymk Logo White") %>
          <%= image_tag("logo/ymk_logo.png", :class => "logo-img logo-img-active", :alt => "Ymk Logo White") %>
        </a>
      </div>
     </div>
    
    • logo div 应该是header 的子类。如果它已经是这样,请将其删除(可能从部分加载?)
    • 注意&lt;%=(等号)。当您想在屏幕上打印表达式时(您目前没有在自己的代码上执行此操作)。

    CSS:

    .header .logo-img-main {
      display: inline-block;
      transition-duration: 400ms;
      transition-property: all;
      transition-timing-function: cubic-bezier(0.7, 1, 0.7, 1);
    }
    
    .header .logo-img-active {
      display: none;
      position: fixed;
      transition-duration: 400ms;
      transition-property: all;
      transition-timing-function: cubic-bezier(0.7, 1, 0.7, 1);
    }
    
    .page-on-scroll .header .logo-img-main {
      display: none !important;
      transition-duration: 400ms;
      transition-property: all;
      transition-timing-function: cubic-bezier(0.7, 1, 0.7, 1);
    }
    
    .page-on-scroll .header .logo-img-active {
      display: inline-block !important;
      transition-duration: 400ms;
      transition-property: all;
      transition-timing-function: cubic-bezier(0.7, 1, 0.7, 1);
    }
    
    • 您对同一类有多个定义,导致它们相互覆盖。
    • 我将.header .logo-img-active 更新为position: fixed,以便在滚动时可以看到徽标。

    JS:

    JS文件没有问题。只要确保你的Gemfile 中有jquery-rails,并且你在application.js 中需要它,比如//= require jquery

    【讨论】:

    • 感谢您的提示!那么实现它的替代方案是什么。另一个答案提供了我注释掉的 javascript 的更新,但它仍然向我显示一张图片。
    • @wlmrlsda 用解决方案更新了我的答案。
    • 谢谢!现在两个图像都显示了。它显示在它应该显示的位置的第一个徽标和另一个徽标,当我开始向下滚动时,移动到第一个徽标的右下角,尺寸稍大一些,位于导航栏之外。至于jquery-rails,因为我已经下载了jquery文件,有必要吗?查看我的问题的底部。我添加了我的要求。
    • 顺便说一句,我还用完整的_navbar.html.erb更新了我的问题
    • @wlmrlsda您很可能在您的 css 中有问题,而您的代码的另一部分正在覆盖这些。您应该检查浏览器控制台并检查导致它的部分。我已经用我分享的代码制作了一个测试 Rails 应用程序,它运行良好。
    【解决方案2】:

    思路是每次更新同一个图片标签的src。检查下面的 Javascript 以了解我是如何更新代码的。

    <div class="logo">
      <a class="logo-wrap">
        <%= link_to(image_tag("logo/ymk_logo_lw.png", :class => "logo-img logo-img-main", :alt => "Ymk Logo White"), root_path) %>
       </a>
    </div>
    

    Javascript(稍微清理一下)

    var handleHeaderOnScroll = function() {
        var imagePath = ""
        if ($(window).scrollTop() > 60) {
            imagePath = "#{asset_path('logo/ymk_logo.png')}";
            $('body').addClass('page-on-scroll');
        } else {
            imagePath = "#{asset_path('logo/ymk_logo_lw.png')}";
            $('body').removeClass('page-on-scroll');
        }
        $('.logo-img .logo-img-main').attr('src', imagePath);
    }
    

    将您的 CSS 编辑为最小化

    .header .logo-img-main {
      display: none;
      transition-duration: 400ms;
      transition-property: all;
      transition-timing-function: cubic-bezier(0.7, 1, 0.7, 1);
    }
    
    .page-on-scroll .header .logo-img-main {
      display: inline-block;
      transition-duration: 400ms;
      transition-property: all;
      transition-timing-function: cubic-bezier(0.7, 1, 0.7, 1);
    }   
    

    【讨论】:

    • 感谢您的帮助。现在纸张发生了变化,它显示的是第一个徽标,而不是第二个。
    • 你能验证两个条件都达到了吗?
    • 是的,他们正在联系中。我在两者上都添加了console.log(imagePath);,它显示#{asset_path('logo/ymk_logo_lw.png')} 在滚动条位于顶部时显示,#{asset_path('logo/ymk_logo.png')} 在我开始滚动时显示。
    • 试试更新的 CSS。我只是编辑了它,希望它能解决你的问题。在这一点上,CSS 是罪魁祸首。
    • 使用您发送给我的更新后的 CSS,它们都没有出现。在我的粘性导航栏从透明变为白色之前开始向下滚动时,它只显示ymk_logo_lw 一小会儿。
    猜你喜欢
    • 2017-12-19
    • 2010-12-19
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多