zoukankan      html  css  js  c++  java
  • 网页整体布局完全剖析—剖完你不进来看一下么?

    作为前端小白,最基本的就是写网页了(虽然前端现在基本上可包揽全宇宙的事了),排网页更是基本生存技能了。本文总结了几乎所有的网页总体布局。




                 



    一、单列布局


    1.单列固宽

    思路:设置div的左右margin为auto

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>1-1-1 布局固定宽度</title>
    6. <style type="text/css">
    7. #header,#footer,#content{
    8. margin:0 auto;
    9. width:768px;
    10. margin-top: 10px;
    11. }
    12. #header{
    13. border: 2px solid red;
    14. }
    15. #content{
    16. border: 2px solid blue;
    17. }
    18. #footer{
    19. border: 2px solid green;
    20. }
    21. </style>
    22. </head>
    23. <body>
    24. <div id="header">
    25. <h2>Page Header</h2>
    26. <p>这是一行文本,这里作为样例,显示在布局框中。<br/>
    27. 这是一行文本,这里作为样例,显示在布局框中。 </p>
    28. </div>
    29. <div id="content">
    30. <h2>Page Content</h2>
    31. <p>
    32. 这是一行文本,这里作为样例,显示在布局框中。<br />
    33. 这是一行文本,这里作为样例,显示在布局框中。
    34. </p>
    35. <p>
    36. 这是一行文本,这里作为样例,显示在布局框中。<br />
    37. 这是一行文本,这里作为样例,显示在布局框中。
    38. </p>
    39. </div>
    40. <div id="footer">
    41. <h2>Page Footer</h2>
    42. <p>
    43. 这是一行文本,这里作为样例,显示在布局框中。
    44. </p>
    45. </div>
    46. </body>
    47. </html>


     2.单列变宽

    思路设置宽度为相对宽度,常用百分比

    1. #header,#footer,#content{
    2. margin:0 auto;
    3. width:70%;
    4. margin-top: 10px;
    5. }



    二.两列布局



     

    文档结构:

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <metacharset="utf-8"/>
    5. <title>两列布局</title>
    6. <styletype="text/css">
    7. #header,#footer,#container{
    8. margin:0 auto;
    9. 768px;
    10. margin-top: 10px;
    11. }
    12. #header{
    13. border: 2px solid #f00;
    14. }
    15. #container{
    16. border: 2px solid #797979;
    17. }
    18. #footer{
    19. border: 2px solid #080;
    20. }
    21. </style>
    22. </head>
    23. <body>
    24. <divid="header">
    25. <h2>Page Header</h2>
    26. <p>这是一行文本,这里作为样例,显示在布局框中。<br/>
    27. 这是一行文本,这里作为样例,显示在布局框中。 </p>
    28. </div>
    29. <divid="container">
    30. <divid="content">
    31. <h2>Page Content</h2>
    32. <p>对于一个网页设计者来说,HTML语言一定不会感到陌生,因为它是所有网页制作的基础。但是如果希望网页能够美观、大方,并且升级方便,维护轻松,那么仅仅HTML是不够的,CSS在这中间扮演着重要的角色。本课从CSS的基本概念出发,介绍CSS语言的特点,以及如何在网页中引入CSS,并对CSS进行初步的体验。</p>
    33. </div>
    34. <divid="side">
    35. <h2>Side Bar</h2>
    36. <p>
    37. 对于一个网页设计者来说,HTML语言一定不会感到陌生,因为它是所有网页制作的基础。但是如果希望网页能够美观、大方,并且升级方便,维护轻松,那么仅仅HTML是不够的,CSS在这中间扮演着重要的角色。</p>
    38. <p>
    39. 但是如果希望网页能够美观、大方,并且升级方便,维护轻松,那么仅仅HTML是不够的,CSS在这中间扮演着重要的角色。
    40. </p>
    41. </div>
    42. </div>
    43. <divid="footer">
    44. <h2>Page Footer</h2>
    45. <p>这是一行文本,这里作为样例,显示在布局框中。</p>
    46. </div>
    47. </body>
    48. </html>

    1.两列固宽


    思路一:绝对定位法,使content相对于container绝对定位,脱离文档流,side就会向上移动占据原来content所在的位置,然后将content的宽度和side的左margin设置为相同的值,就正好可以保证它们并列紧挨着放置,且不会相互重叠。

    1. #container{
    2. position: relative;
    3. }
    4. #content{
    5. border: 2px solid #00f;
    6. position: absolute;
    7. top: 0;
    8. left: 0;
    9. width: 500px;
    10. }
    11. #side{
    12. border: 2px solid #f90;
    13. margin: 0 0 0 500px;
    14. }



    使用绝对定位法有一个固有的缺陷:当右边的side比左边的content高时,显示效果不会有问题,但是如果左边的content比右边的side高的话,由于content已经脱离了文档流,对包裹的container这个div的高度不会产生影响,而footer是根据side栏确定的,content栏会遮蔽部分甚至全部footer栏。


    思路二:浮动法,将content和side都设置为向左浮动,二者的宽度等于总宽度。

    在上面的例子中稍作修改,将container的position属性去掉,添加下面的样式:

    1. #content{
    2. float: left;
    3. width: 500px;
    4. border: 2px solid#00f;
    5. }
    6. #side{
    7. float: left;
    8. width: 256px;
    9. border: 2px solid#f90;
    10. }



    此时footer的位置不太正常。container的边框也被缩成一条线,需要清除浮动对于包裹元素高度的影响。

    1. #container:after{
    2. content: ".";
    3. height: 0;
    4. display: block;
    5. visibility: hidden;
    6. clear: both;
    7. }

    这样就显示正常了,使用浮动的好处是并排的两列中无论哪一列内容变长,都不会影响布局。


    2.两列变宽


    2.1两列等比例变宽

     思路一:同固定宽度的绝对定位,不同的是使用百分比宽度,container等外层宽度相对浏览器窗口,content和side相对于外层div定义宽度。

     首先将重新设置外层div样式:

    1. #header,#footer,#container {
    2. margin: 0 auto;
    3. width: 85%;
    4. }

    再设置内层div样式

    1. #container {
    2. position: relative;
    3. }
    4. #content {
    5. position: absolute;
    6. top: 0;
    7. left: 0;
    8. width: 66%;
    9. border: 2px solid #00f;
    10. }
    11. #side {
    12. width: 30%;
    13. margin: 0 0 0 67%;
    14. border: 2px solid #f90;
    15. }

     思路二:浮动法

    1. #content {
    2. float:left;
    3. width: 66%;
    4. border: 2px solid #00f;
    5. }
    6. #side {
    7. float: right;
    8. width: 30%;
    9. border: 2px solid #f90;
    10. }
    11. #container:after{
    12. content: ".";
    13. height: 0;
    14. display: block;
    15. visibility: hidden;
    16. clear: both;
    17. }




    2.2两列单列变宽


     思路一:绝对定位法

    1. #header,
    2. #footer,
    3. #container {
    4. margin: 10px auto;
    5. width: 85%;
    6. }
    7. #container {
    8. position: relative;
    9. }
    10. #side {
    11. position: absolute;
    12. top: 0;right: 0;
    13. width: 300px;
    14. border: 2px solid #f90;
    15. }
    16. #content {
    17. margin: 0 300px 0 0;
    18. border: 2px solid #00f;
    19. }

    例子中我们设置side为固定宽度300px,content为变宽,结果如下图所示,由于内容较高的side脱离了文档流,因此撑不起container的高度,所以使用这种方法时要注意保证变宽列的高度是最高的。使固定宽度列绝对定位。


     思路二:浮动法


     对于单列变宽如果像之前一样,直接使用浮动的话:

    1. #content {
    2. float:left;
    3. border: 2px solid #00f;
    4. }
    5. #side {
    6. float: right;
    7. width: 300px;
    8. border: 2px solid #f90;
    9. }
    10. #container:after{
    11. content: ".";
    12. height: 0;
    13. display: block;
    14. visibility: hidden;
    15. clear: both;
    16. }

    结果并不是预期的,由于content没有设置宽度,所以浮动过后仍然占据整行side会在下一行浮动。

    解决办法是在content外面再套一层div,使它的宽度为100%,也就是container的宽度。然后通过将左侧的margin设置为负的300像素,就使它向左平移了300像素。再将content的左侧margin设置为正的300像素,就实现了100%-300px这个无法表达的宽度。我们称这种方法为“改进的浮动法”。


    1. #contentWrap{
    2. margin-left: -300px;
    3. float: left;
    4. width: 100%;
    5. }
    6. #content {
    7. margin-left: 300px;
    8. border: 2px solid #00f;
    9. }
    10. #side {
    11. float: right;
    12. width: 290px;
    13. border: 2px solid #f90;
    14. }
    15. #container:after{
    16. content: ".";
    17. height: 0;
    18. display: block;
    19. visibility: hidden;
    20. clear: both;
    21. }


     三、三列布局


    文档结构:

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <metacharset="utf-8"/>
    5. <title>三列布局</title>
    6. <styletype="text/css">
    7. #header,#footer,#container{
    8. margin:0 auto;
    9. 768px;
    10. margin-top: 10px;
    11. }
    12. #header{
    13. border: 2px solid #f00;
    14. }
    15. #container{
    16. border: 2px solid #797979;
    17. }
    18. #footer{
    19. border: 2px solid #080;
    20. }
    21. </style>
    22. </head>
    23. <body>
    24. <divid="header">
    25. <h2>Page Header</h2>
    26. <p>这是一行文本,这里作为样例,显示在布局框中。<br/>
    27. 这是一行文本,这里作为样例,显示在布局框中。</p>
    28. </div>
    29. <divid="container">
    30. <divid="navi">
    31. <h2>Navi Bar 1</h2>
    32. <p>对于一个网页设计者来说,HTML语言一定不会感到陌生,因为它是所有网页制作的基础。但是如果希望网页能够美观、大方,并且升级方便,维护轻松,那么仅仅HTML是不够的,CSS在这中间扮演着重要的角色。</p>
    33. </div>
    34. <divid="content">
    35. <h2>Page Content</h2>
    36. <p>对于一个网页设计者来说,HTML语言一定不会感到陌生,因为它是所有网页制作的基础。但是如果希望网页能够美观、大方,并且升级方便,维护轻松,那么仅仅HTML是不够的,CSS在这中间扮演着重要的角色。本课从CSS的基本概念出发,介绍CSS语言的特点,以及如何在网页中引入CSS,并对CSS进行初步的体验。</p>
    37. </div>
    38. <divid="side">
    39. <h2>Side Bar</h2>
    40. <p>对于一个网页设计者来说,HTML语言一定不会感到陌生,因为它是所有网页制作的基础。但是如果希望网页能够美观、大方,并且升级方便,维护轻松,那么仅仅HTML是不够的,CSS在这中间扮演着重要的角色。</p>
    41. <p>但是如果希望网页能够美观、大方,并且升级方便,维护轻松,那么仅仅HTML是不够的,CSS在这中间扮演着重要的角色。</p>
    42. </div>
    43. </div>
    44. <divid="footer">
    45. <h2>Page Footer</h2>
    46. <p>这是一行文本,这里作为样例,显示在布局框中。</p>
    47. </div>
    48. </body>
    49. </html>


    1、三列固定宽度布局

     思路一:绝对对位法,原理同两列布局,只不过需要设置content的左右margin

    1. container{
    2. position:relative;
    3. }
    4. #navi{
    5. position:absolute;
    6. top:0;
    7. left:0;
    8. width:200px;
    9. border: 2px solid #900;
    10. }
    11. #content{
    12. margin:0 200px 0 200px;
    13. width:360px;
    14. border: 2px solid #00f;
    15. }
    16. #content img{
    17. float:right;
    18. }
    19. #side{
    20. position:absolute;
    21. top:0;
    22. right:0;
    23. width:200px;
    24. border: 2px solid #f90;
    25. }



     思路二:浮动法,原理同两列布局

    1. #navi{
    2. float: left;
    3. width: 200px;
    4. border: 2px solid #900;
    5. }
    6. #content{
    7. float: left;
    8. width: 360px;
    9. border: 2px solid #00f;
    10. }
    11. #side{
    12. float: left;
    13. width: 196px;//为了避免边框宽度对浮动布局产生影响,将宽度减小了一点
    14. border: 2px solid #f90;
    15. }
    16. #container:after{
    17. content: ".";
    18. height: 0;
    19. display: block;
    20. visibility: hidden;
    21. clear: both;
    22. }

    2.三列变宽布局

    2.1三列等比例变宽布局

    三列等比例伸缩适应总宽度,与前面介绍的两列等宽度思想一样,只要分配好每一列的百分比就可以了。这里就直接贴出代码了

     思路一:浮动法

    1. #header,#footer,#container{ margin:0 auto; 85%; margin-top: 10px; }  

    2. #navi{
    3. float: left;
    4. width: 20%;
    5. border: 2px solid #900;
    6. }
    7. #content{
    8. float: left;
    9. width: 60%;
    10. border: 2px solid #00f;
    11. }
    12. #side{
    13. float: left;
    14. width: 15%;
    15. border: 2px solid #f90;
    16. }
    17. #container:after{
    18. content: ".";
    19. height: 0;
    20. display: block;
    21. visibility: hidden;
    22. clear: both;
    23. }
    思路二:绝对定位
    1. #header,#footer,#container{ margin:0 auto; 85%; margin-top: 10px; }


    2. #container{
    3. position: relative;
    4. }
    5. #navi{
    6. position: absolute;
    7. left: 0;
    8. top: 0;
    9. width: 20%;
    10. border: 2px solid #900;
    11. }
    12. #content{
    13. width: 60%;
    14. margin: 0 15% 0 20%;
    15. border: 2px solid #00f;
    16. }
    17. #side{
    18. position: absolute;
    19. right: 0;
    20. top: 0;
    21. width: 15%;
    22. border: 2px solid #f90;
    23. }
    同样绝对定位要保证中间的内容栏要有足够的高度撑起container,使footer位于正确位置。

    2.2 单列固定,另两列变宽

    2.2.1 单侧列固定

    绝对定位的方法这里就不介绍了,根据前面介绍的两列单列变宽布局中提到的改进的浮动法,我们很容易想到把左边的navi和content当做一个整体加上一层包裹div,side为固定宽度200px

    这样做能不能达到预期的效果呢,答案是否定的,当warp容器中有两个浮动的活动列时,就需要分别设置宽度,假设宽度分别为40%和60%(为了避免边框宽度等造成的影响,实际可以使加起来略小于100%,在下面的例子中,我们使用CSS3中新的box-sizing属性可以避免边框的影响)。当时注意到这里的wrap的宽度等于container的宽度,因此这里的40%并不是总宽度减去side的宽度以后的40%,而是总宽度的40%,这显然是不对的

    解决的方法是在里面再套一层div.

     

    新增加的innerWrap是以标准流方式存在的,宽度会自然伸展,给其设置200像素的左margin,因此它的宽度就是总宽度减去200px,这样里面的navi和content就会都以这个新宽度为宽度基准。


    1. <style type="text/css">
    2. div{
    3. box-sizing: border-box;//这里通过css3新属性改变盒模型,从而避免边框的影响
    4. }
    5. #header,#footer,#container{
    6. margin:0 auto;
    7. width:85%;
    8. margin-top: 10px;
    9. }
    10. #header{
    11. border: 2px solid #f00;
    12. }
    13. #container{
    14. border: 2px solid #797979;
    15. }
    16. #footer{
    17. border: 2px solid #080;
    18. }
    19. #outerWrap{
    20. float: left;
    21. width: 100%;
    22. margin-left: -200px;
    23. }
    24. #innerWrap{
    25. margin-left: 200px;
    26. }
    27. #navi{
    28. float: left;
    29. width: 40%;
    30. border: 2px solid #900;
    31. }
    32. #content{
    33. float: right;
    34. width: 60%;
    35. border: 2px solid #00f;
    36. }
    37. #side{
    38. float: right;
    39. width: 200px;
    40. border: 2px solid #f90;
    41. }
    42. #container:after{
    43. content: ".";
    44. height: 0;
    45. display: block;
    46. visibility: hidden;
    47. clear: both;
    48. }
    49. </style>


     
     2.2.2 中间列固定,两侧变宽
    假设现在希望中间列固定宽度300px,两边列等宽(不等宽也同理),此时制作的关键是实现(100%-300px)/2的宽度。根据前面使用改进浮动法和负的margin的经验,我们可以在navi和side两个div外面分别套一层div.

     

    1. <style type="text/css">
    2. div{
    3. box-sizing: border-box;
    4. }
    5. #header,#footer,#container{
    6. margin:0 auto;
    7. width:85%;
    8. margin-top: 10px;
    9. }
    10. #header{
    11. border: 2px solid #f00;
    12. }
    13. #container{
    14. border: 2px solid #797979;
    15. }
    16. #footer{
    17. border: 2px solid #080;
    18. }
    19. #naviWrap{
    20. float: left;
    21. width: 50%;
    22. margin-left: -150px;
    23. }
    24. #sideWrap{
    25. float: right;
    26. width: 50%;
    27. margin-right: -150px;
    28. }
    29. #navi{
    30. margin-left: 150px;
    31. border: 2px solid #900;
    32. }
    33. #content{
    34. float: left;
    35. width: 300px;
    36. border: 2px solid #00f;
    37. }
    38. #side{
    39. margin-right: 150px;
    40. border: 2px solid #f90;
    41. }
    42. #container:after{
    43. content: ".";
    44. height: 0;
    45. display: block;
    46. visibility: hidden;
    47. clear: both;
    48. }
    49. </style>

     将左侧的naviWrap设置为50%宽度,向左浮动,并通过将左侧的margin设置为-150像素,向左平移150像素。然后在里面的navi中,则侧margin设置为150像素,补偿回来这150像素。右侧同理。

     2.3单列变宽,另两列固定


     2.3.1两侧列固定,中间列变宽
    思路一:绝对定位法
    1. <style type="text/css">
    2. #header,#footer,#container{
    3. margin:0 auto;
    4. width:85%;
    5. margin-top: 10px;
    6. }
    7. #header{
    8. border: 2px solid #f00;
    9. }
    10. #container{
    11. border: 2px solid #797979;
    12. }
    13. #footer{
    14. border: 2px solid #080;
    15. }
    16. #container{
    17. position: relative;
    18. }
    19. #navi{
    20. position: absolute;
    21. left: 0;
    22. top: 0;
    23. width: 150px;
    24. border: 2px solid #900;
    25. }
    26. #side{
    27. position: absolute;
    28. right: 0;
    29. top: 0;
    30. width: 250px;
    31. border: 2px solid #f90;
    32. }
    33. #content{
    34. margin: 0 250px 0 150px;
    35. border: 2px solid #00f;
    36. }
    37. </style>
    将把container的 position属性设置为relative, 使它成为它的下级元索的绝对定位基准,然后将两边列设置固定宽度并分别靠在最左和最右端 ,content仍然在标准流中 ,将它的右 margin 设置为两 个绝对定位列的宽度 ,正好让出它们的位置 ,这样就实现 三者的并列放置。当然 ,这种方法制作的三列布局无法避免“绝对定位”造成的固有缺陷 ,即页脚永远紧贴中间的content列 ,而不管左右两侧列的高度. 如果中间列的高度小于两侧列中的一个或两个时,会造成重叠的现象。
    思路二:浮动法(参考《CSS设计指南(第三版)》)
    实现三栏布局且让中栏内容区流动(不固定)的核心问题,就是处理右栏的定位,并在中栏内容区大小改变时控制右栏与布局的关系。Web 开发人员 Ryan Brill 给出的解决方案是控制两个外包装(通过 ID 值为 wrap容器的外边距。其中一个外包装包围所有三栏,另一个外包装只包围左栏和中栏。
     

    1. <style type="text/css">
    2. div{
    3. box-sizing: border-box;
    4. }
    5. #header,#footer,#container{
    6. margin:0 auto;
    7. width:85%;
    8. margin-top: 10px;
    9. }
    10. #header{
    11. border: 2px solid #f00;
    12. }
    13. #container{
    14. border: 2px solid #797979;
    15. }
    16. #footer{
    17. border: 2px solid #080;
    18. }
    19. #wrap{
    20. float: left;
    21. width: 100%;
    22. margin-right: -250px;/*把右栏拉到区块外边距腾出的位置上*/
    23. }
    24. #navi{
    25. float: left;
    26. width: 150px;
    27. border: 2px solid #900;
    28. }
    29. #content{
    30. width: auto;
    31. margin-left: 150px;
    32. margin-right: 250px;/*在流动居中的栏右侧腾出空间 */
    33. border: 2px solid #00f;
    34. }
    35. #side{
    36. float: left;
    37. width: 250px;
    38. border: 2px solid #f90;
    39. }
    40. #footer{
    41. clear: both;
    42. }
    43. </style>
    下面简单说明其原理。三栏中的右栏是 250像素宽。因为wrap的宽度为100%,所以side栏默认会在下一行显示,给wrap装上250像素的负右外边距,这会影响wrap与相邻块side的距离,使side栏再次进入上一行并覆盖了wrap右侧的部分空间,这时我们给content右侧加上正的margin为250像素,使其不被side栏覆盖,左侧加上150像素,腾出空间给navi.(甚是巧妙,不好懂)。
    2.3.2.中列和侧列宽度固定,另外一个侧列变宽
    思路一:绝对定位法
    1. <style type="text/css">
    2. #header,#footer,#container{
    3. margin:0 auto;
    4. width:85%;
    5. margin-top: 10px;
    6. }
    7. #header{
    8. border: 2px solid #f00;
    9. }
    10. #container{
    11. border: 2px solid #797979;
    12. }
    13. #footer{
    14. border: 2px solid #080;
    15. }
    16. #container{
    17. position: relative;
    18. }
    19. #navi{
    20. position: absolute;
    21. left: 0;
    22. top: 0;
    23. width: 150px;
    24. border: 2px solid #900;
    25. }
    26. #content{
    27. position: absolute;
    28. left: 150px;
    29. top: 0px;
    30. width: 250px;
    31. border: 2px solid #00f;
    32. }
    33. #side{
    34. margin: 0 0 0 400px;
    35. border: 2px solid #f90;
    36. }
    37. </style>

    思路二:改进浮动法

    假设仍然希望左侧的navi和content列的宽度分别固定为150px和250px,右侧的side列变宽。那么side列的宽度等于100%-150px-250px。因此根据改进的浮动法,在side列的外面再套一个sideWrap列,使sideWrap的宽度为100%,并通过设置负的margin,使它向右平移400像素,然后再对side列设置正的margin,限制右边界。

     
    1. <style type="text/css">
    2. div{
    3. box-sizing: border-box;
    4. }
    5. #header,#footer,#container{
    6. margin:0 auto;
    7. width:85%;
    8. margin-top: 10px;
    9. }
    10. #header{
    11. border: 2px solid #f00;
    12. }
    13. #container{
    14. border: 2px solid #797979;
    15. }
    16. #footer{
    17. border: 2px solid #080;
    18. }
    19. #sideWrap{
    20. float: right;
    21. width: 100%;
    22. margin-right: -400px;
    23. }
    24. #navi{
    25. float: left;
    26. width: 150px;
    27. border: 2px solid #900;
    28. }
    29. #content{
    30. float: left;
    31. width: 250px;
    32. border: 2px solid #00f;
    33. }
    34. #side{
    35. margin-right: 400px;
    36. border: 2px solid #f90;
    37. }
    38. #container:after{
    39. content: ".";
    40. height: 0;
    41. display: block;
    42. visibility: hidden;
    43. clear: both;
    44. }
    45. </style>
    总结:每一种布局不一定只有一种实现方式,尤其是css3的伸缩盒出现以后,实现起来更是多种多样,由于篇幅原因,这里只介绍了几种通用的方法。



    参考:
    《CSS设计彻底研究》-温谦
    《CSS设计指南》—Charles Wyke-Smith






  • 相关阅读:
    sfs2x 连接 mongodb
    java websocket
    webstorm 4.0 注册码
    解决 sfs2 admin tool 找不到扩展
    window 注册表五大类
    opengl 学习第二日
    java google Protobuf
    扩展 java sencha touch PhonegapPlugin
    sencha touch2 kryonet socket phonegap 通信 作者:围城
    sencha touch2 layout 笔记
  • 原文地址:https://www.cnblogs.com/star91/p/5665090.html
Copyright © 2011-2022 走看看