z-index属性在web开发中会经常使用,其主要的作用简单的说就是把元素的position设置为absolute、fixed之后,可以调节元素在文档上的层级关系。比如经常见到的dialog,mask的实现,dialog的z-index肯定要设置的比mask大。写这篇文章的目的主要是想记录下遇到的有关z-index可设置的最大值的问题。下面先来看以下代码运行的结果:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>css z-index属性在主流浏览器中临界值</title>
<style type="text/css">
html, body, fieldset {
margin: 0;
padding: 0;
}
body {
font:12px/1.5 'Lucida Grande',tahoma,arial,\5b8b\4f53;
*line-height:1.5;
}
.header {
margin: 20px;
}
.header h3 {
width: 380px;
}
.page {
margin: 0 10px;
}
.zIndex-wrapper {
margin: 10px;
}
.zIndex-normal {
color: #999;
}
.zIndex-warning {
color: #ff0000;
}
#J_zIndex {
margin-left: 8px;
}
.zIndex-browser {
margin: 15px 0;
}
.zIndex-browser .browser {
margin-left: 8px;
}
.zIndex-startValue {
margin: 15px 0;
}
.zIndex-startValue input {
margin-left: 8px;
}
.zIndex-buttons-wrapper {
width: 450px;
margin-bottom: 10px;
display: block;
}
.zIndex-buttons-wrapper legend {
overflow: hidden;
white-space: nowrap;
width: 430px;
cursor: default;
}
.zIndex-buttons-wrapper .zIndex-legend {
width: 190px;
}
.zIndex-buttons {
margin: 10px;
}
</style>
<script type="text/javascript" src="http://l.tbcdn.cn/??s/kissy/1.3.0/seed.js"></script>
</head>
<body>
<div class="header">
<h3>css z-index属性使用过程中遇到的问题</h3>
</div>
<div class="page">
<div class="zIndex-wrapper">
<div class="zIndex-browser">
浏览器:
<span id="J_browser" class="browser"></span>
</div>
<div class="zIndex-startValue">
<label for="startValue">开始值:</label>
<input type="text" id="J_startValue" name="startValue" />
</div>
z-index:
<span class="zIndex-normal" id="J_zIndex"></span>
</div>
<div id="J_mask" class="tm-mask"></div>
<fieldset class="zIndex-buttons-wrapper">
<legend title="通过window.getComputedStyle(elem, null).getPropertyValue(prop)获取元素z-index属性">通过window.getComputedStyle(elem, null).getPropertyValue(prop)获取元素z-index属性</legend>
<div class="zIndex-buttons">
<button class="button" data-set="ByLink" data-get="ByComputedStyle">通过样式表设置z-index</button>
<button class="button" data-set="ByStyle" data-get="ByComputedStyle">通过style设置z-index</button>
</div>
</fieldset>
<fieldset class="zIndex-buttons-wrapper">
<legend class="zIndex-legend">通过elem.style获取元素z-index属性</legend>
<div class="zIndex-buttons">
<button class="button" data-set="ByStyle" data-get="ByStyle">通过style设置z-index</button>
</div>
</fieldset>
</div>
<script>
KISSY.use(['dom', 'event', 'ua'], function(S, DOM, Event, UA) {
var zIndex = {
init: function() {
this.initView();
this.getBrowser();
this.regEvent();
},
initView: function() {
DOM.val('#J_startValue', this.start);
},
regEvent: function() {
var that = this,
target;

Event.on('.button', 'click', function(ev) {
target = ev.target;
that.start = DOM.val('#J_startValue');
DOM.text('#J_zIndex', '');
DOM.removeClass('#J_zIndex', 'zIndex-warning');

clearInterval(that.interval);
that.interval = setInterval(function() {
that['get' + target.getAttribute('data-get')](that['set' + target.getAttribute('data-set')]);
}, 100);
});

//blur事件处理函数重置start值
Event.on('#J_startValue', 'blur', function() {
that.start = this.value;
});
},
getBrowser: function() {
DOM.text('#J_browser', UA.shell + UA[UA.shell]);
},
//获取临界值
get: function(value, set) {
//科学计数法表示的z-index值
if(/^([0-9]+[.]?[0-9]*|[0-9]*[.][0-9]+)[eE][+-]?[0-9]+$/.test(value) || value >= this.max) {
DOM.removeClass('#J_zIndex', 'zIndex-normal');
DOM.addClass('#J_zIndex', 'zIndex-warning');
//显示z-index临界值
DOM.text('#J_zIndex', this.start);

clearInterval(this.interval);
//清除使用过的style标签和元素style属性
this.clear();
}else{
DOM.text('#J_zIndex', this.start++);
set(this.start);
}
},
getByComputedStyle: function(set) {
this.get(DOM.css('#J_mask', 'z-index'), set);
},
getByStyle: function(set) {
this.get(DOM.get('#J_mask').style.zIndex, set);
},
setByLink: function(value) {
//移除上次设置的style
DOM.remove('.zIndex-style');
//设置新的z-index值
DOM.append(DOM.create('<style class="zIndex-style">.tm-mask {z-index: ' + value + '}</style>'), 'head');
},
setByStyle: function(value) {
var mask = DOM.get('#J_mask');

if(!DOM.attr(mask, 'data-zIndex')) {
DOM.attr(mask, 'data-zIndex', mask.style.zIndex);
}
DOM.css('#J_mask', 'z-index', value);
},
clear: function() {
var mask = DOM.get('#J_mask');

DOM.remove('.zIndex-style');
mask.style.zIndex = DOM.attr(mask, 'data-zIndex');
},
//z-index开始值
start: 9999900,
//firefox下通过elem.style.zIndex = '';方式设置z-index
//能设置的最大值是2147483647
max: 2147483647,
interval: 0
};

//run
zIndex.init();
});
</script>
</body>
</html>

  这个demo的目的是查找z-index在各主流浏览器里面可以设置的临界值(最大值),首先要说下为什么会有临界值。在平时的开发过程中曾经遇到过这样的情况,比如有A、B两个元素,B元素要显示到A元素上面,也就是说B元素的z-index要比A元素的大,这个时候如果A元素本身的z-index值也很大,而我想通过先获取A元素的z-index之后通过parseInt方法把得到到的z-index转化成整数然后拿这个值+1,但是却遇到了一个问题,通过parseInt转化后得到值很小,这到底是怎么回事呢?通过调试发现,是因为firefox把很大的z-index值通过科学计数法来表示了。这样通过parseInt转化后得到很小的值也就很容易理解了,比如parseInt("1e+7", 10)得到结果是1。

  给元素设置z-index有两种方式,一种是通过样式表给元素设置z-index,另外一种是通过元素的style属性设置,这个demo中提供了两种方式设置以及两种方式的获取来检测每种设置方法可以设置的临界值。

