zoukankan      html  css  js  c++  java
  • css之布局那些事

    实现布局的三个最基本的原子技术

    浮动 float

    负边距 negative margin

    相对定位 relative position

    这是实现布局的三个最基本的原子技术。只要巧妙组合,并加以灵活运用,就能“拼”出各种布局的实现方案。

    实现双飞翼布局:

    尝试之路考虑以下DOM结构:

    1
    2
    3
    4
    5
    6
    7
    8
    <div id="page">    
          <div id="hd"></div>    
             <div id="bd">        
                  <div class="main"></div>        
                  <div class="sub"></div>        
                  <div class="extra"></div>    
             </div>   
          <div id="ft"></div></div>

    利用浮动元素的负边距来定位:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    .main {        
               floatleft;       
               width100%;   
     }  .sub {       
               floatleft;        
               width190px;        
               margin-left-100%;    }   .extra {        
                 floatleft;        
                 width190px;        
                 margin-left-190px;   
     }

    这样我们得到了第一个尝试页面 点击这里查看效果
    可以看出,通过简单的负边距,已经让sub和extra定位到正确的位置。剩下的问题是如何让main也定位到正确的位置。
    一个自然的想法是,给main的容器#bd添加padding:

    1
    2
    3
    #bd {        
              padding0 230px 0 190px;   
     }

    点击这里查看效果
    这样能让main定位到正确的位置,但sub和extra的位置不对了。这是一个思考的关卡。既然sub和extra的位置不对,那就想办法调整到正确的位置。相对定位隆重登场:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    .sub {        
               floatleft;        
               width190px;        
               margin-left-100%;        
               positionrelative;        
               left-190px;    }  
      .extra {        
                 floatleft;        
                 width230px;        
                 margin-left-230px;        
                 positionrelative;        
                 right-230px;    }

    点击这里查看完成页面 

    这意味着HTML结构和CSS布局在一定程度上解耦了,我们开发HTML代码时,从内容出发即可,无需过多的考虑布局。这正是渐进增强在前端工作流程上的体现。
    如果把三栏布局比作一只大鸟,可以把main看成是鸟的身体,sub和extra则是鸟的翅膀。这个布局的实现思路是,先把最重要的身体部分放好,然后再将翅膀移动到适当的地方。因此请容许我给这个布局实现取名为双飞翼布局(Flying Swing Layout).
    就如上图中的鸟有各种姿势一样,利用双飞翼布局,我们也可以实现各种布局。这里有个尝试页面,利用双飞翼,实现了一套栅格化布局系统

    优点

    实现了内容与布局的分离,即Eric提到的Any-Order Columns.

    main部分是自适应宽度的,很容易在定宽布局和流体布局中切换。

    任何一栏都可以是最高栏,不会出问题。

    需要的hack非常少(就一个针对ie6的清除浮动hack:_zoom: 1;)

    在浏览器上的兼容性非常好,IE5.5以上都支持。

    不足

    main需要添加一个额外的包裹层。

    等待你的发现与反馈。

    双飞翼的布局非常灵活,只要调整css代码就可以搞定一切。最近在一个论坛项目中准备尝试使用这个布局。希望大家有更好的布局方法一定要多多分享。

    css中的正内补丁和负外补丁(要结合隐藏溢出来用)

    这是为了解决多列布局中没有设置高度的时候让多列等高的(一般设值比较大),当然也是可以用多列布局column来实现

    padding-bottom: 1253px;

    margin-bottom: -1253px;

    position

    定位标签:position

    包含属性:relative(相对)

                       absolute(绝对)

    1.position:relative; 如果对一个元素进行相对定位,首先它将出现在它所在的位置上。然后通过设置垂直或水平位置,让这个元素"相对于"它的原始起点进行移动。(再一点,相对定位时,无论是否进行移动,元素仍然占据原来的空间。因此,移动元素会导致它覆盖其他框)

    相对定位:relative 没有脱离正常的文档流,被设置元素相对于其原始位置而进行定位,其原始占位信息仍存在

    2.position:absolute; 表示绝对定位,位置将依据浏览器左上角开始计算。 绝对定位使元素脱离文档流,因此不占据空间。普通文档流中元素的布局就像绝对定位的元素不存在时一样。(因为绝对定位的框与文档流无关,所以它们可以覆盖页面上的其他元素并可以通过z-index来控制它层级次序。z-index的值越高,它显示的越在上层。)

    绝对定位:ablution 脱离了文档流与浮动模型,独立于其他对象而存在,没有占位。

    3.父容器使用相对定位,子元素使用绝对定位后,这样子元素的位置不再相对于浏览器左上角,而是相对于父窗口左上角

    溢出:overflow

    display:none,block,inline-blck,不显示占位

    visibility:hidden显示占位

    盒子模型的理解:

    内容(CONTENT)就是盒子里装的东西;
    而填充(PADDING)就是怕盒子里装的东西(贵重的)损坏而添加的泡沫或者其它抗震的辅料;
    边框(BORDER)就是盒子本身了;至于边界(MARGIN)则说明盒子摆放的时候的不能全部堆在一起,要留一定空隙保持通风,同时也为了方便取出。在网页设计上,内容常指文字、图片等元素,但是也可以是小盒子(DIV嵌套),与现实生活中盒子不同的是,现实生活中的东西一般不能大于盒子,否则盒子会被撑坏的,而CSS盒子具有弹性,里面的东西大过盒子本身最多把它撑大,但它不会损坏的。
    填充只有宽度属性,可以理解为生活中盒子每个HTML标记都可看作一个盒子;

     因此,常出现的外边距是盒子外面的,而内边距的盒子包含的,会影响盒子的宽高

  • 相关阅读:
    条件变量:为什么要与互斥锁配套使用?为什么要使用while来避免虚假唤醒?
    【转】高性能IO之Reactor模式
    LeetCode127:单词接龙
    CF1245F: Daniel and Spring Cleaning
    权值线段树学习笔记
    luogu_4317: 花神的数论题
    luogu_2605: 基站选址
    入门平衡树: Treap
    CF1244C: The Football Season
    luogu_1156: 垃圾陷阱
  • 原文地址:https://www.cnblogs.com/myFourLeaf/p/5234143.html
Copyright © 2011-2022 走看看