JS 实现导航栏悬停效果(续)


Posted in Javascript onSeptember 24, 2013

上次【JS-实现导航栏悬停】说到,导航栏悬停的那个页面在IE上运行的时候,会出导航栏不停的抖动问题。

解决方法如下:

将导航栏的定位方式由原来的absolute改为fixed,也不知道为什么改为fixed,就不抖了。。-_-||

div.navigation{ 
width: 800px; 
height: 40px; 
background: red; 
margin: 4px auto 0; 
top: 400px; 
left: 0px; 
position: fixed; 
}

为此,JS也得做相应的修改。

因为fixed定位是根据浏览器的可视区进行定位的,所以原来给导航栏的定位都得改变。

//记录导航条原来在页面上的位置 
var naviga_offsetTop = 0; 
var naviga_offsetLeft = 0; //IE7不识别getElementsByClassName,为了兼容自定义一个 
function my_getElementsByClassName(class_name) { 
var el = []; 
//获取所有元素 
_el = document.getElementsByTagName('*'); 
//通过className刷选 
for (var i=0; i<_el.length; i++ ) { 
if (_el[i].className == class_name ) { 
el[el.length] = _el[i]; 
} 
} 
return el; 
} 
//导航条,悬停在顶部 
function naviga_stay_top(){ 
var a_navigation_bar = []; 
if(document.getElementsByClassName){//Chrome, FF 
a_navigation_bar = document.getElementsByClassName("navigation"); 
} else {//IE 
a_navigation_bar = my_getElementsByClassName("navigation"); 
} 
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop; 
document.title = scrollTop; 
//如果向下滚动的距离大于原来导航栏离顶部的距离 
//直接将导航栏固定到可视区顶部 
if( scrollTop > naviga_offsetTop ){ 
a_navigation_bar[0].style.top = 0 + "px"; 
} else { 
//如果向下滚动的距离小原来导航栏离顶部的距离,则重新计算导航栏的位置 
a_navigation_bar[0].style.top = (naviga_offsetTop - scrollTop) + "px"; 
} 
} 
//给导航条上四个tab,加上点击事件。 
window.onload=function(){ 
var a_tabs = []; 
if( document.getElementsByClassName ){//Chrome, FF 
a_tabs = document.getElementsByClassName("tab"); 
}else{ //IE 
a_tabs = my_getElementsByClassName("tab"); 
} 
var a_contents = []; 
if( document.getElementsByClassName ){//Chrome, FF 
a_contents = document.getElementsByClassName("content"); 
}else{//IE 
a_contents = my_getElementsByClassName("content"); 
} 
//获取offsetLeft,即导航栏离左边框的距离 
var a_main_div = []; 
if( document.getElementsByClassName ){//Chrome, FF 
a_main_div = document.getElementsByClassName("main"); 
}else{ //IE 
a_main_div = my_getElementsByClassName("main"); 
} 
naviga_offsetLeft = a_main_div[0].offsetLeft; 
a_tabs[0].onclick=function(){ 
window.scrollTo(0, a_contents[2].offsetTop); 
} 
a_tabs[1].onclick=function(){ 
window.scrollTo(0, a_contents[3].offsetTop); 
} 
a_tabs[2].onclick=function(){ 
window.scrollTo(0, a_contents[4].offsetTop); 
} 
a_tabs[3].onclick=function(){ 
window.scrollTo(0, a_contents[5].offsetTop); 
} 
//获取页面上,导航条到顶部的位置 
var a_navigation_bar = []; 
if(document.getElementsByClassName){//Chrome, FF 
a_navigation_bar = document.getElementsByClassName("navigation"); 
} else {//IE 
a_navigation_bar = my_getElementsByClassName("navigation"); 
} 
//获取offsetTop 
naviga_offsetTop = a_navigation_bar[0].offsetTop; 
a_navigation_bar[0].style.left = naviga_offsetLeft + "px"; 
//给滚动条以及鼠标加上滚动事件 
if( window.attachEvent) //IE 
{ 
window.attachEvent("onmousewheel", naviga_stay_top); 
window.attachEvent("onscroll", naviga_stay_top); 
document.attachEvent("onmousewheel", naviga_stay_top); 
document.attachEvent("onscroll", naviga_stay_top); 
} else {//Chrome ,FF 
window.addEventListener("mousewheel", naviga_stay_top,false); 
window.addEventListener("scroll", naviga_stay_top,false); 
document.addEventListener("mousewheel", naviga_stay_top,false); 
document.addEventListener("scroll", naviga_stay_top,false); 
} 
}

在这个问题中,理解CSS+DIV定位(relative,absolute,static,fixed)的区别很重要。

relative,absolute,static,fixed

先看下各个属性值的定义:

1、static:默认值。没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明)。

2、relative:生成相对定位的元素,通过top,bottom,left,right的设置相对于其正常位置进行定位。可通过z-index进行层次分级。

3、absolute:生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。可通过z-index进行层次分级。

4、fixed:生成绝对定位的元素,相对于浏览器窗口进行定位。元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。可通过z-index进行层次分级。

