谈一谈css中的100%和auto
2017-09-06 10:01
134 查看
在web前端的编程过程中,利用%数值和auto来进行设置元素的宽度和高度等是很常见的,但是他们的值是怎样计算的呢?
一、100%
百分比设置像素是很常见的,也比较简单。一般在两个地方用的比较多——设置子元素宽高和设置(内|外)边距。
1.首先看设置宽高,先看例子
html
css
在这个例子中,子元素正常布局,父元素设置了内外边距以及border(方便观察计算),结果如下
左边是父元素的整体样式,外面是margin,然后是border,然后是padding,然后是content。右边是子元素样式(黄色部分),可以看出,子元素中的宽高计算是以父元素的content为基数的,即设定的父元素的宽高,不包含边距和边框。
接下来我们改一下,子元素添加属性float: left,使元素脱离文档流。
css
然后我们发现,结果并没有什么改变(图和上面一样),可以得出结论,百分比计算宽高时与子元素是否在文档流无关。
2.然后来看计算内外边距
这个在w3c里面明确给出过,在计算内外边距时,使用百分比计算,基数是父元素的宽度(查看w3c),不论是上下边距还是左右边距。之所以这样设定是很好理解的,因为在写css的过程中,我们一般不会给父元素添加设置高度,而是由子元素撑开。用css权威指南里的话来说
我们认为,正常流中的大多数元素都会足够高以包含其后代元素(包括外边距),如果一个元素的上下外边距时父元素的height的百分数,就可能导致一个无限循环,父元素的height会增加,以适应后代元素上下外边距的增加,而相应的,上下外边距因为父元素height的增加也会增加。
看例子:
css
改一下父元素的高度,令height: 100px
ok,子元素的位置并没有改变。如果给子元素加浮动呢,效果还是一样的,所以说百分值的计算与是否脱离文档流无关。边距的百分比值计算都是基于父元素width的。
二、auto
1.宽高设置
auto也是比较常用的值,而且是宽高的默认值。
当宽度设为auto时,宽度设定为父元素的100%,但是子元素必须与父元素在同一个层面上,即子元素不能脱离父元素所在的文档流。
如果高度设为auto,没有效果。子元素的高度并不会变为父元素的100%
看例子:
没问题,如果把height设置成auto
子元素没有高度,所以并没有显示
2.在margin中的应用
auto咋margin中应用还是比较常见的。比如说常见的水平居中对齐就是把子元素的左右margin设置为auto来实现的。
看例子:
auto的值会把父元素剩余空间均分,设置为左右margin
当然,上下margin设置为auto还是没有效果的
auto无论是在宽度设置还是在左右margin设置上,子元素都要处于父元素所在的文档流的,否则没有效果。这也是在设置宽度时auto与100%的区别。
一、100%
百分比设置像素是很常见的,也比较简单。一般在两个地方用的比较多——设置子元素宽高和设置(内|外)边距。
1.首先看设置宽高,先看例子
html
<div class="wrapper"> <div class="content"></div> </div>
css
.wrapper { width: 200px; height: 200px; margin: 10px; padding: 5px; border: 1px solid #7C7C7C; } .content{ width: 100%; height: 100%; background: yellow; }
在这个例子中,子元素正常布局,父元素设置了内外边距以及border(方便观察计算),结果如下
左边是父元素的整体样式,外面是margin,然后是border,然后是padding,然后是content。右边是子元素样式(黄色部分),可以看出,子元素中的宽高计算是以父元素的content为基数的,即设定的父元素的宽高,不包含边距和边框。
接下来我们改一下,子元素添加属性float: left,使元素脱离文档流。
css
.wrapper { width: 200px; height: 200px; margin: 10px; padding: 5px; border: 1px solid #7C7C7C; } .content{ width: 100%; height: 100%; /*添加浮动*/ float: left; background: yellow; }
然后我们发现,结果并没有什么改变(图和上面一样),可以得出结论,百分比计算宽高时与子元素是否在文档流无关。
2.然后来看计算内外边距
这个在w3c里面明确给出过,在计算内外边距时,使用百分比计算,基数是父元素的宽度(查看w3c),不论是上下边距还是左右边距。之所以这样设定是很好理解的,因为在写css的过程中,我们一般不会给父元素添加设置高度,而是由子元素撑开。用css权威指南里的话来说
我们认为,正常流中的大多数元素都会足够高以包含其后代元素(包括外边距),如果一个元素的上下外边距时父元素的height的百分数,就可能导致一个无限循环,父元素的height会增加,以适应后代元素上下外边距的增加,而相应的,上下外边距因为父元素height的增加也会增加。
看例子:
css
.wrapper { width: 200px; height: 200px; margin: 10px; padding: 5px; border: 1px solid #7C7C7C; } .content{ width: 100px; height: 100px; margin: 100%; background: yellow; }
改一下父元素的高度,令height: 100px
ok,子元素的位置并没有改变。如果给子元素加浮动呢,效果还是一样的,所以说百分值的计算与是否脱离文档流无关。边距的百分比值计算都是基于父元素width的。
二、auto
1.宽高设置
auto也是比较常用的值,而且是宽高的默认值。
当宽度设为auto时,宽度设定为父元素的100%,但是子元素必须与父元素在同一个层面上,即子元素不能脱离父元素所在的文档流。
如果高度设为auto,没有效果。子元素的高度并不会变为父元素的100%
看例子:
.wrapper { width: 200px; height: 200px; margin: 10px; padding: 5px; border: 1px solid #7C7C7C; } .content{ width: auto; height: 100px; background: yellow; }
没问题,如果把height设置成auto
.content{ width: 200px; height: auto; background: yellow; }
子元素没有高度,所以并没有显示
2.在margin中的应用
auto咋margin中应用还是比较常见的。比如说常见的水平居中对齐就是把子元素的左右margin设置为auto来实现的。
看例子:
.wrapper { width: 200px; height: 100px; margin: 10px; padding: 5px; border: 1px solid #7C7C7C; } .content{ width: 100px; height: 50px; margin: 0 auto; background: yellow; }
auto的值会把父元素剩余空间均分,设置为左右margin
当然,上下margin设置为auto还是没有效果的
auto无论是在宽度设置还是在左右margin设置上,子元素都要处于父元素所在的文档流的,否则没有效果。这也是在设置宽度时auto与100%的区别。
相关文章推荐
- css width:100% 和width:auto的区别
- CSS: width:100% 和 width:auto
- css中width:auto和width:100%的区别是什么
- css属性width默认值width: auto与width: 100%区别
- CSS的width:100%和width:auto区别
- css中width:auto和width:100%的区别有哪些
- CSS的width:100%和width:auto区别
- CSS,height:auto和height:100%有什么区别?
- css中height:100%不起作用的解决方法
- width的100%和auto
- 关于在IE9下css属性设置margin:0 auto 不能使div居中
- width:100%和width:auto区别
- CSS中inherit指定继承的使用方法和auto的区别
- CSS清除浮动常用方法小结 CSS clear both {overflow:auto;zoom:1;}
- CSS的inherit与auto使用分析
- 【浏览器兼容性】css解决IE、Firefox兼容的div高度100%的问题
- CSS border-radius:50%和100%的区别
- CSS-div高度100%设置问题
- 当css属性width设为100%时
- Vue2+WebPack2使用css/sass+postcss的autoprefixer