A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 西安前端组 于 2018-1-10 22:30 编辑

子元素撑开父元素宽高问题小结
html中,父元素中拥有子元素是很正常的情况。如果我们不设置父元素的宽度或者高度,默认情况下,父元素的宽度和高度会被子元素撑开。
样式代码如下:
<style>
        .main{
            width: 500px;
            border: 1px solid red;
        }   
        .child{
            width: 200px;
            height: 120px;
            background-color: blue;
        }
</style>

Html结构如下:
<body>
    <div class="main">
        <div class="child"></div>
    </div>
</body>
上述的样式和html结构产生的效果如下:
红色边框的是main,蓝色区域是child,我们只给child设置了宽度和高度,给main设置了宽度,但是没有给main设置高度,我们可以看到main的高度是被child给撑开了。
所以我们可以得出第一个结论,默认情况下,子元素是会将父元素的宽度或者高度给撑开的。

一般情况下,有两种原因会造成子元素无法将父元素的宽度或者高度撑开。
1、子元素设置了浮动
2、子元素设置了绝对定位(absolute)或者固定定位(fixed)
现在我将样式代码做如下修改:
样式代码如下:
<style>
        .main{
            width: 500px;
            border: 1px solid red;
        }   
        .child{
            width: 200px;
            height: 120px;
            background-color: blue;
     float: left;
        }
</style>
Html结构如下:
<body>
    <div class="main">
        <div class="child"></div>
    </div>
</body>
我给child设置了浮动,造成的效果如下图:
我们可以看出来,此时父元素没有高度了。因为将child设置为了float,child就脱离了标准文档流,因此无法撑开父元素的宽度或者高度。

我现在对代码再次进行修改,如下:
样式代码如下:
<style>
        .main{
            width: 500px;
            border: 1px solid red;
        }   
        .child{
            width: 200px;
            height: 120px;
            background-color: blue;
      position: absolute;
        }
</style>
Html结构如下:
<body>
    <div class="main">
        <div class="child"></div>
    </div>
</body>
我给child设置了绝对定位,造成的效果如下图:



我们可以看出来,此时父元素没有高度了。因为将child设置为了绝对定位或者固定定位,child就脱离了标准文档流,因此无法撑开父元素的宽度或者高度。

下面说说关于如果子元素没有撑开父元素宽高,而我们又需要父元素的宽高被子元素撑开,可以采取的解决方案。
1、由于浮动造成
(1) 给父元素的伪元素清除浮动
<style>
         .main::after{
                    content: "";
                    display: block;
                    clear: both;
                }
</style>
注意,此时只能给after增加,给before增加将没有效果。因为所谓清除浮动其实指的是给main的最后在增加一个子元素,给这个子元素增加clear:both的样式。main的伪元素确实是main的子元素,不过before是在child前,而after是在child后,所以after才能符合要求。
(2) 给父元素设置overflow为hidden
<style>
        .main{
            width: 500px;
            border: 1px solid red;
      overflow: hidden;
        }   
</style>
(3) 给父元素设置绝对定位
<style>
        .main{
            width: 500px;
            border: 1px solid red;
      position: absolute;
        }   
</style>
2、由于定位造成
(1) 给父元素也增加position为absolute,相当于父元素和子元素都脱离了标准文档流,可以理解为同流合污了,所以此时子元素绝对定位能够将绝对定位的父元素的宽高撑开。
这里多说一句,通常我们习惯说子绝对布局,父相对布局,其实子绝对布局,父绝对布局,子元素的定位也是参照父元素的。只不过此时的父元素不占位而已。
(2) 貌似没有第二种解决方案。
子绝对父相对看看能否改成子绝对父绝对。
如果一定得要是子绝对父相对,那么此时一般也不需要靠子元素将父元素的宽高撑开。例如:
在这个例子中,我们要给轮播图的上下两个箭头进行定位,那么我们可以采取子绝对父相对,也可以采取子绝对父绝对。咱们的第一目标是要将上下的箭头进行定位。
不过对于子绝对父绝对的话,那么轮播图下面的内容将会向上移动,因为轮播图如果绝对定位,它将不占位置了。
综合考虑,这样的布局我们采取子绝对父相对是比较合适的。不过大家可以仔细想想,这种情况下,轮播图的宽高需要被箭头撑开吗?

讲上述内容用思维导图的方式总结如下:

图片3.png (131.62 KB, 下载次数: 8)

图片3.png

6 个回复

倒序浏览
回复 使用道具 举报
赞赞赞赞
回复 使用道具 举报
赞赞赞赞
回复 使用道具 举报
好文章!
回复 使用道具 举报
superbaby 来自手机 中级黑马 2018-1-12 17:32:44
地板
好好学习
回复 使用道具 举报
superbaby 来自手机 中级黑马 2018-1-12 17:33:24
7#
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马