static与fixed的定位方式较好理解,在此不做分析。下面对应用的较多的relative和absolute进行分析:

1、relative。定位为relative的元素脱离正常的文本流中,但其在文本流中的位置依然存在。如图1:
JS 实现导航栏悬停效果(续)
图1
黄色背景的层定位为relative,红色边框区域为其在正常流中的位置。在通过top、left对其定位后,从灰色背景层的位置可以看出其正常位置依然存在。

2、absolute。定位为absolute的层脱离正常文本流,但与relative的区别是其在正常流中的位置不在存在。如图2:
JS 实现导航栏悬停效果(续)
图2
可以看到,在将黄色背景层定位为absolute后,灰色背景层自动补上。

3、relative与absolute的主要区别:

首先,是上面已经提到过的在正常流中的位置存在与否。

其次,relative定位的层总是相对于其最近的父元素,无论其父元素是何种定位方式。如图3:
JS 实现导航栏悬停效果(续)
图3
图中,红色背景层为relative定位,其直接父元素绿色背景层为默认的static定位。红色背景层的位置为相对绿色背景层top、left个20元素。而如果红色背景层定位为absolute,则情形如图4:
JS 实现导航栏悬停效果(续)
图4
可以看到,红色背景层依然定义top:20px;left:20px;但其相对的元素变为定位方式为absolute或relative的黄色背景层。因此,对于absolute定位的层总是相对于其最近的定义为absolute或relative的父层,而这个父层并不一定是其直接父层。如果其父层中都未定义absolute或relative,则其将相对body进行定位,如图5:
JS 实现导航栏悬停效果(续)
图5
除top、left、right、bottom定位外,margin属性值的定义也符合上述规则。

Javascript 相关文章推荐
JS中剪贴板兼容性、判断复制成功或失败
Mar 09 Javascript
jQuery中detach()方法用法实例
Dec 25 Javascript
JQuery fileupload插件实现文件上传功能
Mar 18 Javascript
jQuery 调用WebService 实例讲解
Jun 28 Javascript
jquery根据一个值来选中select下的option实例代码
Aug 29 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
Nov 21 Javascript
vue.js实例todoList项目
Jul 07 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
Aug 31 Javascript
原生JS实现随机点名项目的实例代码
Apr 30 Javascript
微信小程序上传图片到php服务器的方法
May 23 Javascript
Vue解析剪切板图片并实现发送功能
Feb 04 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
Feb 27 Javascript
CSS+jQuery实现的一个放大缩小动画效果
Sep 24 #Javascript
JavaScript中访问节点对象的方法有哪些如何使用
Sep 24 #Javascript
基于jquery实现的省市区级联无ajax
Sep 24 #Javascript
JS.elementGetStyle(element, style)应用示例
Sep 24 #Javascript
jquery $.each()使用探讨
Sep 23 #Javascript
jQuery ajax dataType值为text json探索分享
Sep 23 #Javascript
jQuery实现类似滑动门切换效果的层切换
Sep 23 #Javascript
You might like
php+ajax实现仿百度查询下拉内容功能示例
2017/10/20 PHP
php curl批处理实现可控并发异步操作示例
2018/05/09 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
自动更新作用
2006/10/08 Javascript
javascript 写类方式之十
2009/07/05 Javascript
JSON传递bool类型数据的处理方式介绍
2013/09/18 Javascript
jsonp原理及使用
2013/10/28 Javascript
javascript自定义函数参数传递为字符串格式
2014/07/29 Javascript
js数组去重的5种算法实现
2015/11/04 Javascript
jquery实现倒计时效果
2015/12/14 Javascript
javaScript如何跳出多重循环break、continue
2016/09/01 Javascript
bootstrap datetimepicker日期插件使用方法
2017/01/13 Javascript
详解基于webpack搭建react运行环境
2017/06/01 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
详解tween.js 中文使用指南
2018/01/05 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
2018/09/18 Javascript
iview在vue-cli3如何按需加载的方法
2018/10/31 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
用Python生成器实现微线程编程的教程
2015/04/13 Python
Python中用于检查英文字母大写的isupper()方法
2015/05/19 Python
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
python爬取亚马逊书籍信息代码分享
2017/12/09 Python
使用python读取csv文件快速插入数据库的实例
2018/06/21 Python
python爬虫之自动登录与验证码识别
2020/06/15 Python
python实现获取单向链表倒数第k个结点的值示例
2019/10/24 Python
基于Django统计博客文章阅读量
2019/10/29 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
opencv 形态学变换(开运算,闭运算,梯度运算)
2020/07/07 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
HTML5中判断用户是否正在浏览页面的方法
2014/05/03 HTML / CSS
尼克松手表官网:Nixon手表
2019/03/17 全球购物
Why do we need Unit test
2013/01/03 面试题
2014年教育实习工作总结
2014/11/22 职场文书
少先队工作总结2015
2015/05/13 职场文书
追悼会答谢词范文
2015/09/29 职场文书