javascript - Bootstrap 4 网站错误:使用自定义数据属性将类从部分传递到导航栏不起作用
问题描述
我正在使用 Bootstrap 4 开发一个网站,该网站的部分具有浅色和深色背景以及固定的导航栏。
导航栏是深色的(具有 css 类bg-dark
),虽然它在浅色部分很容易看到,但与深色部分没有区别。
我找到了一个解决这个问题的简单方法:我使用data-navbar-classes
带有其中一个值的自定义数据属性,navbar-light bg-light
并将navbar-dark bg-dark
2 个类从部分传递到导航栏,因为部分到达页面顶部。
脚本中有一个错误,我找不到它:
var toggleNavbarClasses = function() {
var navbarHeight = $('.navbar').outerHeight(),
classChangeTrigger = navbarHeight / 2;
$('.page-section').each(function() {
var $pageSection = $(this),
pageSectionClasses = $pageSection.data('navbar-classes'),
fromTop = $pageSection.offset().top;
if (fromTop < classChangeTrigger && fromTop >= 0) {
$('nav.navbar').removeClass('bg-dark navbar-dark')
.addClass(pageSectionClasses);
}
});
};
$(window).scroll(toggleNavbarClasses);
//toggleNavbarClasses();
.page-section {
padding: 70px 10px
}
.page-section.bg-dark * {
color: #fff;
}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<nav class="navbar navbar-expand-sm navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="#">Logo</a>
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" href="about.html">About Us</a>
</li>
<li class="nav-item">
<a class="nav-link" href="services.html">Services</a>
</li>
<li class="nav-item">
<a class="nav-link" href="contact.html">Contact</a>
</li>
</ul>
</nav>
<div data-navbar-classes="navbar-dark bg-dark" class="container-fluid bg-light page-section">
<h1>Section 1</h1>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>
<div data-navbar-classes="navbar-light bg-light" class="container-fluid bg-dark page-section">
<h1>Section 2</h1>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consectetur illum perferendis totam delectus quas earum ea labore, deserunt placeat sit, amet veritatis, saepe itaque! Velit vitae accusantium maiores corrupti cupiditate!</p>
</div>
<div data-navbar-classes="navbar-dark bg-dark" class="container-fluid bg-light page-section">
<h1>Section 3</h1>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
我的错误在哪里?
解决方案
如果我正确理解您的问题,您应该找出navbar
所在的部分,然后确定class
它的位置。
但是在您的代码中,唯一满足的情况fromTop < classChangeTrigger && fromTop >= 0
是第一个page-section
,因为其他情况fromTop
总是大于classChangeTrigger
.
navbar
在这种情况下,您可以通过计算outerHeight
和和电流来简单地找出位于哪个部分offset().top
,如下所示:page-section
scrollTop
var toggleNavbarClasses = function() {
var navbarHeight = $('.navbar').outerHeight(),
classChangeTrigger = navbarHeight / 2;
$('.page-section').each(function() {
var $pageSection = $(this),
pageSectionClasses = $pageSection.data('navbar-classes'),
fromTop = $pageSection.offset().top;
height = $pageSection.outerHeight();
scrollTop = document.documentElement.scrollTop;
if(scrollTop>=fromTop && scrollTop <= (fromTop+height)){
$('nav.navbar').removeClass('bg-dark navbar-dark navbar-light bg-light').addClass(pageSectionClasses);
}
});
};
$(window).scroll(toggleNavbarClasses);
.page-section {
padding: 70px 10px
}
.page-section.bg-dark * {
color: #fff;
}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<nav class="navbar navbar-expand-sm navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="#">Logo</a>
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" href="about.html">About Us</a>
</li>
<li class="nav-item">
<a class="nav-link" href="services.html">Services</a>
</li>
<li class="nav-item">
<a class="nav-link" href="contact.html">Contact</a>
</li>
</ul>
</nav>
<div data-navbar-classes="navbar-dark bg-dark" class="container-fluid bg-light page-section">
<h1>Section 1</h1>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>
<div data-navbar-classes="navbar-light bg-light" class="container-fluid bg-dark page-section">
<h1>Section 2</h1>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consectetur illum perferendis totam delectus quas earum ea labore, deserunt placeat sit, amet veritatis, saepe itaque! Velit vitae accusantium maiores corrupti cupiditate!</p>
</div>
<div data-navbar-classes="navbar-dark bg-dark" class="container-fluid bg-light page-section">
<h1>Section 3</h1>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
<p>Try to scroll this section and look at the navigation bar while scrolling! Try to scroll this section and look at the navigation bar while scrolling!</p>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
推荐阅读
- c# - C# 私有类 MyColors
- javascript - 不能在反应中使用 useState 或 useEffect 我还有什么?
- python-3.x - 在 ubuntu 20.4 中安装 pgadmin 4 时出错
- excel - Excel的重复乘法公式
- node.js - AutoTask Rest API 队列查询
- flutter - 在上传 onFlutter 之前显示文件选择的结果(我使用 file_picker 插件)
- javascript - 无法在 json axios 请求中打印新行
- node.js - EACCES:权限被拒绝,在 Elastic Beanstalk AWS 上打开“/var/app/current/node_modules/puppeteer/.local-chromium/chrome-linux.zip”
- sql - 有效地在 bigquery 中创建矩阵
- java - 在 Java 中保存和加载数据