【问题标题】:How to fix window scroll event listener for firefox?如何修复 Firefox 的窗口滚动事件监听器?
【发布时间】:2019-03-23 07:43:23
【问题描述】:
  • 我创建了一个函数,根据窗口滚动位置添加/删除导航类。 https://kmanadkat.github.io/navonscroll/

  • 它在 Chrome 桌面和移动版中运行,但 在 Firefox 中失败。 令人惊讶的是,我在上述网站上提到的示例在 Firefox 上运行,而不是在主页上运行。

  • 我已经尝试了很多来找出错误,window.onscroll 函数没有控制台日志。我想将此插件保留在 pure Vanilla Javascript 中,我仍然尝试使用箭头符号来查看它们是否修复,但它们没有工作。

  • 一切都在chrome中工作,只是firefox无法与window.onscroll相处,
  • 我什至尝试过window.addEventListener("scroll", function() {});,但它也不起作用,在我的网站以外的选项卡上,我可以使用开发人员工具执行 onscrollevents。

  • 这是插件的完整代码:


function hide_on_scroll(obj) {
  // Throw Error if input type is not object or navid is not passed
  if(typeof(obj)!=="object" || obj.nav_id===undefined){
    throw new TypeError("Argument must be an Object, also confirm NavId");
  }

  // Get Function Paramenters
  var nav_id                  = obj.nav_id;
  var nav_offset              = !!obj.nav_offset ? obj.nav_offset : 200;
  var nav_position            = !!obj.nav_position ? obj.nav_position : 'top';
  var hide_onscroll_mobile    = !!obj.hide_onscroll_mobile ? true : false;
  var mobile_width            = !!obj.mobile_width ? obj.mobile_width : 576;
  nav_position = nav_position.toLowerCase();

  // Prepare Navbar
  var navbar = document.getElementById(nav_id);
  if(navbar==undefined){throw new TypeError("Recheck Passed Navigation Id"); }

  var nav_height = navbar.offsetHeight;
  var navClasses = document.createElement('style');
  navClasses.type = 'text/css';
  navClasses.innerHTML = 
  '.nav-scroll-up{-webkit-transform: translateY(-'+78+'px);-ms-transform: translateY(-'+78+'px);transform: translateY(-'+78+'px);}' +
  '.nav-scroll-down{-webkit-transform: translateY('+78+'px);-ms-transform: translateY('+78+'px);transform: translateY('+78+'px);}' +
  '.nav-scroll-fixed-'+ nav_position +'{position: fixed;'+ nav_position +': 0;right: 0;left: 0;z-index: 1000;}' +
  '.nav-scroll-transition{will-change: transform; -webkit-transition: -webkit-transform 0.5s cubic-bezier(0.5, 0, 0.25, 1);transition: -webkit-transform 0.5s cubic-bezier(0.5, 0, 0.25, 1);-o-transition: transform 0.5s cubic-bezier(0.5, 0, 0.25, 1);transition: transform 0.5s cubic-bezier(0.5, 0, 0.25, 1);transition: transform 0.5s cubic-bezier(0.5, 0, 0.25, 1), -webkit-transform 0.5s cubic-bezier(0.5, 0, 0.25, 1);}';
  document.getElementsByTagName('head')[0].appendChild(navClasses);
  navbar.classList.add('nav-scroll-transition');
  navbar.classList.add('nav-scroll-fixed-' + nav_position);


  // Set Global Variables
  var c=0;
  var currentScrollTop = 0;
  var scrollingClass = (nav_position==='top') ? 'nav-scroll-up' : 'nav-scroll-down';
  var width = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
  // Get Current Viewport Width
  window.onresize = function(){ width = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);}
  // Call Window OnScroll
  window.onscroll = function() {
    // disable Hide on scroll for mobile
    if(hide_onscroll_mobile==false && width<=mobile_width){
      if(navbar.classList.contains(scrollingClass)){ navbar.classList.remove(scrollingClass); }
    }

    // Hide On Scroll for all screen if (width > mobile_width or mobile_width==true)
    else{
      var a = window.scrollY;
      currentScrollTop = a;
      if (c < currentScrollTop && a > (2*nav_offset)) { 
        navbar.classList.add(scrollingClass); 
      }
      else if (c > currentScrollTop && !(a <= nav_offset)) { 
        navbar.classList.remove(scrollingClass); 
      }
      c = currentScrollTop;
    }
  };
}
  • 我想如何从 html 调用它,上面的代码来自文件navonscroll.js
  <script src="navonscroll.js"></script>
  <script>
    hide_on_scroll({
      nav_id: 'myscrolling_nav',
      hide_onscroll_mobile : true,
      nav_offset : 10
    });
  </script>

我希望有人可以帮助我直接在 git 上修复它并为这种开源类型的插件做出贡献,或者 stackoverflow 中的一些修复也会有所帮助。

【问题讨论】:

    标签: javascript css addeventlistener onscrolllistener


    【解决方案1】:

    这显然是一个 CSS 问题,所以这将是一个不完整的答案(这不是我真正的领域),但似乎 window.scroll 事件在 Firefox 上根本没有触发,原因是:

    • scroll-behavior: smooth;html 元素上,
    • height: 100vh; + overflow: auto;body 元素上。

    如果您从 main.css 文件中删除任何这些规则,则 JS 事件将再次触发。

    具有更多 CSS 专业知识的人可能会了解发生了什么以及调整这些规则的最合适方法是什么,即使这对我来说有点像 Firefox 错误。

    【讨论】:

    • 非常感谢 Jeto,如果可能的话,我会看到删除这些属性。是的,这是有道理的,因为示例页面没有这些 css 属性集并且它在那里工作。
    • 你是如何找出css问题的?将来会对我有所帮助。
    • @KrupeshAnadkat 我下载了页面并玩弄了一些东西(主要是删除了脚本/CSS/等),直到window.scroll 工作。顺便说一句,如果有帮助,您应该接受答案(左侧的绿色小勾号)。祝你好运!
    • 谢谢,我只是在等待其他一些答案。但是我刚刚解决了这个问题,很快就把它推到了github上。你能支持我的问题吗,我是stackoverflow的新手,需要一些关于声誉的点。谢谢
    • 这是一个不错的问题,所以我不介意这样做:)
    猜你喜欢
    • 2018-01-31
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    相关资源
    最近更新 更多