javascript - 如果它有足够的宽度,则在准备好和滚动时更改类

标签 javascript html css twitter-bootstrap scroll

我正在开发一个网站,在顶部我有一个固定菜单和一个 slider (均来自 Bootstrap )。

我的问题是菜单文本作为网站背景是白色的,并且菜单是透明的,所以我添加了一个 javascript 函数,当 slider 到达 slider 末尾时更改菜单背景。

jQuery("document").ready(function($){

    var nav = $('.navbar');

    $(window).scroll(function () {
        if ($(this).scrollTop() > document.getElementById('slider').clientHeight - document.getElementById('navbar').clientHeight) {
        nav.addClass("navbar3");
        nav.removeClass("navbar2");
    } else {
        nav.removeClass("navbar3");
        nav.addClass("navbar2");
    }
});
});

使用这个 CSS

.navbar2 {
    z-index: 99;
    position: fixed;
    top: 0px;
    left: 0px;
    width: 100%;
    border-radius: 0px;
    background-color: rgba(255, 0, 0, 0);
}

.navbar3 {
    z-index: 99;
    position: fixed;
    top: 0px;
    left: 0px;
    width: 100%;
    border-radius: 0px;
    background-color: rgba(237, 125, 49, 0.5);
}

(默认类是 navbar2)

到这里没问题。

现在,当我在不同的分辨率下测试网站时,我发现当视口(viewport)小于 453 像素时(并且 Bootstrap 菜单已经将菜单更改为下拉菜单)下拉菜单已经在 slider 下方完成,所以不可能看到我尝试做的最后一个元素:

  1. 将默认类更改为 navbar3
  2. 添加一个 if 以便仅当视口(viewport)大于 453 像素时类才会更改(如果小于 453 像素,菜单背景永远不会透明)。

但这是一个失败,因为只有当我在更改分辨率的同时不断重新加载页面时才会这样,所以我又更改了一次,这样它也可以在调整大小时发生变化:

jQuery("document").ready(function($){

    var nav = $('.navbar');

    function addnav3() {
        nav.addClass("navbar3");
        nav.removeClass("navbar2");
    }
    function addnav2() {
        nav.addClass("navbar2");
        nav.removeClass("navbar3");
    }

    if ($(window).width() > 453) {
       addnav2();
       $(window).scroll(function () {
            if ($(this).scrollTop() > document.getElementById('slider').clientHeight - document.getElementById('navbar').clientHeight) {
                addnav3();
            }
            else {
                addnav2();
            }
        });
    }


$(window).resize(function () {
    if ($(window).width() > 453) {
       addnav2();
       $(window).scroll(function () {
            if ($(this).scrollTop() > document.getElementById('slider').clientHeight - document.getElementById('navbar').clientHeight) {
                addnav3();
            }
            else {
                addnav2();
            }
        });
    }
    else {
        addnav3();
    }
});
});

现在,当我调整大小时它确实发生了变化,但是如果我走到 slider 的末尾并返回,菜单背景就会消失...

我对 javascript 不是很熟悉,所以有什么想法吗?我将在此处发布所有 HTML。

<nav class="navbar navbar3" id="navbar">
         <div class="container-fluid">
           <!-- Brand and toggle get grouped for better mobile display -->
           <div class="navbar-header">
               <a class="navbar-brand" href="#">
                   <img id="logo" alt="Brand" src="<?php echo $imagesfolder; ?>Untitled-1.png">
               </a>
               <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                   <span class="sr-only">Toggle navigation</span>
                   <span class="icon-bar"></span>
                   <span class="icon-bar"></span>
                   <span class="icon-bar"></span>
               </button>

           </div>

          <!-- Collect the nav links, forms, and other content for toggling -->
          <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
             <ul class="nav navbar-nav navbar-right">
               <li><a href="#">Página Inicial</a></li>
               <li><a href="#">Produtos</a></li>
               <li><a href="#">Sobre Nós</a></li>
             </ul>
           </div><!-- /.navbar-collapse -->
          </div><!-- /.container-fluid -->
        </nav>

<div class="" id="slider">
  <div id="myCarousel" class="carousel slide" data-ride="carousel">
<!-- Indicators -->
<ol class="carousel-indicators">
  <li data-target="#myCarousel" data-slide-to="0" class="active"></li>
  <li data-target="#myCarousel" data-slide-to="1"></li>
  <li data-target="#myCarousel" data-slide-to="2"></li>
  <li data-target="#myCarousel" data-slide-to="3"></li>
</ol>

<!-- Wrapper for slides -->
<div class="carousel-inner" role="listbox">
  <div class="item active">
    <img src="<?php echo $imagesfolder; ?>transferir.jpg" alt="" width="460" height="345">
  </div>

  <div class="item">
    <img src="<?php echo $imagesfolder; ?>transferir%20(1).jpg" alt="" width="460" height="345">
  </div>

  <div class="item">
    <img src="<?php echo $imagesfolder; ?>transferir%20(2).jpg" alt="" width="460" height="345">
  </div>

  <div class="item">
    <img src="<?php echo $imagesfolder; ?>images.jpg" alt="" width="460" height="345">
  </div>
</div>

<!-- Left and right controls -->
<a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
  <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
  <span class="sr-only">Previous</span>
</a>
<a class="right carousel-control" href="#myCarousel" role="button" data-slide="next">
  <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
  <span class="sr-only">Next</span>
   </a>
  </div>
</div>

提前谢谢你,MDC

最佳答案

我通过更改 javascript、取消绑定(bind)事件监听器来使其工作:

jQuery("document").ready(function($){

var nav = $('.navbar');

function addnav3() {
    nav.addClass("navbar3");
    nav.removeClass("navbar2");
}
 function addnav2() {
    nav.addClass("navbar2");
    nav.removeClass("navbar3");
}

    if ($(window).width() > 453) {
        addnav2();
       $(window).scroll(function () {
            if ($(this).scrollTop() > document.getElementById('slider').clientHeight - document.getElementById('navbar').clientHeight) {
                addnav3();
            }
            else {
                addnav2();
            }
        });
    }
    else {
        $(this).unbind('scroll');
        addnav3();
    }


$(window).resize(function () {
    addnav2();
    if ($(window).width() > 453) {
       $(window).scroll(function () {
            if ($(this).scrollTop() > document.getElementById('slider').clientHeight - document.getElementById('navbar').clientHeight) {
                addnav3();
            }
            else {
                addnav2();
            }
        });
    }
    else {
        $(this).unbind('scroll');
        addnav3();
    }
});
      });

关于javascript - 如果它有足够的宽度,则在准备好和滚动时更改类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39411307/

相关文章:

css - 默认情况下从父级继承其值的属性列表

javascript - 寻找使用命令行进行 Javascript 编码/实验的 shell

javascript - AngularJS 完全重置表单

php - 解析由 html 表单发布的 php 中的数组

javascript - HTML:子节点知道它是哪个子节点

html - CSS join form input, select and submit elements into a single box

javascript - 使用 JS,如何换出特定的文本实例而不是所有实例?

javascript - 模块化模式与原型(prototype) - Nodejs?

javascript - 动态创建Canvas并添加onmousedown功能

html - 无法让 "position: sticky"在我的导航栏上工作。任何帮助表示赞赏