这是一条横幅!

Fork me on Gitee
cnblogs.com/iszhangk的头像

zhangk

做个简单的coder

关于盒子模型.定位.浮动.页面布局的一些总结和的经验心得

自学了半年前端,一开始学的时候没有把基础打牢,页面布局时经常出问题.写了几个页面后逐渐积累了一些经验,在这里我把它整理出来:

 

文档流:网页中的元素在网页中所占据的位置.网页中并不是所有的元素都占据文档流的

   举例:某个网站的布局如下,标题区域占据文档流,内容区域就会排在标题区域的下面

   

   当标题区域不占据文档流时,标题区域和内容区域发生了重合:

   

   通俗的说:标题区域失去文档流之后,内容区域不知道他的存在了,所以他会认为显示在网页(body)中的只有自己一个元素,因此内容区域会显示在最上面.

   而标题区域实际上并没有消失不见.所以他们会发生重合的情况.

 

定位:

css中定位用position实现,position有四个值:

position:absolute(绝对定位):不占据文档流,可以设置偏移量.

position:relative(相对定位):占据文档流,无论偏移量为何值,始终占据最初的文档流

position:fixed(固定定位):不占用文档流,永远固定在屏幕的某个具体位置.

position:static(默认定位):static是position的默认值,也就是说"position:static"这条在css里写不写都是一样的.static是position四个定位里唯一一个不开启定位的属性

 

定位的继承:

<body>
    <div class="div4">
        <div class="div3">
            <div class="div2">
                <div class="div1">
                    <div class="div0"></div>
                </div>
            </div>
        </div>
    </div>
</body>

(1)何为定位继承:在下面的例子中,如果div0继承了div1,div1的偏移量为10px,那么div0的默认偏移量就是10px,如果给div0设置20px的偏移量,那么div0的偏移量就是(10+20)px

 (2)继承谁的定位:网页中的元素会其继承定位父元素的位置.

这里有一组结构上嵌套的div,他们呈现的网页上的效果如下:

div0的定位是"top:20px",但它这个20像素是相对于谁的呢?div1,div4,还是body?

这要看哪个div开启了定位,如果div1开启了定位,那么div0就会相对于div1横向的偏移20像素,如果div1没有开启定位,那么div0就会向外找div2是否开启了定位......直到找到body或者找到其他开启了定位的祖先元素:

 

被div0继承定位的元素,就是div0的定位父元素.

 

相对定位+外边距

下图是一个手机端的优惠券领取界面,每一个优惠券div内部的布局都是相同的.为了让保持内部的布局不变,让里面的图片和文字永远相对于父级div定位,就必须将父级元素开启定位.

如果使用绝对定位,元素不占用文档流,那所有的优惠券div都会重叠在一起

因此要使用相对定位,相对定位如果设置了偏移量,元素所占用的文档流就会和网页实际显示的位置出现偏差,因此,如果想要使用相对定位,在本例中应该使用内外边距控制元素位置,而不是偏移量.

 

 

浮动:浮动有左浮动(float:left)和右浮动(float:right)两种情况,浮动不占据文档流.

 

清除浮动:

可以使用clear属性清除浮动,clear可以取四个值,分别是none\right\left\both

以(clear:right)来说明,字面意思是清除某元素左侧的浮动元素,但实际上并不是:

 <!DOCTYPE html>
 <html>
 <head>
     <title></title>
     <style type="text/css">
         .leftDiv{
             width: 100px;
             height: 100px;
             border: 1px solid #f00;
             float: left;
             clear: right;
         }
         .rightDiv{
             width: 100px;
             height: 100px;
             border: 1px solid #000;
             float: left;
         }
     </style>
 </head>
 <body>
     <div class="leftDiv"></div>
     <div class="rightDiv"></div>
 </body>
 </html>

程序执行的结果如图所示:

红色方块(leftDiv)已经设置了右浮动,但是并没有改变右侧的黑色方块(divRight),为什么呢?

float:right的意思是不允许左边有浮动对象,但是这个属性是应用在红色方块上的,他不会影响到黑色方块,如果想要清除掉用测浮动的黑色方块,应该在黑色方块上设置清除左浮动.

还是上面的代码,只需要在右边的div上加一个clear:left就ok了

.rightDiv{
             clear:left;
         }

执行结果:

 

总结起来就是:clear确实是清除某侧的浮动,但是clear只会影设置该属性的元素自身,不会影响到其他元素.

 

解决高度塌陷问题:

这是一个浮动很常见的应用场景

 

浮动不占据文档流,为了不让下面的元素和该元素重合在一起,需要给他设置一个能够占据文档流的父级div,高度和浮动元素的高度相等:

但因为浮动元素不占据文档流,他的父级div会认为他不存在.因此他无法将父级元素撑开,在下图中,父级div变成了一条线,这就是高度塌陷问题:

 

如果给父级元素设置一个固定的高度,会非常不利于网页的维护.这时就希望浮动元素能够把他的父元素撑开:

        .clearfix:after{
            content: "";
            display: block;
            clear: both;
        }
        .clearfix{
            zoom: 1;
        }

给父元素添加clearfix这个样式就可以做到,原理是在父元素的后面加一个属性,清除左右浮动让他跑到最下面,设置为block使之可以独占一行.

这个方法使用方便,而且可复用,能够解决兼容性问题.

 

posted @ 2019-07-27 17:22  iszhangk  阅读(1271)  评论(0编辑  收藏  举报