• CSS系列 (05):浮动&定位详解


    浮动

    浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。由于浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样。 —— W3C

    文字环绕

    float可以实现块级元素的文本环绕浮动元素的布局

    <div class="left">左浮动</div>
    <div class="right">右浮动</div>
    <div class="no-float">
      我是块级元素,我不浮动。我是块级元素,我不浮动。我是块级元素,我不浮动。我是块级元素,我不浮动。我是块级元素,我不浮动。我是块级元素,我不浮动。我是块级元素,我不浮动。我是块级元素,我不浮动
    </div>
    

    小贴士:

    • 行内块(inline-block)元素的文本无法实现文字环绕布局,直接不行

    • 行内(inline)元素的文本虽然可以实现文字环绕布局,但是不建议使用,其背景色不会铺满,如下图

    布局

    1. 浮动元素总是找离它最近的父级元素对齐,但是不会超出内边距的范围

      <div class="container">    
        <div class="item right">右浮动</div>
        <div class="item el-block">不浮动-块级元素</div>
        <div class="item el-block">不浮动-块级元素</div>
      </div>
      
    2. 浮动元素脱离标准流,会将后面标准流中的块级元素覆盖【但不会覆盖普通流中的行内元素和行内块元素,它们将会和浮动元素并排显示】

      <div class="container"> 
        <div class="item el-block">不浮动-块级元素</div>
        <div class="item left">左浮动</div>
        <div class="item el-block">不浮动-块级元素</div>
      </div>
      
    3. 浮动元素的排列位置,跟上一个元素有关系。如果上一个元素是标准流中的块级元素,则浮动元素的顶部会和上一个元素的底部对齐;如果上一个元素是标准流中的行内块元素或者行内元素,则浮动元素顶部会和上一个元素的顶部对齐,且会浮动到最左或最右侧;如果上一个元素有浮动,则浮动元素顶部会和上一个元素的顶部对齐;

      <div class="container">
        <div class="item el-block">不浮动-块级元素</div>
        <div class="item left">左浮动</div>
      </div>
      
      <div class="container">
        <div class="item el-inline-block">不浮动-行内块元素</div>
        <div class="item left">左浮动</div>
      </div>
      
      <div class="container">
        <div class="item left">左浮动-1</div>
        <div class="item left">左浮动-2</div>
      </div>
      
    4. 如果包含框太窄,无法容纳水平排列的三个浮动元素,那么其它浮动块向下移动,直到有足够的空间。如果浮动元素的高度不同,那么当它们向下移动时可能被其它浮动元素“卡住”

      <div class="container">    
        <div class="item left lg">左浮动-1</div>
        <div class="item left">左浮动-2</div>
        <div class="item left">左浮动-3</div>
      </div>
      

    清除浮动

    清除浮动主要为了解决父级元素因为子级元素浮动引起内部高度为0的问题

    方法:

    • 触发浮动元素的父元素BFC,BFC详见CSS系列 (04):盒模型详解

      父容器添加属性:overflow:hidden

    • after伪元素 +clear属性

      在浮动元素后增加一个任意DOM元素,并设置css属性 clear: both,即可清除浮动。but,这样会添加一些无语义的DOM元素,不利于后期维护。

      聪明的你可能会想到after伪元素,利用CSS在元素内部的结束位创建一个元素,简直棒呆

      注意:新创建的元素为行内元素,且必须要结合content属性使用

      .clearfix:after { 
        content: '.';
        display: block;
        clear: both;
         0px;
        height: 0px;
        visibility: hidden;
      }
      
      /* 兼容IE6、IE7,使用 zoom:1触发 hasLayout */
      .clearfix {
        zoom: 1; 
      }
      

    定位

    常见定位模式

    四种常用定位模式特性总结:

    定位模式 是否脱标占有位置 是否可以使用边偏移 移动位置基准 是否可以使用z-index
    没有定位,默认值static 不脱离标准流,占有位置 不可以 无法移动 不可以
    相对定位relative 不脱离标准流,占有位置 可以 相对自身位置移动 可以
    绝对定位absolute 脱离标准流,不占有位置 可以 相对于最近已定位父级移动,static除外 可以
    固定定位fixed 脱离标准流,不占有位置 可以 相对于浏览器窗口移动 可以

    子绝父相:

    子元素设置绝对定位,父元素设置相对定位,此时子元素相对于父元素进行边偏移,父元素相对于自身位置进行移动,这是一种常用的定位布局方式

    开发中遇到的一种特殊布局:

    绝对定位相对于其最近的已定位的父元素( static除外 )进行偏移,如果父元素为fixed,没有设置宽高,topbottomleftright 都为0铺满全屏,设置margin-bottom为-5000px,子元素为absolutebottom为0。此时,父元素刚好铺满全屏,子元素在浏览器窗口下边缘下探至-5000px的地方消失不见

    堆叠顺序

    z-index

    对于定位元素(static除外),该z-index属性指定,一是设置当前堆栈上下文中框的堆栈级别,二是创建一个新的堆叠上下文

    特性:

    1. z-index的默认属性值是auto,注意0和auto不一样,最后会讲述他们的不同点

    2. 只有相对定位、绝对定位、固定定位元素有此属性,其余浮动、静态定位元素都无此属性

    3. 在同一个堆叠上下文中的元素,z-index越高越靠近用户。如果取值相同,则根据书写顺序,后来居上

    4. 在不同堆叠上下文中的元素,不同堆叠上下文中的子元素不可能发生交叉,即:

      如果堆叠上下文Az-index值为500,堆叠上下文Bz-index值为400,则堆叠上下文A的所有子元素都在堆叠上下文B的子元素前面

    下图来自于子元素的z-index如何高于父元素的兄弟元素的z-index值?luckness用户的评论

      <div class="div1">
         <div class="div1div1">
            <div class="div1div1div1"></div>
         </div>
      </div>
      <div class="div2">
        <div class="div2div1"></div>
      </div>
    

    如何让子元素显示在父元素下方?

    注意:不能给父元素z-index属性设置具体数值,z-index:0z-index:auto(默认值)是有区别的

    • z-indexauto时,不会创建层叠上下文,子元素z-index为负数,则显示在父元素下方,为非负数,则显示在父元素上方

    • z-index 变成数值时,就会创建一个层叠上下文,此时子元素永远显示在父元素上方,且受制于父元素的层叠顺序

      father{
        position:relative;
        z-index: auto;
      }
      child{
        position:absolute;
        z-index: -1;
      }
      

    参考文档

    子元素的z-index如何高于父元素的兄弟元素的z-index值?

    人间不正经生活手册
  • 相关阅读:
    netbeans 快捷键
    Netbeans Platform的Lookup 边学边记
    Swing中的并发使用SwingWorker线程模式
    转:ExtJS:tabpanel 多个tab同时渲染问题
    NetBeans Platform Login Tutorial
    检测项目
    C#实现通过程序自动抓取远程Web网页信息
    WebClient类
    string字符串的方法
    WebClient的研究笔记认识WebClient
  • 原文地址:https://www.cnblogs.com/burc/p/14239037.html
Copyright © 2020-2023  润新知