结论:通过检测发现ie6-9,chrome没有本文讨论的临界值问题,只有firefox有这个问题,所以在使用z-index时候还是要稍稍注意下的。前面说了设置&获取z-index都有两种方式,那么两种获取方式是否有区别呢?经过测试发现确实有区别,如果通过window.getComputedStyle(elem, null).getPropertyValue('z-index')方式获取,元素可设置的z-index临界值是9999995。如果通过elem.style.zIndex方法获取的话元素可以设置的z-index临界值是2147483647。

  这个demo中使用了kissy seed模块,用到的是功能有获取dom元素、获取(设置)样式表里面的z-index属性,style里面的z-index属性和获取浏览器类型和版本号。当然这里可以用原生js或者jQuery框架来实现。kissy和jQuery的css方法内部实现原理一样,主要是通过window.getComputedStyle(elem, null).getPropertyValue(prop)实现的,这种方法会优先获取元素style里面的z-index,如果style里面没有设置z-index则去获取样式表里面对元素设置的z-index。

css z-index属性使用过程中遇到的问题的更多相关文章

  1. 利用CSS的@font-face属性 在网页中嵌入字体

    字体使用是网页设计中不可或缺的一部分.网页是文字的载体,我们希望在网页中使用某一特定字体,但是该字体并非主流操作系统的内置字体,这样用户在浏览页面的时候就有可能看不到真实的设计. 美工设计师最常做的办 ...

  2. 利用DIV+CSS制作网页过程中常用的基本概念及标签使

    CSS主要用于对HTML文件功能的补充及扩展,其作用就是对HTML文件中各种排版进行设置,达到对网页中字体.颜色.背景.图片等的控制,使网页能够完全依照设计者的想法来显示. CSS可以控制网页的显示, ...

  3. 利用DIV+CSS制作网页过程中常用的基本概念及标签使用细节

    CSS主要用于对HTML文件功能的补充及扩展,其作用就是对HTML文件中各种排版进行设置,达到对网页中字体.颜色.背景.图片等的控制,使网页能够完全依照设计者的想法来显示. CSS可以控制网页的显示, ...

  4. CSS 在IE6, IE7 和IE8中的差别////////////////z

    CSS 在IE6, IE7 和IE8中的差别 关于浏览器的最离奇的统计结果之一就是Internet Explorer 版本6,7和8共存.截至本文,Internet Explorer各个版本总共占据了 ...

  5. html/css 盒子布局 Margin 、Padding 、border 以及 清除浮动的知识 (学习HTML过程中的小记录)

    html/css  盒子布局 Margin .Padding .border 以及 清除浮动的知识 (学习HTML过程中的小记录) 作者:王可利(Star·星星) width     是"宽 ...

  6. css pre如果同时运用了css的border-radius、 overflow两个属性且标签中内容太多时,外部div滚动条在firefox下滚动时很卡

    pre如果同时运用了css的border-radius. overflow两个属性且标签中内容太多时,外部div滚动条在firefox下滚动时很卡. 解决方法:去掉css中border-radius. ...

  7. Elasticsearch学习之图解Elasticsearch中的_source、_all、store和index属性

    转自 : https://blog.csdn.net/napoay/article/details/62233031 1. 概述 Elasticsearch中有几个关键属性容易混淆,很多人搞不清楚_s ...

  8. git提交过程中遇到的 index.lock 问题导致无法提交的解决方法

    在提交代码的过程中,可能会遇到下面的问题: fatal: Unable to create 'C:/programLists/zzw-q1/.git/index.lock': File exists. ...

  9. 在Spring Bean实例过程中,如何使用反射和递归处理的Bean属性填充?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! <Spring 手撸专栏>目录 [x] 第 1 章:开篇介绍,我要带你撸 Spri ...

