overflow知多少

本文地址: http://www.hicss.net/some-overflow-knowledge/

最近在研究OOCSS,当打开template.css阅读第一行时,震惊了,第一眼居然没看懂。。。。。。以下就是OOCSS下的template.css第一行代码:


1

2

.body{overflow:hidden; _overflow:visible; _zoom:1;}

.main{overflow:hidden; _overflow:visible; _zoom:1;}

后来分析这段代码,不分析不知道,一分析吓一跳,短短三个属性竟然包含了浮动、浮动清除、Haslayout、IE6兼容性、最小高度不同浏览器下实现、浏览器Hack、overflow的各种用途等等一系列的问题及知识点。废话不多说,且荣我细细道来这行代码的可怕之处!

在分析之前,先补充一下是基本知识,否则等最后分析了半天你听的一头雾水这不是本文想达到的效果。

overflow是什么,有什么用途:

overflow属性规定当内容溢出元素框时发生的事情。——W3shcool

根据CSS的盒模型概念,页面中的每个元素,都是一个矩形的盒子。这些盒子的大小、位置和行为都可以用CSS来控制。对于行为,我的意思是当盒子内外的内容改变的时候,它如何处理。比如,如果你没有设置一个盒子的高度,该盒子的高度将会根据它容纳内容的需要而增长。但是当你给一个盒子指定了一个高度或宽度而里面的内容超出的时候会发生什么?这就是该添加CSS的overflow属性的时候了,它允许你设定该种情况下如何处理。

overflow属性有四个值:visible (默认), hidden, scroll, 和auto。这里我们只分析 overflow:visible和hidden其他俩属性这里不多做展开,有兴趣的读者可以上网查一下另外俩个属性的知识。

知识:overflow:hidden的用途

我们平时最常用到的即overflow:hidden,一般用在固定宽高的div里面,目的是隐藏溢出使内部元素高度即使超过父元素也能够被隐藏。

overflow:hidden另一个流行的用途是用在没有宽高的div里,其目的是清除浮动。应用了overflow(auto或hidden)的元素(默认高度height:auto),将会扩展到它需要的大小以包围它里面的浮动的子元素。这是一个很奇特的特性,因为他的简洁,许多coder都喜欢利用这个特性来清除浮动。

overflow还有一个鲜为人知的特性,那就是可触发IE7的hasLayout,让我们来看看触发hasLayout不完全列表吧:

可触发hasLayout的CSS特性:


1

2

3

4

5

6

7

display: inline-block

height: (除 auto 外任何值)

width: (除 auto 外任何值)

float: (left right)

position: absolute

writing-mode: tb-rl

zoom: (除 normal 外任意值)

IE7可触发hasLayout的CSS 特性:


1

2

3

4

5

6

7

8

min-height: (任意值)

min-width: (任意值)

max-height: (除 none 外任意值)

max-width: (除 none 外任意值)

overflow: (除 visible 外任意值,仅用于块级元素)

overflow-x: (除 visible 外任意值,仅用于块级元素)

overflow-y: (除 visible 外任意值,仅用于块级元素)

position: fixed

对于IE6/7特有的hasLayout特性,开发时需要特别留意,某些重要部件尽量以最小的代价来触发他的hasLayout,使得各个浏览器达到兼容。最小的代价指的是用标准的CSS属性(如with, height, IE7下还能用overflow)来触发hasLayout,避免使用不符合规范的zoom属性,为日后的再次开发打下基础。

知识:如何实现最小高度

最小高度min-height已经被大多浏览器所支持,而且他的实用性也使得他被广泛的使用,但其中唯一的遗憾那就是IE6不支持min-height!所以,为了兼容性,你必须得使IE6也能兼容min-height。所幸的是这并不难实现,IE6在设计之初就有一个问题,他虽有height属性,但是一旦内部元素高度超出父元素,其父元素也会很跟着内部元素一起增高,外部元素高度值会等于内部元素的高度值,所以说IE6下天生就有猥琐的min-height属性,带着height的面具,干着min-height的活,颇有点垂帘听政一感觉。所以遇到实现最小高度的情况我们利用IE6的Hack来实现。


