zoukankan      html  css  js  c++  java
  • 关于盒子模型.定位.浮动.页面布局的一些总结和的经验心得

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

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

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

       

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

       

       通俗的说:标题区域失去文档流之后,内容区域不知道他的存在了,所以他会认为显示在网页(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 ightleftoth

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

     <!DOCTYPE html>
     <html>
     <head>
         <title></title>
         <style type="text/css">
             .leftDiv{
                  100px;
                 height: 100px;
                 border: 1px solid #f00;
                 float: left;
                 clear: right;
             }
             .rightDiv{
                  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使之可以独占一行.

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

  • 相关阅读:
    Math.pow
    css3正方体
    制作一个百度换肤效果
    排他思想
    js栈和堆的区别
    js创建对象的几种方式(工厂模式、构造函数模式、原型模式)
    短网址
    this
    作用域
    JS 函数基础
  • 原文地址:https://www.cnblogs.com/iszhangk/p/11254474.html
Copyright © 2011-2022 走看看