twitter-bootstrap-3 - Bootstrap Fixed Navbar .. 如何动态调整内容填充顶部?
问题描述
此问题适用于 Bootstrap v3.3.7 及更高版本(v4 之前)。
我正在使用导航栏固定顶部;当小屏幕断点启动并且导航栏高度在打开时扩展时,我想将内容向下推到导航栏下方(与导航栏静态顶部的工作方式大致相同)。
怎么做?我的方法是为它编写一个特定的 CSS 规则。但是我怎么才能知道小屏幕断点的确切值是多少呢?
<div class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header pull-right">
<!-- this is the hamburger, shown on smaller width screens -->
<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>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="#">My Home</a></li>
<li><a href="#">Menu 1 </a></li>
<li><a href="#">Menu 2</a></li>
<li><a href="#">Menu 3</a></li>
</ul>
</div>
</div>
</div>
<section id="content">
<h3>using Fixed-navbar</h3>
<p>This uses <strong>FIXED NAVBAR (navbar-fixed-top)</strong>, which means navbar DOES NOT scroll out of view... i.e. it remains VISIBLE at all times.<br/>
However, it does NOT push the content down (the pink section) when the navbar needs to expands via the Hamburger button
</p>
<p>Sed dignissim blah etc...</p>
</section>
解决方案
这是我自己的答案:
起初我尝试使用 transitionend 事件,但事实证明它不能可靠地解决我的问题;不是因为它本身不可靠,而是因为导航高度在过渡结束后没有及时更新。
所以我求助于轮询和其他可靠工作的逻辑
let navContainer$ = $("div.navbar > div.container");
let collapsedDiv$ = $("div.navbar > div.container > div.collapse");
let intervalHandle;
//on hamburger click...
$("button.navbar-toggle").click(() => {
let heightBeforeTrx = navContainer$.height();
console.error( 'heightBeforeTrx:', heightBeforeTrx ) //= 50
if (heightBeforeTrx === 50) {
//we are moving from collapsed to Expanded...
intervalHandle = setInterval( () => {
console.log('Yo keep polling...')
//we expect...a class 'collapse.in' to exist once expanded
let test1 = collapsedDiv$.hasClass( "in" );
if (test1) {
//STOP THE POLLING...
clearInterval(intervalHandle);
console.log('polling ended.')
$("body").css('padding-top', '176px')
}
}, 100 )
} else {
//we are moving from Expanded to Collapsed...
intervalHandle = setInterval( () => {
console.log('Yo keep polling...')
//we expect...a class 'collapse.in' to NOT exist once collapsed
let test2 = collapsedDiv$.hasClass( "in" );
if (!test2) {
//STOP THE POLLING...
clearInterval(intervalHandle);
console.log('polling ended.')
$("body").css('padding-top', '50px')
}
}, 100 )
}
})
现在已经足够好了,应该相应地调整 176px 硬编码;仅适用于 2 个用例,当宽度变得更小时,可能还有其他高度,但我会忽略这些;如果手动重新调整窗口大小,在从汉堡点击扩展后,还需要额外的 jQuery 来推送内容。
推荐阅读
- webpack - nuxt js供应商文件太大
- vba - 使用用户表单复选框控制内容控制复选框
- c# - 结帐期间在数据库中重复的记录
- arrays - 在 Invoke-AzureRmVMRunCommand 参数哈希表中传递数组不起作用
- datatable - 按数据查找 DataTable 单元格
- javascript - Angular 4中的路由更改时组件未正确呈现
- spring-boot - 微服务中的通用逻辑
- python - 使用 Databricks Job api 调用 databricks notebook 使用 AWS Lambda 函数运行-提交端点
- angular - 如何替换父组件内的组件
- java - 如何获取我的应用在 azure 中运行的虚拟机名称