创建一个粘性导航css和jquery
Creating a sticky nav css and jquery
我目前正在为一个网站开发粘性导航,我遇到了一些问题,当导航变成position:fixed
时,它似乎会跳起来,看起来很"笨重",
http://jsfiddle.net/DKtLR/
理想情况下,结果是用户滚动,导航不在固定位置,直到它滚动出视口,然后变为固定并滑回视图。
因为您只想在它完全离开视口时使其固定,然后滑入,只需修改top
属性,然后将其动画化回视图。请参阅此小提琴以获取工作示例。
更新
这个更新后的fiddle应该能更好地工作,因为它只应用尚未应用的行为,并在返回正常的"静态"位置时完全删除动态样式。
请注意,当向上滚动时仍然会有闪烁——这是因为导航从固定位置"跳"回静态位置。使用与上述动画类似的技术可以很容易地解决此问题。
您可以简单地使用StickyScroller jquery插件:http://vertstudios.com/blog/jquery-sticky-scroller-position-fixed-plugin/
在顶部,然后用动画修复,这样就不会显得笨拙
这可能是你正在寻找的解决方案,因为它在滚动出视图时提供了固定的菜单栏,但当它从顶部切换到固定时,它会进行向下滑动的动画,所以感觉不像你描述的那样笨拙。
我在示例中使用的HTML(简化):
<div id="menu">
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
...
</ul>
</div>
<div id="content" />
CSS当然很简单(只有相关的样式)
#menu {
position: absolute;
width: 100%;
}
#menu.out {
position: fixed;
}
#menu ul {
margin: 0;
list-style: none;
}
#menu ul li {
display: inline-block;
}
以及执行速度非常快的脚本(因此它执行得尽可能快,因为最慢的部分是调用浏览器本机getBoundingClientRect()
函数,这意味着它仍然很快):
$(function() {
// save element references for faster execution
var menu = $("#menu");
var ul = menu.find("ul");
var content = $("#content")[0];
// get menu actual height
var menuHeight = menu[0].getBoundingClientRect().bottom;
// detect whether menu is scrolled out
var inView= true;
$(document).scroll(function(evt) {
evt.preventDefault();
var top = content.getBoundingClientRect().top;
var nextInView = (top + menuHeight) > 0;
// did state change so we have to change menu positioning
if (inView ^ nextInView)
{
inView = nextInView;
if (inView)
{
menu.removeClass("out");
}
else
{
menu.addClass("out");
ul.hide().slideDown("fast");
}
}
});
});
就是这样。您还可以通过设置top style属性的动画来将动画从slideDown()
调整为slide in
,同时您可以确切地知道在动画之前必须将菜单放在视图端口上方的像素数。
当你滚动页面,菜单离开视图时,它会将其切换到固定位置并向下滚动菜单,这样它不仅会跳到视图中,而且会平滑地回到中。
我在这个解决方案的基础上制定了这个替代解决方案。基于setInterval
功能(另请参阅控制台日志)。
var interval_id = false;
var curOffset, oldOffset;
var altmenu;
$(document).ready(function(){
altmenu = $('.top-nav')[0].cloneNode(true);
altmenu.style.position = 'absolute';
altmenu.style.display = 'none';
document.body.appendChild(altmenu);
oldOffset = $(window).scrollTop();
$(document).bind('scroll',function(){
if (interval_id) {
return;
}
//altmenu.style.display = 'none'; // optional
interval_id = setInterval(function() {
curOffset = $(window).scrollTop();
if(curOffset == oldOffset) {
console.log('scrolling stopped',curOffset);
clearInterval(interval_id);
interval_id = false;
if (curOffset>120) {
altmenu.style.display = 'block';
} else {
altmenu.style.display = 'none';
}
$(altmenu).css({
top: (curOffset-120)+'px'
}).animate({
top: (curOffset)+'px'
}, 500);
}
oldOffset = curOffset;
}, 500); //setInterval
});//scroll
});//ready
测试脚本和jsfiddle都在这里。
- css,用于在移动视图中将引导导航栏更改为accordian
- (html/css/javascript)试图使导航栏中的“当前页面”链接变成不同的颜色
- 单击启动CSS导航活动类更改
- Javascript/Css导航未显示在jquery文档上,仅在ie中准备就绪
- 更改css子元素导航树
- IE7在带有Javascript选项卡导航的页面上误读CSS
- 使用 CSS 或 javascript/jQuery,我会使用哪种方法来使我的网站的导航栏看起来更 3d-ish
- CSS 画布和导航栏定位
- 使用具体化 CSS 在不同的页面上显示不同的侧导航
- .CSS.:悬停在导航>李上不起作用
- 移动导航菜单不起作用(HTML,CSS和JQuery)
- 在导航图标css下换行文本
- jQuery移动Ajax导航功能和CSS样式
- 创建一个粘性导航css和jquery
- 需要jquery&litte-html-css改进猫头鹰幻灯片与选项卡导航(分页)
- 使用CSS/JavaScript在活动页面上突出显示活动导航菜单项,无id
- 超精细的CSS导航下拉宽度
- CSS 导航栏在文本下方滑动线
- 用Javascript改变导航CSS
- 导航CSS样式不工作