深入CSS属性(九):z-index

如果你不是一名csser新手,想必你对z-index的用法应该有个大致的了解了吧,z-index可以控制定位元素在垂直于显示屏方向(Z 轴)上的堆叠顺序,本文不去讲述基本的API如何使用,而是去更深入的了解z-index是如何工作的,使用z-index的时候有哪些问题,以及z-index在日常开发中的使用。 下面我们通过一个例子来引入今天的正文,代码示例:

<style type="text/css">
	.red, .green, .blue {
		position: absolute;
		width: 100px;
		height: 100px;
		text-align: center;
		line-height: 100px;
		color: #fff;
	}
	.red {
		background-color: red;
		z-index: 1;
	}
	.green {
		background-color: green;
		top: 70px;
		left: 70px;
	}
	.blue {
		background-color: blue;
		top: 140px;
		left: 140px;
	}
</style>
<div>
	<span class="red">Red box</span>
</div>
<div>
	<span class="green">Green box</span>
</div>
<div>
	<span class="blue">Blue box</span>
</div>

如下图:

上述代码通俗易懂,下面有个问题请大家思考: 在遵循下述规则的情况下,如何使用红色span元素在green和blue元素后面?

1) 不能以任何方式更改html标记;

2) 不能增加或改变任何元素的z-index属性;

3) 不恩增加或改变任何元素的position属性;

请大家思考,这个问题改如何解决?说明其原因? ----------------------------------- 分割线 ----------------------------------------------

一、z-index 黄金法则及stack context

1) 一个box和它的父亲有相同的堆叠级别(stack level),除非该box被通过z-index属性赋予了不同的stack level;

2) z-index属性只适应于position属性为relative、absolute、fixed的元素对象;

3) 给一个被定位(positioned)元素设置小于1的opacity属性值,意味着创建了一个堆叠上下文(stack context),就像给该元素增加了一个z-index值;

4) 对于一个被positioned box,如果指定了z-index属性,意味着:

->该box的stack level 在当前的stack context中;

->该box建立了个本地stack context;

5) 如果box没有指定z-index,元素将被按下面的顺序堆叠(stacked)(从后到前):

-> 正常流中的boxes,根据在源代码中的序列;

-> 浮动boxes;

-> computed后display属性值为inline/inline-block/inline-table的boxes;

-> positioned boxes 和boxes 设置opacity值小于1,根据在源代码中的序列;

因此,当我们给一个positioned元素设置了z-index时,我们做了两件事:

1) 该元素与在它前面或者后面的元素共享着相同的stack context,这也就是我们改变z-index的值,元素会移动其他元素前后者后的原因。

2) 为该元素内的任何元素创建了一个新的stack context,一旦你创建了一个stack context,内部的任何有(stack context)的任何层都会停留在这个stack context。 通过上述的黄金法则,也许你已经知道上面那个问题的答案了。在黄金法则里,我们提到了个新名词“stack context”,下面我们通过一个实例来介绍它:

<!DOCTYPE html>
<html>
<html lang="en">
<head>
	<meta charset="utf-8">
	<title>z-index example</title>
</head>
<body>
<h1>Header</h1>
<p>I am paragraph. <em> I am em</em></p>
</body>
</html>

一个很特殊的情况是,在一个document中,没有任何定位,document有且只有一个堆叠环境 - 通过HTML创建。 下面我们给上例添加如下样式:

		h1, p {
			position: relative;
		}
		h1 {
			z-index: 2;
		}
		p {
			z-index: 1;
		}

在这种情况下,h1,p都创建了一个stack context,这两个stack context都在document的stack context内。增加样式后h1在p元素之上。如果我们给em元素增加如下样式结果又会怎样:

		h1, p, em {
			position: relative;
		}
		h1 {
			z-index: 2;
			background-color: #f0f;
		}
		p {
			z-index: 1;
			background-color: #00f;
			line-height: 40px;
		}
		em {
			z-index: 1;
			background-color: #f00;
		}

