Archive

Posts Tagged ‘position’

在ie6下实现position-fixed的效果

5月 27th, 2009

[参与测试的浏览器:IE6 / IE7 / IE8 / FF3 / OP9.6 / SF3 / Chrome2 ]
[操作系统:Windows]

我喜欢position:fixed,它很酷。
但ie6总不支持它,所以用其他的属性来模拟(这个模拟在主流浏览器中都兼容,所以其他浏览器也不需要分开写position:fixed了)。
看效果先:

提示:你可以先修改部分代码再运行。

这是基于这种方法做的对联效果:

提示:你可以先修改部分代码再运行。

原理如下:

提示:你可以先修改部分代码再运行。

把框框的高宽都扩大到100%,然后将雷打不动的文字定个位就行了。

Chomo xhtml+css ,

div仿框架方法详解

4月 23rd, 2009

[参与测试的浏览器:IE6 / IE7 / IE8 / FF3 / OP9.6 / SF3 / Chrome2 ]
[操作系统:Windows]

问这样的问题的人很多,我对此有比较深入的研究,但自己从来没有给出过完整的解答与分析,觉得有些对不住样式界的列祖列宗。

先请看demo:

提示:你可以先修改部分代码再运行。

通过css的结构大家应该不难看出,这里采用了ie6最基本的hack来区分ie6与其他浏览器来实现这个效果。

那么本教程也将分而述之。

撇开ie6,我们看这个demo:

提示:你可以先修改部分代码再运行。

大家看到,此时div的实际高宽,完全由left / right / top / bottom这四个属性所掌控着,于是我们便可以借助这个特性,轻松地完成div仿框架的效果了:

提示:你可以先修改部分代码再运行。

让我们将应该有滚动条的地方的滚动条效果折腾出来:

提示:你可以先修改部分代码再运行。

以上方法其实早已由wiseinfo在Html+CSS 构建 B/S结构软件界面 — 布局篇 — position方式中进行过介绍,在该文中,ie6亦是分而治之的,它的方法是在html代码顶部加入“<?xml version=”1.0″ encoding=”UTF-8″?>”,使得ie6进入quirks mode(怪异模式)来完成ie6下的div仿框架,但这样做将出现一些影响比较显著的弊端:

1. quirks mode下的ie6连盒模型都变了,就是说你在页面中写任何内容就要慎用padding和border,况且quirks mode下的变化还不止这一点。
2. 如果底部使用绝对定位,则会发生“绝对定位基对象(在此为body)高度为偶数时,出现1px空隙”的bug。

提示:你可以先修改部分代码再运行。

于是我们需要另辟蹊径。

在很多次失败之后,我终于发现有一个标签可以救ie6于水深火热,那就是最伟大的“<html>”标签,它继承了ie6 quirks mode(怪异模式)下的盒模型状态。

提示:你可以先修改部分代码再运行。

利用这一点,我们可以在不太轻松的调整之后完成以下效果:

提示:你可以先修改部分代码再运行。

再用下我们的二列布局知识来完成最终形态,在此我们将艳遇著名的3px bug:

提示:你可以先修改部分代码再运行。

现在我们拥有了ie6的仿框架和非ie6的div仿框架的最终形态,只需要利用hack做个简单的加法则行了:
(当然,同一属性写两遍,后面的属性所对应的值将覆盖前者,这个基础的优先级基础大家还需要温故一下。)
(再“当然”一下——当然,有人对hack深恶痛绝,那么请在使用之前,阅读此文看看是否能消消心头之恨。)

提示:你可以先修改部分代码再运行。

它很强大而实用,真的:

提示:你可以先修改部分代码再运行。


以下是09-05-09的补充

但在实际应用中主体部分常常是个iframe,加个iframe,IE7则无法适应。T_T

提示:你可以先修改部分代码再运行。

而且……其实IE7下还不止这一点bug(虽然可以直接overflow-y:scroll,但我于心不忍)。

提示:你可以先修改部分代码再运行。

所幸IE7和IE6的html标签有着相同的盒模型,所以可以直接将IE6 only的部分修改为IE6+IE7 only。

提示:你可以先修改部分代码再运行。

iframe无法适应高度的bug也一起被修复了,人生真美好。

提示:你可以先修改部分代码再运行。

续集完,谢谢观赏。


以下是09-05-24的补充,在KentXD的细心测试下,该方案在ie6下又出现了惊喜:

当bottom部分存在文字的时候,从bottom部分跨越至main部分一直选定,当选定状态仍保持的时候,最大化 / 还原窗口,页面整体向上移动了n个像素,貌似*padding:70px 0;失去了作用。

提示:你可以先修改部分代码再运行。

^-^ 好在改变position的属性为absolute之后,该bug顺利修复:

提示:你可以先修改部分代码再运行。

又一篇续集结束,谢谢Kent

Chomo xhtml+css , ,

图标组中鼠标经过图标显示详细信息

4月 17th, 2009

[参与测试的浏览器:IE6 / IE7 / IE8 / FF3 / OP9.6 / SF3 / Chrome2 ]
[操作系统:Windows]

一个电影图标(我觉得叫“海报缩图”不动听),鼠标滑过时显示它的名称和简介,这样的效果做起来很容易,稍稍利用:hover伪类便可实现。

提示:你可以先修改部分代码再运行。

然而这样的图标通常是成组出现的,于是就出现了一个问题:当鼠标滑过时,显示出来的详细信息将遮住其他的图标,从而使得“:hover”无法顺利触发。

