css z-index属性使用过程中遇到的问题
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属性使用过程中遇到的问题的更多相关文章
- 利用CSS的@font-face属性 在网页中嵌入字体
字体使用是网页设计中不可或缺的一部分.网页是文字的载体,我们希望在网页中使用某一特定字体,但是该字体并非主流操作系统的内置字体,这样用户在浏览页面的时候就有可能看不到真实的设计. 美工设计师最常做的办 ...
- 利用DIV+CSS制作网页过程中常用的基本概念及标签使
CSS主要用于对HTML文件功能的补充及扩展,其作用就是对HTML文件中各种排版进行设置,达到对网页中字体.颜色.背景.图片等的控制,使网页能够完全依照设计者的想法来显示. CSS可以控制网页的显示, ...
- 利用DIV+CSS制作网页过程中常用的基本概念及标签使用细节
CSS主要用于对HTML文件功能的补充及扩展,其作用就是对HTML文件中各种排版进行设置,达到对网页中字体.颜色.背景.图片等的控制,使网页能够完全依照设计者的想法来显示. CSS可以控制网页的显示, ...
- CSS 在IE6, IE7 和IE8中的差别////////////////z
CSS 在IE6, IE7 和IE8中的差别 关于浏览器的最离奇的统计结果之一就是Internet Explorer 版本6,7和8共存.截至本文,Internet Explorer各个版本总共占据了 ...
- html/css 盒子布局 Margin 、Padding 、border 以及 清除浮动的知识 (学习HTML过程中的小记录)
html/css 盒子布局 Margin .Padding .border 以及 清除浮动的知识 (学习HTML过程中的小记录) 作者:王可利(Star·星星) width 是"宽 ...
- css pre如果同时运用了css的border-radius、 overflow两个属性且标签中内容太多时,外部div滚动条在firefox下滚动时很卡
pre如果同时运用了css的border-radius. overflow两个属性且标签中内容太多时,外部div滚动条在firefox下滚动时很卡. 解决方法:去掉css中border-radius. ...
- Elasticsearch学习之图解Elasticsearch中的_source、_all、store和index属性
转自 : https://blog.csdn.net/napoay/article/details/62233031 1. 概述 Elasticsearch中有几个关键属性容易混淆,很多人搞不清楚_s ...
- git提交过程中遇到的 index.lock 问题导致无法提交的解决方法
在提交代码的过程中,可能会遇到下面的问题: fatal: Unable to create 'C:/programLists/zzw-q1/.git/index.lock': File exists. ...
- 在Spring Bean实例过程中,如何使用反射和递归处理的Bean属性填充?
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! <Spring 手撸专栏>目录 [x] 第 1 章:开篇介绍,我要带你撸 Spri ...
随机推荐
- Jquery DIV滚动至浏览器顶部后固定不动代码
$(function(){ //获取要定位元素距离浏览器顶部的距离 var navH = $(".win").offset().top; //滚动条事件 $(window).scr ...
- android原生ExpandableListView
android原生可扩展ExpandableListView就是可以伸缩的listView,一条标题下面有多条内容. 这个list的adapter对的数据要求与普通ListView的数据要求也有一些差 ...
- 关于XML文档
很多人觉得XML很简单,但我想说其实一点也不简单,特别是在当今被各种web文档充斥的世界里有必要对XML进行一定程度的研究.下面的几篇博客将对XML技术进行简短的说明.
- 用docker toolBox 搭建 nginx + flask + redis 环境
本篇博客,主要是了解一下docker-compose的使用,docker-compose是官方给出的同时部署多个容器的解决方案:当你需要多个容器同时运行作为你的解决方案时:比如构建一个网站,需要php ...
- job console部署
1. iis配置 1.1 应用程序池配置成经典模式 1.2 增加mini类型.svc,application/octet-stream 1.3 增加脚本映射,*.svc,%windir%\Micros ...
- win7 解决IE浏览器不能打开网页的问题
网络连接和网络映射正常,ping命令正常,但是无法上网. 以管理员身份运行命令行,在弹出的窗口中运行如下命令: netsh winsock reset catalog netsh int ip res ...
- C++ Daily 《6》---- 类静态对象与函数静态对象
C++ 的一个哲学基础是,你不应该为你使用的东西付出代价. class 拥有一个 static 成员,即使从未被用到,它也会被构造和析构: 而 函数拥有一个 static 成员, 如果这个函数从未被调 ...
- 通过git在github上建立gh-pages分支并查看网页效果
建立gh-pages分支: 进入到你想要上传的文件夹下: cd text(text为文件夹名) git初始化 git init 创 ...
- C语言中关于对目录的操作
原文地址:C语言中关于对目录的操作 目录的操作不论是在嵌入式产品还是应用软件编程都是必不可少的,不同的开发语言可能略有不同,笔者主要是讨论在Linux平台下对目录的一系列操作: 1.获取当前目录操作: ...
- Largest Rectangle in Histogram
Given n non-negative integers representing the histogram's bar height where the width of each bar is ...