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 ...
随机推荐
- EasyUI使用JSON保存数据
目前来说,使用JSON保存数据比较方便,前台可以不用Test.aspx 页面,可以直接用Html页面,使用.aspx页面的弊端就不在这里熬述. 具体步骤如下: 1.新建一个Html页面,命名为Test ...
- android原生ExpandableListView
android原生可扩展ExpandableListView就是可以伸缩的listView,一条标题下面有多条内容. 这个list的adapter对的数据要求与普通ListView的数据要求也有一些差 ...
- .net core 学习笔记(4)-ViewComponent
动态菜单,以前用的是Html.Action(url)来获取的,到了 .net core 中忽然发现没有了这个方法,原来在 .net core 中是提供了个 ViewComponent,有点类似以前的用 ...
- vmware 安装 macos
http://jingyan.baidu.com/article/ff411625b9011212e48237b4.html
- 有关attribute和property,以及各自对select中option的影响
这个问题老生常谈,但是直到现在我依旧时常会把它搞混.下面列一些各自的特性. attribute property 设置方法 option.setAttribute('selected', true ...
- C#读取大文本文件
今天偶遇一同事抱怨,sqlserver导出的CSV,明明有1000W条,但用excel打开就只剩100W了,足足消失了90%,所以她怀疑文件是足量的1000W条,是excel捣了鬼.可是文件容量有2G ...
- Three.js typescript definitely typed 文件
最近学习three.js,想用typescript编写代码,去http://definitelytyped.org/找了一圈没有发现three.js的definitely typed文件. 好吧,花了 ...
- 自定义 placeholder 文本颜色
原文 http://zhuyujia.github.io/2016/01/custom-placeholder-text-color.html Css: ::-webkit-input-placeh ...
- SQlServer第一天
SQLserver是个什么东西?相当于一是个货仓,在计算机领域的货仓,学名:数据库. 数据库是个什么东西呢?是指长期存储在计算机内的.有组织.可共享的数据结合.由此可知数据库的三个特点:永久存储.有组 ...
- linux tar 解压文件时指定文件名
linux解压文件时指定文件夹名称 wget -O mysql-5.6.15.tar.gz http://oss.aliyuncs.com/aliyunecs/onekey/mysql/my ...