1

2

3

/* IE6利用_height实现min-height */

.wrap{width:100px; min-height:100px; _height:100px; background:#ccf;}

.inner{width:50px; height:150px; background:#cfc}

知识:IE6下的overflow:visible的bug

IE6会扭曲默认的overflow visible值并将水平的扩展一个盒子一匹配内容。 在IE6下(当div有具体height)应用默认的visible是没有一点效果的,因为IE6的高度会自适应(IE6没有min-height,但height就是min-height),子元素增大,父元素也会跟着一起增大,你想让子元素超出父元素,且父元素高度不变,在IE6下是行不通的。举个例子:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>IE6下的overflow:visible的bug</title>

<style>

.wrap{width:100px; height:100px; background:#ccf;}

.inner{width:50px; height:150px; background:#cfc;}

.next{width:100px;}

</style>

</head>

<body>

<div class="wrap">

  <div class="inner"></div>

</div>

<div class="next">标准浏览器下wrap的内部元素不会破坏文档流。而IE6下父元素会被撑开,最终影响到正常的文档流</div>

</body>

</html>

overflow:visible在IE6的表现和别的浏览器的在默认情况下的表现不同,IE6下父元素会被撑开,最终影响到正常的文档流,而其他浏览器下撑出部分不会影响正常的文档输出流,即下面的元素还是按上面元素规定的高度来显示。要达到IE6下拥有真正意义上的overflow:visible效果的话,需要这么做,包裹父元素设置为_overflow:hidden;接着继续设置它的子元素为_position:relative;即可。

回归正题,接下来分析这行代码里面各个属性真正的意义:

1.overflow:hidden写在应用在包裹元素上的.body和.main,其目的是利用其清除浮动的特性而非隐藏内部元素特性。
2.为了兼容性要触发IE6/7的hasLayout。这里运用overflow:hidden的特性以最小的代价在IE7下清除浮动效果同时并触发hasLayout,一举二得。IE6用的是专有Hack和zoom属性(_zoom:1)来触发hasLayout。
3.既然我们使用overflow:hidden是为了清除浮动,所以我们绝对不能让元素有高度属性。而实际工作中,往往要求必要的基本高度来达到合理的布局要求,那么这个时候需要使用最小高度min-height,根据前面的知识我们得知IE6实现最小高度的方法是用height实现,而我们的overflow:hidden为了清除浮动大局观是不允许出现固定高度的,使用了hidden再添加了height,那么overflow的特性则发生转变,变成了隐藏溢出的功能。这里次利用IE6下的overflow:visible的bug,让IE6下的父元素自动撑开,达到了所谓的清除浮动的目的,可以说的上是歪打正着,于是乎,产生了_overflow:visible的写法。

时间: 2025-01-06 12:49:04

overflow知多少的相关文章

HTML、CSS --chrome书签整理

1.http://www.w3cplus.com/blog/104.html CSS三栏布局——中间固定两边自适应宽度 2.http://www.topcss.org/?p=94 负值之美:负值在页面布局中的应用 3.http://blog.csdn.net/ajiao5198/article/details/7216630 阿里巴巴中国站首页改版的经验总结 4.http://bbs.csdn.net/topics/390289195 为什么图片资源放在cdn上面不会出现跨域访问呢?cdn的ip

技术选型总结

1.背景描述,遇到了什么难题 2.遇到问题,然后就要开始寻找解决问题的办法 那么去哪里找到解决方案了? 回复:我常用的几个网站为 博客园 google Stack Overflow 知乎 csdn 2.1 找解决方案(可能会找到多个解决方案) 2.2 各个解决方案对比 2.2.1 优缺点对比分析 2.2.2 上手难易程度 2.2.3 教程多么 2.2.4 如果选择的是一个开源项目,那么需要考虑的是,这个开源项目是否更新的快(比方说,这个开源项目已经好几年没有更新了,那么技术选型的时候,就得注意了

在开发第一个Android应用之前需要知道的5件事:

你能否详细讲述一下,在开发Android应用过程中每一阶段要用到的技能和编程语言? 建立一个Android应用程序可以归结为两个主要技能/语言:Java和Android系统.Java是Android的通用编程语言,但是Android还包括学习用于app界面设计的XML语言,学习Android概念,以及从Java编程角度运用这些概念. 学了Java和XML之后,再用Android理念将两者连接起来. 我也有分享过一些学习Activities和 Fragments等的Android相关知识.我最喜欢

看《css知多少》的一些总结

问题 1.有些浏览器不完全支持css3,现在可以用哪个工具去检测浏览器是否支持,以及支持哪些项? modernizr:检测浏览器对HTML5和CSS3特性(至于modernizr的介绍,可以看我另外一篇博文HTML5系列四(特征检测.Modernizr.js的相关介绍)) 2.常用的html标签,它们的display属性一般默认为block和inline.有哪些常用标签的display不是block和inline,这些标签显示的时候和block/inline有何区别? 具体display属性值有

【转】嵌入式程序员应该知道的16个问题

全面解析<嵌入式程序员应该知道的16个问题> ----Sailor_forever分析整理,[email protected] http://blog.csdn.net/sailor_8318/archive/2008/03/25/2215041.aspx 1.预处理器(Preprocessor) 2.如何定义宏 3.预处理器标识#error的目的是什么? 4.死循环(Infinite loops) 5.数据声明(Data declarations) 6.关键字static的作用是什么? 7.

你应该知道的25个非常有用的CSS技巧

在我们的前端CSS编码当中,经常要设置特殊的字体效果,边框圆角等等,还要考虑兼容性的问题, CSS网页布局,说难,其实很简单. 说它容易,往往有很多问题困扰着新手,在中介绍了非常多的技巧,这些小技巧与知识能事半功倍的给大家以帮助,经验丰富的CSS程序员通常都知道这一点,但初学者不要错过了! 这里有25个非常有用的CSS技巧,将帮助你解决让你棘手的CSS代码问题.你可以直接使用到你现在的项目当中 1.更改文本突出显示颜色(Change Text Highlight Color) 您可能不知道!使用

网站开发人员应该知道的61件事

    作者 Hoogle, 火龙果软件 发布于:2014-01-23   有人在Stack Overflow上发问,动手开发网站之前,需要知道哪些事情? 不出意料地,他得到了一大堆回答. 通常情况下,你需要把所有人的发言从头到尾读一遍.但是,Stack Overflow有一个很贴心的设计,它允许在问题下方开设一个wiki区,让所有人共同编辑一个最佳答案.于是,就有了下面这篇文章,一共总结出六个方面共计61条"网站开发须知". 我发现,这种概述性的问题,最适合这种集合群智.头脑风暴式的

微信小程序开发日记——高仿知乎日报(上)

本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教程分为以下三篇 微信小程序开发日记--高仿知乎日报(上) 微信小程序开发日记--高仿知乎日报(中) 微信小程序开发日记--高仿知乎日报(下) 三篇分别讲不同的组件和功能块 这篇要讲 API分析 启动页 轮播图 日报列表 浮动按钮 侧滑菜单 API分析 以下是使用到的具体API,更加详细参数和返回结

v系列尺寸知多少

今天来说说vh,vw,vmin,vmax,这些css3中定义的尺寸单位,能在css中解析原始包含块的宽高信息,用途还是有些的.根据css3标准的定义,这些v系列的尺寸全称为viewport-percentage length, 顾名思义,它们定义了相对于原始包含块的百分比尺寸.当原始包含块的尺寸改变时,你用这些单位定义的尺寸也会相应地改变.当根元素的overflow为auto时,则看作原始包含块没有滚动条.注:原始包含块的尺寸会受到视口滚动条的影响.(我真心不知道这个影响是什么,如果你正好知道,