CSS的width:100%和width:auto区别

一、   问题

前段时间在调整树结构的时候,发现如果树的节点名称比较长的话在IE6下则不会撑开外面的元素,导致节点的名称只显示了一半,同时图标和名称换行显示了,但是在IE8和IE9下则显示正常。定位到问题后,最终发现是下面的属性导致的,如下图红色所致,把width的值设置为auto后即可解决问题:

.TreeView,.TreeView ul{

padding:0px 0px 0px  19px;

list-style:none;

margin:0px 0px;

width:100%;/*这里修改为auto*/

background:url(./trstree-default-line.gif)  repeat-y 0px  center ;

}

二、   结论

[1] width:100% 并不包含margin-left  margin-right的属性值,直接取其父容器的宽度加上含margin-left /margin-right的值。如果设置了margin那新的width值是容器的宽度加上margin的值。(细心观察)就会发现加了  margin相对应的边就会多出设置的空白。而且会多出横向滚动条因为宽度已经超出了屏幕的范围。(这条相对于父容器是body)。

[2] width:auto包含margin-left/margin-right的属性值。其值包含margin-left /margin-right的值。width:auto总是占据整行!!!这其中margin的值已经包含其中了(也就是一整行)如果要设置margin的值那就用一整行然后减去margin的值就得到了现在的宽度了。减去的这个值就是相应边得空白。显著的特征是这个没有横向滚动条出现也就是宽度没有增加。

[3] 在IE6下显示不正常,但是在IE8和IE9下显示正常,可能是IE8和IE9对width:100%的解析与IE6不同所致,但是两者对width:auto的解析是一致的。

width:auto;会将元素撑开至整个父元素width,但是会减去子节点自己的margin,padding或者border的大小。
width:100%;会强制将元素变成和父元素一样的宽,并且添加额外的空间到这个元素的width上。就是因为这个,会导致很多问题。

使用width:100%永远都不是一个好主意。这个属性容易让人产生你正在定义一个元素可视大小,其实,你是在对这个元素的状态做了巨大的改变。

块元素会填满其父元素的整个width,因为块元素默认的是width:auto;的。

See the Pen jGgIu by liqian (@liqian) on CodePen.

下面的例子里,黑色的边框(border)代表容器父元素。蓝色和绿色表示的是一个有着红色边框,边框宽为20个像素的子节点。(border:20px solid red;),不同点在于,蓝色的子节点是width:auto;,绿色的是width:100%;的。

See the Pen H2F - March 25, 2014 #1 by liqian (@liqian) on CodePen.

 
可以看到绿色的子节点伸出了父元素。这是因为绿色的子节点设置了width:100%;使得自己的width变得和父元素一样大小,但是这个width不包含子节点自己边框的大小。这样边框就到父元素外面了;
 
 
 
对于padding和margin也是同样的作用。

See the Pen H2F - March 25, 2014 #2 by liqian (@liqian) on CodePen.

无论多的宽度是padding,margin或者border,width:auto;都不会将子节点撑破父元素。

可以看出,width:100%是将盒模型中的content拉伸得和父元素一样,而width:auto;是将这个盒模型拉伸得和父元素一样。

很多CSS问题的解决办法不是添加更多的CSS,而是去掉那些有问题的CSS,这就得需要对类似width这样的CSS样式的副作用有深刻的认识。

1)width: 100%并不包含margin-left/margin-right的属性值,直接取其父容器的宽度+margin-left/margin-right的值。如果该div设置了margin值,则该div的width值=容器的宽度+margin值。(细心观察)就会发现加了margin值后,相对应的边就会多出设置的空白。如果其父容器是body,则还会多出横向滚动条,因为它的宽度已经超出了屏幕的范围,如果该div你设置了overflow-x:auto,则在超出范围时,也会出现滚动条。

 
2)width:auto在设置width值时会包含margin-left/margin-right的属性值。width:auto总是占据整行!!!这其中margin的值已经被包含在其中了(也就是一整行)如果要设置margin的值,那就用一整行width-margin的值=设置的元素的宽度了。减去的这个值就是相应边的空白。该种情况下,显著的特征就是这个没有横向滚动条出现,即宽度没有增加。
 
总之,
width:100%:设定对象的宽度占父元素的100%(不论设定元素的margin值为多少)
width:auto:是根据设定对象的实际大小而自适应宽度(考虑设定元素的margin值得大小)
 
针对元素A
1.A是容器,希望A把它的父容器充满,就是100%
2.A是容器,希望A根据容纳的元素大小变换自己的大小,就用auto
 
3.A不是容器,宽度不知,需要显示完全,用auto
4.A不是容器,宽度不知,可能大于所在容器宽度,希望填满,用100%
 