随机推荐

  1. java之并发编程:Lock

    这是转的:http://www.cnblogs.com/dolphin0520/p/3923167.html * 在多线程编程里面一个重要的概念是锁定,如果一个资源是多个线程共享的,为了保证数据的完整 ...

  2. C# 使用 fckeditor 上传文件中文名乱码的问题---转

    提到中文乱码,首先肯定是由于编码问题引起的所以就从编码转换入手,尝试了将UTF-8转换为GB2312,但发现无论如何没有办法转成功 看到很多文章说修改配置文件 <globalization re ...

  3. 浅谈Android系统移植、Linux设备驱动

    一.Android系统架构 第一层:Linux内核 包括驱动程序,管理内存.进程.电源等资源的程序 第二层:C/C++代码库 包括Linux的.so文件以及嵌入到APK程序中的NDK代码 第三层:An ...

  4. 1Caesar加密

    Julius Caesar发明的较早的加密术,举个例子: 明文: meet me after the toga party 密文:   PHHW PH DIWHU WKH WRJD SDUWB 其实就 ...

  5. 使用Excel 2007绘制甘特图

    本文将教大家如何使用Excel 2007制作甘特图.Excel并未提供甘特图类型,但还是可以绘制甘特图的,方法就是通过对堆积条形图类型进行自定义,使之显示任务.任务工期和层次结构. 下面的过程可帮助创 ...

  6. Kali安装小问题解决及一些设置

    昨天按照完Kali linux之后,更改了镜像源, 然后运行了 apt-get update && apt-get dist-upgrade 发现要 等大约两个小时才能跟新完毕.. 于 ...

  7. 设置ubuntu 下git 的用户名和邮箱

    设置ubuntu 下git 的用户名和邮箱 摘自  慢慢修远路,上下求索心http://yanshaozhi.iteye.com/blog/386752 虽然我没看怎么明白 但我用第一总方法就设置好了 ...

  8. DeepLearning入门笔记(一),准备工作与注意事项

    本文记录了安装theano.keras.tensorflow以及运行tutorial程序时遇到的一些问题,供后人参考. 实验机器:联想笔记本,i7-6700HQ,GTX960M,16G内存,SSD硬盘 ...

  9. 数据结构与算法分析-AVL树

    1.AVL树是带有平衡条件的二叉查找树. 2.AVL树的每个节点高度最多相差1. 3.AVL树实现的难点在于插入或删除操作.由于插入和删除都有可能破坏AVL树高度最多相差1的特性,所以当特性被破坏时需 ...

  10. C#小小总结(面向对象)

    前言 学c#也有一年的时间了 以前零零散散的记的一些笔记啊 随便之类的 没有写过比较整体一点的总结 所以现在写一个小小的总结 内容 一.面向对象 相信刚开始接触编程的童鞋都被这个概念弄糊涂过,对于刚刚 ...