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/jquery判断浏览器类型的方法小结
May 12 Javascript
javascript基于DOM实现权限选择实例分析
May 14 Javascript
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
May 31 Javascript
Javascript实现从小到大的数组转换成二叉搜索树
Jun 13 Javascript
基于jQuery实现的单行公告活动轮播效果
Aug 23 jQuery
使用vue-resource进行数据交互的实例
Sep 02 Javascript
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
May 09 jQuery
js实现文件上传功能 后台使用MultipartFile
Sep 08 Javascript
解决Vue中引入swiper,在数据渲染的时候,发生不滑动的问题
Sep 27 Javascript
vue项目上传Github预览的实现示例
Nov 06 Javascript
关于自定义Egg.js的请求级别日志详解
Dec 12 Javascript
一小时迅速入门Mybatis之bind与多数据源支持 Java API
Sep 15 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+mysql)
2007/11/23 PHP
php实现统计邮件大小的方法
2013/08/06 PHP
采用thinkphp自带方法生成静态html文件详解
2014/06/13 PHP
PHP两种快速排序算法实例
2015/02/15 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
php的debug相关函数用法示例
2016/07/11 PHP
PHP使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
PHP7数组的底层实现示例
2019/08/25 PHP
JAVASCRIPT HashTable
2007/01/22 Javascript
帮助避免错误的Javascript陷阱清单
2009/05/31 Javascript
Tab页界面 用jQuery及Ajax技术实现(php后台)
2011/10/12 Javascript
XMLHttpRequest Level 2 使用指南
2016/08/26 Javascript
Ajax和Comet技术总结
2017/02/19 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
ES6 Promise对象的含义和基本用法分析
2019/06/14 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
[43:35]EG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[57:31]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第一场 2月1日
2021/03/11 DOTA
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
2019/01/29 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
Scrapy框架基本命令与settings.py设置
2020/02/06 Python
Python列表如何更新值
2020/05/27 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
python中pivot()函数基础知识点
2021/01/03 Python
优衣库英国官网:UNIQLO英国
2016/12/25 全球购物
Debenhams爱尔兰:英国知名的百货公司
2017/01/02 全球购物
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
音乐学个人的自荐书范文
2013/11/26 职场文书
公司接待方案
2014/03/08 职场文书
文明和谐家庭事迹材料
2014/05/18 职场文书
环境保护建议书
2014/08/26 职场文书
酒店财务总监岗位职责
2015/04/03 职场文书
感恩教育主题班会
2015/08/12 职场文书
Python实现仓库管理系统
2022/05/30 Python