• 网页整体布局完全剖析—剖完你不进来看一下么?


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




                 



    一、单列布局


    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






  • 相关阅读:
    NOIP2017 时间复杂度 大模拟
    【Python】CV2的一些基本操作
    【Python】类、对象、self
    【Ubuntu18.04】清空回收站
    小飞机可以解决git clone没有返回的问题吗?
    sqlserver2005 远程服务器数据 完全拷贝 到本地数据库
    Microsoft Visual Studio 2005 多线程时 解决不是该线程创建的来访问
    MS SqL2000 数据库置疑状态的解决方法[转]
    vue 函数配置项watch以及函数 $watch 源码分享
    Vue生命周期之beforeCreate vue 生命周期详解
  • 原文地址:https://www.cnblogs.com/star91/p/5665090.html
Copyright © 2020-2023  润新知