案例如下:

CSS的width:100%和width:auto区别的更多相关文章

  1. width:100%;与width:auto;的区别

    <div> <p>1111</p> </div> div{ width:980px; background-color: #ccc; height:30 ...

  2. css width="100" style ="width:100px" 区别

    1. width="100"是正确的,而 width="100px"是错误的, style = "width:100px"是正确的 2. s ...

  3. width:100%和width:auto区别

    在div父元素是body时 1.先看没有width限制的div <div style="border:1px solid red; margin-left:50px; margin-r ...

  4. width:100%和width:inherit

    前几天遇到过这么一个问题.我想让子盒子的宽度等于父盒子的宽度.父盒子宽度为一个具体值比如说200px.我将子盒子宽度设为了100%.按道理说应该是可以等于父盒子的宽度的,但结果并没有,而是通栏了.然后 ...

  5. css中width:auto和width:100%的区别是什么

    width的值一般是这样设置的: 1,width:50px://宽度设为50px 2,width:50%://宽度设为父类宽度的50% 3,还有一个值是auto(默认值),宽度是自动的,随着内容的增加 ...

  6. width:auto 和 width:100%有什么区别

    width:auto 和 width:100%有什么区别 宽度计算不同 <div class="parent"> <span class="child& ...

  7. CSS width:100%和width:auto的区别

    width:100%和width:auto的区别 width:auto比较聪明,如果margin已经左右占去10px的空间,那么width给的值就是580px. <style> div{ ...

  8. css top,right,bottom,left设置为0有什么用?它和width:100%和height:100%有什么区别?

     壹 ❀ 引 当我们使用position属性时,总免不了与top,left,right,bottom四个属性打交道,那么这四个属性都设置为0时有什么用,与宽高设置100%又有什么区别?本文对此展开讨论 ...

  9. width、height为auto或者100%的区别

    一.规则 1. 某div不设置宽度,那么width默认为auto. 2. 某子元素div的width为100%(或者设置为等于父元素宽度的具体值,比如父元素width为100px,子元素width也设 ...

随机推荐

  1. 《C# to IL》第二章 IL基础

    如果你真的想要理解C#代码,那么最好的方法就是通过理解由C#编译器生成的代码.本章和下面两章将关注于此. 我们将用一个短小的C#程序来揭开IL的神秘面纱,并解释由编译器生成的IL代码.这样,我们就可以 ...

  2. LT1961 升压型稳压器造就了兼具升压和降压能力的扁平状SEPIC

    http://cds.linear.com/docs/cn/design-note/DN317%20sim_chs.pdf http://cds.linear.com/docs/en/datashee ...

  3. python笔记3-邮件发送(smtplib)

    前言 本篇总结了QQ邮箱和163邮箱发送邮件,邮件包含html中文和附件,可以发给多个收件人,专治各种不行,总之看完这篇麻麻再也不用担心我的邮件收不到了. 以下代码兼容python2和python3, ...

  4. Drawable的getIntrinsicHeight()和getIntrinsicWidth()

    版权声明:本文为博主原创文章,未经博主允许不得转载. 今天遇到一个问题,一个Bitmap封装到BitmapDrawable中 ,BitmapDrawable drawable = new Bitmap ...

  5. Microsoft Visual C++ 6.0预处理器参考手册

    返回总目录 Microsoft Visual C++ 6.0 预处理器参考手册 目录引言........................................................ ...

  6. 【USACO1.2_2】★Transformations 方块转换

    一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案.写一个程序来找出将原始图案依照下面列转换方法转换成新图案的最小方式: 1:转90度:图案按顺时针转90度. ...

  7. Qt 串口类QSerialPort 使用笔记

    Qt 串口类QSerialPort 使用笔记 虽然现在大多数的家用PC机上已经不提供RS232接口了.但是由于RS232串口操作简单.通讯可靠,在工业领域中仍然有大量的应用.Qt以前的版本中,没有提供 ...

  8. 在JavaScript文件中读取properties文件的方法

    假设有JavaScript文件叫做:readproperties.js,这个文件需要读取config.properties这个配置文件,步骤如下: 1.  下载插件jquery.i18n.proper ...

  9. ownCloud 的六大神奇用法

    ownCloud 是一个自行托管的开源文件同步和共享服务器.就像“行业老大” Dropbox.Google Drive.Box 和其他的同类服务一样,ownCloud 也可以让你访问自己的文件.日历. ...

  10. 网络地址转换相关函数使用(inet_addr,inet_ntoa,inet_addr)

    aa 相关函数原型及参数类型: 函数原型:int inet_aton(const char *cp, struct in_addr *inp); in_addr_t inet_addr(const c ...