zoukankan      html  css  js  c++  java
  • css定位研究

    css的定位是很重要的一个知识点,要学会网页布局,一定要先把定位弄清楚,今天抽空整理一下这方面的知识。

    1.块级元素和行内元素(内联元素)

    块级元素:display值为block的元素就是块级元素,比如div,h,p,table,块级元素会占据一定的矩形空间,通过设置width,height,padding,margin等来调整这个矩形框(也就是盒模型)的大小。

    行内元素(内联元素):display的值为inline的元素为内联元素,这些元素本身不占据矩形空间,必须依附于块级元素而存在,所以给他们设置width等参数是没有意义的。

    2.四种定位方式

    css中有四种定位方式,static,relative,absolute,fixed.接下来我将一个一个叙述。

    static:

    static是默认的定位方式,它的规则是:块级元素一行一行排列,每个块级元素占据一定的空间。行内元素依附与块级元素。不能使用topbottomleftrightz-index来描述。比如,下面的代码。

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>盒模型研究</title>
    <style>
    * {
        margin: 0;
        padding: 0;
    }
    
    #box1 {
        background-color: #C6F08C;
        padding: 5px;
        color: white;
        margin: 5px;
        width: 100px;
        height: 100px;
    }
    
    .box2 {
        background-color: red; 
        width: 50px;
        height: 50px;
    }
    
    #box3 {
        background-color: blue;
        width: 100px;
        height: 100px;
        padding: 5px;
    }
    
    </style>
    <script>
    
    </script>
    </head>
    <body>
        <div id="box1">
        <a href="#">跳转链接</a><a href="#">跳转链接</a><!--默认形成一个行框-->
        <div class="box2">Hello World</div>
        </div>
    <div id="box3"> 
        <div class="box2">Hello World</div>
        <h2>another box</h2> 
    </div> 
    </body>
    </html>

    其形成的样式如下:

    可以看到,div这些块级元素会垂直排列下来,而行内元素如a则依附于块级元素在水平方向排列,直到它的宽度不够容纳,就会自动换行下来。

    relative:

    relative翻译过来是相对的意思,所以理解相对什么最关键,相对的是父块级元素,不管父元素是哪种定位方式。一旦我们将一个元素的position设置为relative,它的显示位置就会相对于它在父元素中自己本来的位置进行移动,而具体移动到什么地方,可以通过left,right,top,bottom等值来设置。但是需要注意的是,它在文档中还是占据了它原本应该有的位置,也就是说他原来的位置依然不能放其他元素,尽管它已经不在那边了

    这样说有点抽象,我们来举个例子。再上面例子的情况下,我们将box2设为relative,并且设置其left和top。如下所示。

    .box2 {
        position:relative;
        left:20px;
        top:20px;
        background-color: red; 
         50px;
        height: 50px;
    }

    这样以后,上述的页面变成这样显示。

    可以看到,两个box2相对于其在父div中自己原来的位置向左和向下移动了20px.而通过观察box3中的another box这个元素我们可以发现,尽管box2移动走了,它并没有占据掉box2原来的位置,可见,box2原本的位置依然没有释放。这一点十分重要。同时我们发现,box2遮挡住了部分原来another box的位置。

    可以这样理解,如果把每个块级元素比喻成相框,relative标记的元素就好像我们把相框中的相片拿出来,相对于相框原来的位置移动到了一个新的位置显示,有可能凌驾于其他的相框之上(box2遮挡了部分another box),但是因为它的相框还占据着原来的位置,所以其他的相框(元素)不能放置在它初始的位置。

    absolute

    absolute翻译过来叫做绝对,这是跟relative相对对应的,relative是相对于自己原来在父容器中的位置的偏移量。而absolute则是相对于父容器的偏移量,并且标记为absolute的元素已经脱离了文档流,它原本的位置可以被其他的元素侵占。

    还有一个重要的条件是,标记为absolute的元素所相对的父元素指的是它的第一个非static父元素,如果他所有的父级元素都是static,则它的父容器为整个文档流。

    先看如下例子,在box1和bo,3中均放置着box2,我们把box2设置为absolute,而box1和box2均为默认的static。则根据上述理论,box2的父级容器当属整个文档流。我们设置box2的偏移量则是相对于最外层的文档流的偏移量。

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>盒模型研究</title>
    <style>
    * {
        margin: 0;
        padding: 0;
    }
    
    #box1 {
        background-color: #C6F08C;
        //position:relative;
        padding: 5px;
        color: white;
        margin: 5px;
        width: 100px;
        height: 100px;
    }
    
    .box2 {
        position:absolute;
        left:20px;
        top:20px;
        background-color: red; 
        width: 50px;
        height: 50px;
    }
    
    #box3 {
        background-color: blue;
        //position:relative;
        width: 100px;
        height: 100px;
        padding: 5px;
    }
    h2{
    position:relative;
    }
    
    </style>
    <script>
    
    </script>
    </head>
    <body>
        <div id="box1">
        <a href="#">跳转链接</a><a href="#">跳转链接</a><!--默认形成一个行框-->
        <div class="box2">Hello World</div>
        </div>
    <div id="box3"> 
        <div class="box2">Hello World</div>
        <h2>another box</h2> 
    </div> 
    </body>
    </html>

    可以看到两个box2都跳到了同一个地方,这是因为它们都是相对于最外层文档流进行了偏移。而且我们看到在box3中原来的box2的位置被another box这个h2占据了,说明absolute标记的元素已经从原来的位置删除了,就好像连整个相框都拿走了,放置到其他的相框上面。所以放原来相框的位置可以放置其他相框。(事实上就好像从来没有放置过这个相框一样,其他元素会重新占据它的位置并重新布局)

    现在我们把box3的position改为relative,观察会出现什么情况。

    我们发现其中一个box2改变位置了,变成了相对于box3的原点向右和向下偏移20px.这是因为此时这个box2的父级元素是box3.(第一个非static元素)。

    总结一下:标记为absolute的元素,它会相对于自己的第一个非static父级元素(如果都是static,则是相对于最外层文档流),偏移指定的位移。并且它原本所占的位置可以被其他的元素抢占,就好像它从来没有出现过一样

    fixed

     fixed基本与absolute类似,但是它的父元素是整个body,即它是相对于整个body来偏移;所以它不会随着其他元素的滚动而滚动,不像absolute,会随着父级元素的滚动而滚动。这也是它叫fixed的原因。我们常常看到有些网站,顶部那条菜单栏是固定的,就是用fixed实现的。

     4.z-index.

    我们在介绍relative或者absolute或者fixed的时候,发现被偏移的元素会跑到别的元素上面,遮挡住其他元素。就好像一张相框遮住了另外一张相框一样,其实我们可以通过Z-index来设置各个相框的排列顺序,z-index越大表示放在越上面。

    不过值得注意的是,参与比较的元素都必须是非static元素,否则比较就没有意义。因为非static始终是覆盖在static元素上的。

  • 相关阅读:
    【应用安全】mssql db_owner权限拿shell
    【应用安全——XSS】input-hidden
    留言板
    Git配置多个SSH-Key
    13.InternalThreadLocalMap
    10.ChannelOutboundBuffer
    9.ChannelHandlerContext
    8.Future&Promise
    7.给大动脉来一刀-NioEventLoop 源码分析
    6.给大动脉来一刀
  • 原文地址:https://www.cnblogs.com/roy-blog/p/8232939.html
Copyright © 2011-2022 走看看