增加此样式后em创建了stack context,由于em的z-index属性,它的内部的text比p标签中的其它text更接近用户。因为它是在p的stack context内部,它是一直比h1中的text低的。 注意:如果你增加z-index的值,是不能使用em位于h1之上的。如果你想一个context的元素位于另一个context中的元素之上,你必须提升整个context或者设置它们为相同的context。 下面是两种解决方案: 方案一:

		h1, p, em {
			position: relative;
		}
		h1 {
			z-index: 2;
			background-color: #f0f;
		}
		p {
			/* raise the entire context,p and em 都在h1 之上了*/
			z-index: 3;
			background-color: #00f;
			line-height: 40px;
			margin-top: -40px;
		}
		em {
			z-index: 1;
			background-color: #f00;
		}

方案二:

		h1, p, em {
			position: relative;
		}
		h1 {
			z-index: 2;
			background-color: #f0f;
		}
		p {
			background-color: #00f;
			line-height: 40px;
			margin-top: -40px;
		}
		em {
			/*  put them into the same context */
			z-index: 2;
			background-color: #f00;
		}

二、创建stack context及注意事项

那么创建stack context的方式有哪些?

1) When an element is the root element of a document (theelement)

2) When an element has a position value other than static and a z-index value other than auto

3) When an element has an opacity value less than 1

Update: In addition to opacity, several newer CSS properties also create stacking contexts. These include: transforms, filters, css-regions, paged media, and possibly others. As a general rule, it seems that if a CSS property requires rendering in an offscreen context, it must create a new stacking context.

In WebKit, styling a box with position:fixed or -webkit-overflow-scrolling:touch implicitly creates a stacking context, just like adding a z-index value.

Also, be aware of these CSS3 “triggers”:

transform != none

transform-style: preserve-3d

filter != none clip-path, mask

Lastly, even though a relatively positioned element without a z-index set does not establish a stacking context… A common IE bug, often seen in drop-down menus, is that any relatively positioned element that has haslayout set to true establishes a stacking context. One may visualize this bug by setting [A] and [B] to position:relative, while [a] gets position:relative; z-index:1. Now, dragging [A] under [B] hides [a] - in Internet Explorer, that is. Any positioned child with a z-index is caught by this wrong stacking context of its parent.

三、z-index在某些浏览器中的问题

1) IE6中的 select元素是一个窗口控件,所以它总是出现在层叠顺序的顶部而不会顾及到自然层叠顺序、position属性或者是z-index。可以在div元素上添加一个iframe设置为position:absolute,并设置div的z-index比iframe的高。

2) 因父容器(元素)被定位的缘故,IE6/7会错误的对其stacking context进行重置。

3) 在Firefox2版本中,一个负的z-index值会使元素位于stacking context的后面,而不是位于公认的背景和边框这样的元素stacking context之前。 本文到此结束,最后附上本文开始时提出的问题的答案:

/* add this */
div:first-child {
opacity: .99;
}

感谢您的阅读,文中不妥之处,还望批评指正。

四、参考链接:

Find out how elements stack and start using low z-index values

The Z-Index CSS Property: A Comprehensive Look

Elaborate description of Stacking Contexts

Overlapping And ZIndex

CSS/Properties/z-index

Understanding CSS z-index(MDN)

What No One Told You About Z-Index

测试Demo:

原载于: Benjamin 
本文链接: http://www.zuojj.com/archives/904.html 
如需转载请以链接形式注明原载或原文地址。

时间: 2024-10-19 05:10:52

深入CSS属性(九):z-index的相关文章

css属性大全

SS 属性大全文字属性「字体族科」(font-family),设定时,需考虑浏览器中有无该字体.「字体大小」(font-size),注意度量单位.<绝对大小>|<相对大小>|<长度>|<百分比>(一般设置双数)「字体加粗」(font-weight),除了 normal(正常).bold(粗体).bolder(特粗).lighter(细体)外,还有9种以像素为度量为单位的设置方式(100,200,300,400,500,600,700,800,900).「字体