提示:你可以先修改部分代码再运行。

要解决这个问题,关键在于如何使得现在被遮住的这个<a>也能触发:hover。
=> 被遮住的<a>能触发:hover吗?不能!
=> 那么现在问题转化为:如何使得现在被遮住的这个<a>不被遮住。
=> 事实上:<a>的一个子元素不被遮住即可。
=> 加一个透明的子元素便能实现了。

思路图(3D的也,透视的也,我真牛 ^-^):

提示:你可以先修改部分代码再运行。

(编者按:炫不炫?好炫!——鼓掌。)

这是一个比较复杂的效果,在兼容性上还是存在一些问题,所以需要作情处理,其细节请参见demo中样式表的注释。
该效果的产生离不开对“层的叠加”的理解,如对此有疑问,请参阅我的相关文章:理解五条叠加法则,自由使用层的叠加

Chomo xhtml+css , ,

理解五条叠加法则,自由使用层的叠加

4月 16th, 2009

[参与测试的浏览器:IE6 / IE7 / IE8 / FF3 / OP9.6 / SF3 / Chrome2 ]
[操作系统:Windows]

貌似很多同学对为什么这个div在上层,那个div在下层、无论如何设置z-index都无法居上的问题纠结抓狂、上吐下泻、恶心失眠、郁郁而终,致使不敢随意使用层的叠加。
但层的叠加效果,在交互设计中却频频出现,所以我们必须驾驭它,要驾驭它,就要掌握其规律。

首先明确几点在文中所需要用到的概念:

  1. 静态定位:position:static(为position属性的默认值)。
  2. 动态定位:position:relative或position:absolute或position:fixed。
  3. 祖元素:任意包含该元素的元素。
  4. 父元素:直接包含该元素的祖元素。
  5. 同辈元素:拥有共同的父元素的元素。

【注】这些概念为作者自定义,仅用于本文。

关于同辈元素是个非常关键的词,这里还需要详细解释一下。

  1. <div>
  2.       <div></div>
  3.       <div id="a"></div>
  4.       <div></div>
  5.       <div></div>
  6.       <div></div>
  7.       <div></div>
  8. </div>
  9. <div id="f">
  10.       <div></div>
  11.       <div id="b"></div>
  12.       <div id="c"></div>
  13.       <div></div>
  14.       <div></div>
  15.       <div></div>
  16. </div>

在这个例子中,div#a与div#b并不是“同辈元素”,只有像div#b和div#c这样拥有同样父体div#f的的元素才能叫“同辈元素”。

接下来看看这五条法则:

法则一:同辈元素定位方式相同,且无z-index设置时,html靠后者居上。

提示:你可以先修改部分代码再运行。

法则二:同辈元素同为动态定位时,且有z-index设置时,z-index值大者居上。

提示:你可以先修改部分代码再运行。

法则三:同辈元素定位方式不同时,动态定位居上。

提示:你可以先修改部分代码再运行。

法则四:非同辈元素,任意一者及其祖元素不具备动态布局时,html靠后者居上。

提示:你可以先修改部分代码再运行。

法则五:【重要】:非同辈元素,任意一者或其祖元素拥有动态定位时,各自向上寻找动态定位的祖元素至它们共有的祖元素的下一级为止,并分别从中拿出具备最高级别的祖元素(或其本身)进行比较。

情况1:子元素的z-index无论多大,父元素大者居上。

情况2:父元素居下,子元素也可以居上。

情况1、情况2结合扩展比较。

提示:你可以先修改部分代码再运行。

其实前四点都是基础,只有第五点比较难于理解,这里详细解释一下:

  1. <div id="ab" style="position:absolute;">
  2.       <div id="a" style="position:relative; z-index:100;">
  3.             <div id="a_inner1">
  4.                   <div id="a_inner2">
  5.                         <div id="a_inner3" style="position:relative; z-index:98;">
  6.                               <div id="a_inner4">
  7.                                     <div id="a_inner5">
  8.                                     </div>
  9.                               </div>
  10.                         </div>
  11.                   </div>
  12.             </div>
  13.       </div>
  14.       <div id="b">
  15.             <div id="b_inner1">
  16.                   <div id="b_inner2">
  17.                         <div id="b_inner3" style="position:relative; z-index:99;">
  18.                               <div id="b_inner4">
  19.                               </div>
  20.                         </div>
  21.                   </div>
  22.             </div>
  23.       </div>
  24. </div>

在这个例子中,我们来比较div#a_inner5和div#b_inner4的层叠关系。
到它们所共同拥有的祖元素div#ab的下一级为止,div#a_inner5的祖元素包括:div#a,div#a_inner1,div#a_inner2,div#a_inner3,div#a_inner4;div#b_inner4的祖元素包括:div#b,div#b_inner1,div#b_inner2,div#b_inner3。
然后分析它们的祖元素中具有动态定位的:div#a_inner5的祖元素中含有动态定位的元素有:div#a,div#a_inner3;div#b_inner4的祖元素中含有动态定位的元素有:div#b_inner3。
然后再拿出最高级进行比较:div#a > #div#b_inner3。

父元素居下,子元素也可以居上的情况,则是利用非同辈元素在祖元素具备动态布局时,其比较已经与position:static无关,而其祖元素却可以通过html的位置来进行比较。

当然,有时候还存在特例,比如flash、比如ie6中的select无法遮住,这些都属于异常情况,大家可以自己搜索一下相关文章(最好到我滴博客搜,顺便点击哈广告什么的)。

Chomo xhtml+css , ,