28 May 18 CSS属性

28 May 18 一.今日面试题 # 去重并保持原来的顺序 # 方法一 l1 = [11, 2, 3, 22, 2, 4, 11, 3] l2 = [] for i in l1: if i not in l2: l2.append(i) print(l2) print("=" * 120) # 方法二 l3 = list(set(l1))  # 将列表用set去重,再转换回列表(没有按照之前的顺序) l3.sort(key=l1.index) # 将上一步得到的列表排序,按照l1中的

CSS 属性大全

1. 文字属性 「字体族科」(font-family),设定时,需考虑浏览器中有无该字体.  「字体大小」(font-size),注意度量单位.<绝对大小>|<相对大小>|<长度>|<百分比>(一般设置双数)  「字体加粗」(font-weight),除了 normal(正常).bold(粗体).bolder(特粗).lighter(细体)外,还有9种以像素为度量为单位的设置方式(100,200,300,400,500,600,700,800,900). 

CSS属性(常用的属性)

CSS属性(常用的属性)http://www.w3school.com.cn/cssref/index.asp 一:文本与字体属性 1.字体属性 (1):font-size:字体的大小(例如:font-size:14px)(em当前对象内文本字体大小 pt绝对长度单位(多少个点的单位)px相对长度单位(像素)) (2):font-family:字体的类型(例如:font-family:"隶书","宋体",Arial,"Times New Roman&quo

CSS属性 table 的 border-collapse 边框合并

说明 该CSS属性用来设定表格的行和列的边框是合并成单边框,还是分别有各自的边框 separate 缺省值.边框分开,不合并.collapse 边框合并.即如果相邻,则共用同一个边框. 虽然在DIV+CSS 时代 table 的权重越来越低,但是有时候,还是局部地方table 还是挺好用的 特别是制表方面,还是table 比较的方便.当然,制表肯定少不了边框,但是如果你直接在td上加边框,就会出现一种情况,table 的外围一周是单线,里面都是双线. 你也可以通过其他分开设置的方法实现全部单线,

background-size CSS属性[刚刚看到,分享给大家]

如果问是什么让所有男人都生活中恐惧中,回答是不确定.没有人表露,但好奇会害死猫.十个女人中会有九个同意这点.广告商想尽办法让我们觉得不足够,但会告诉我们还可以改进.没错,先生们-.size很重要. 我说的是background-size.CSS里的background-size属性能够让程序员决定如何在指定的元素里展示.MooTools程序员Christoph Pojer在他的网站上运用了background-size技术,使得在浏览器上他的头像始终"全面覆盖"在页头上--甚至是在手机

常用的CSS属性的英文单词总结及用法、解释

在div css制作中常用的CSS属性的英文单词介绍.解释与css样式用法总结.这些单词无需一定要记住会拼写,但是要求看见他们就能认识他们并知道他们的属性及用法,这里有个记住他们属性的技巧就是多制作和手写div+css推荐用Dreamweaver(DW)因为此工具在写CSS和html的代码时候会自动弹出用到的CSS代码,多用多看就能记住他们的用法及属性.(如果您的记忆力好能记住也好不影响) 一.(盒子)布局排版类   -   TOP float浮动:设置块元素的浮动效果.可选常用到参数left.

css 属性选择器笔记

1.基本选择器: eg: *{margin:0;padding:0} p{color:black} .content{background:red;} #intro{padding-left:2em;} 2.多元素组合选择器 div p { color:#f00; } #nav li { display:inline; } #nav a { font-weight:bold; } div > strong { color:#f00; } h2 + p { color:#f00; } 三.CSS

Mozilla推荐的CSS属性书写顺序及命名规则

传说中的Mozilla推荐 Java代码   /* mozilla.org Base Styles * maintained by fantasai */ /* Suggested order: * display * list-style * position * float * clear * width * height * margin * padding * border * background * color * font * text-decoration * text-alig