结合CSS3的布局新特征谈谈常见布局方法


Posted in HTML / CSS onJanuary 22, 2016

一、常见的页面布局

在拿到设计稿时,作为一个前端人员,我们首先会做的应该是为设计图大致地划分区域,然后选择一种最合理的,结构清晰的布局。下面我先根据一些典型的网站案例列举一下几种常见的页面布局。

1、T型布局

这个是我们比较常见的布局,其页面的顶部一般放置横网站的标志或Banner广告,下方左侧是导航栏菜单,下方右侧则用于放置网页正文等主要内容。
Segmentfault的主页就是T型布局的。由于网页太长了,没有截取底部。

结合CSS3的布局新特征谈谈常见布局方法

2、国字型布局

国字型布局下最上面是网站的标题以及横幅广告条,接下来是网站的主要内寄,左右分列一些小条内容,中问是主要部分,与左右一起罗列到底,最下方是网站的一些基本信息、联系方式、版权声明等。
案例图片来自腾讯11年的一道前段笔试题,有兴趣的同学可以去看一下。2011腾讯前端面试稿

结合CSS3的布局新特征谈谈常见布局方法

3、POP布局

POP布局指页面布局像一张宣传海报,以一张精美图片作为页面的设计中心。常用于时尚类站点。优点显而易见:漂亮吸引人。缺点就是速度慢。
人大的主页就类似这种布局。

结合CSS3的布局新特征谈谈常见布局方法

4、左右布局型

顾名思义,就是网页主体分为左右两大块,多见为后台管理系统页面。一般左右布局型的页面需要做到两列等高。

如:

结合CSS3的布局新特征谈谈常见布局方法

5、上下布局型

参见苹果的官网,类似于整屏显示的网页都为上下布局。

二、如何实现——常见的布局方法

关于布局的类型就先说这么多,下面来总结一下上述的布局怎么来实现。下面提一下大家应该都很熟悉的两大布局方法。圣杯布局和双飞燕布局。其实这两种方法一般多用国字型布局上。就是针对三行三列布局的。进行相应的改造也可以用在T字型布局上。用这两种方法可以很好地解决主体部分优先加载的问题。

1、圣杯布局

结合CSS3的布局新特征谈谈常见布局方法

基础布局:

XML/HTML Code复制内容到剪贴板
  1. <div id="header"></div>  
  2. <div id="main"></div>  
  3. <div id="footer"></div>  

重点来看main部分的代码

CSS Code复制内容到剪贴板
  1. <style type="text/css">   
  2.     #main {   
  3.         overflowhidden/*修整由子元素浮动引起的高度塌陷问题*/  
  4.         zoom: 1;/*低版本ie下:触发haslayout属性,修整由子元素浮动引起的高度塌陷问题*/  
  5.         /*将主体部分左右侧预留出左右边栏大小的空白位置*/  
  6.         padding: 0 300px 0 220px;    
  7.     }   
  8.     .m_content, .m_leftside, .m_rightside {   
  9.         floatleft;   
  10.         /*目的是将左右侧边栏拉回*/  
  11.         positionrelative;   
  12.     }   
  13.     .m_content {   
  14.         width: 100%;   
  15.     }   
  16.     .m_leftside {   
  17.         width220px;   
  18.         /*由于m_content占据了100%空间,所以需要用负的margin值将左边栏拉回*/  
  19.         margin-left: -100%;   
  20.         /*将主体部分预留的左侧补白区域填充满*/  
  21.         left: -220px;   
  22.     }   
  23.     .m_rightside {   
  24.         width300px;   
  25.         /*用负的margin值将右边栏拉回自身大小个像素单位*/  
  26.         margin-left: -300px;   
  27.          /*将主体部分预留的右侧补白区域填充满*/  
  28.         left300px;   
  29.     }   
  30. </style>   
  31.   
  32. <div id="main">   
  33.     <div class="m_content">这里是主体</div>   
  34.     <div class="m_leftside">这是左侧边栏</div>   
  35.     <div class="m_rightside">这是右侧边栏</div>   
  36. </div>   
  37.   

以上就是圣杯布局方法,基本思路是运用浮动加定位的方法,缺点是代码较复杂,不能模拟三栏等高效果。

2、双飞燕布局

布局的效果跟圣杯的一样,代码有所不同。双飞燕布局的代码更加简单,只是多加了一个div用来布局。
基础布局部分代码一样。

main部分:

CSS Code复制内容到剪贴板
  1. <style>   
  2.     #main {overflowhidden;zoom: 1;}/*这里不需要加padding了*/  
  3.     .m_content, .m_leftside, .m_rightside {floatleft;}   
  4.     .m_content {width: 100%;}   
  5.     /*用左右边距将左右边栏的位置预留出来*/  
  6.     .m_c_wrap {margin-left220px;margin-right:300px;}   
  7.     .m_leftside {width220px;margin-left: -100%;}   
  8.     .m_rightside {width300px;margin-left: -300px;}   
  9. </style>   
  10.   
  11. <div id="main">   
  12.     <div class="m_content">   
  13.         <!--正真的主体开始-->   
  14.         <div class="m_c_wrap">这里是主体</div>   
  15.     </div>   
  16.     <div class="m_leftside">这是左侧边栏</div>   
  17.     <div class="m_rightside">这是右侧边栏</div>   
  18. </div>   
  19.   

了解了以上两种布局的方法后,很多布局都能写得得心应手了。但是应对多栏等高布局还有点欠缺。那么现在来谈谈多栏等高布局的方法。

3、多栏等高布局

这里详细总结了等高布局的八大方法 Click,我再谈谈实际项目中比较常用的,或者说比较简单的三种方法。

图片模拟

结合CSS3的布局新特征谈谈常见布局方法

比如我们需要做一个上图的布局,那么需要截取这样一个侧边的小图片对侧边和内容部分包裹的元素进行背景平铺,用来模拟出侧边栏的高度跟内容高度一致的视觉效果。

4、table布局

只需要将需要等高的若干栏设置display属性为table-cell;若其中一列希望是自适应宽度,还需将父元素的display设置成table,width为100%。

代码如下:

CSS Code复制内容到剪贴板
  1. <style>   
  2.     #main {display: table;width: 100%}   
  3.     .m_content {displaytable-cell;widthauto;}   
  4.     .m_rightside {displaytable-cell;width200px;}   
  5. </style>   
  6.   
  7. <div id="main">   
  8.     <div class="m_content"></div>   
  9.     <div class="m_rightside"></div>   
  10. </div>   

5、padding补白

这是前不久在网上看到的一种办法,实质就是为栏目添加一个足够大的padding-bottom值,将栏目撑开,然后再添加相同大小的负的margin-bottom值将内容移动回来。注意要在负盒子上加上overflow: hidden的属性。

代码如下:

CSS Code复制内容到剪贴板
  1. <style>   
  2.     #main {width: 100%;overflowhidden;}   
  3.     .m_content {widthauto;float:left;}   
  4.     .m_rightside {width200px;padding-bottom10000px;margin-bottom10000px;float:left;}   
  5. </style>   
  6.   
  7. <div id="main">   
  8.     <div class="m_content"></div>   
  9.     <div class="m_rightside"></div>   
  10. </div>   
  11.   

CSS2的布局方法总结得到这里就告一段落了。现在来看看CSS3新增的布局方法

一、Flex布局

因为书面上的解释比较抽象,我这里就尽量说得简单通俗一点。

要进行flex布局,需要定义一个flex容器,然后再处理其子项目。只要一个容器被定义为flex容器,那么其子元素都称作它的子项目。

flex布局的基本思想是通过flex容器来伸缩控制子项目的宽度和高度,以此来完全填充flex容器的可用空间。子项目的宽高、排列方式等都是通过设置相关属性改变的。那么以这种方式布局上述几种布局就简单多了。子项目默认的排列方式与浮动布局略为相似。

结合CSS3的布局新特征谈谈常见布局方法

1、Flex容器

flex容器的定义方式:

CSS Code复制内容到剪贴板
  1. div{display:flex}   

flex容器分为主轴和侧轴。主轴决定容器子项的排列方向。侧轴与主轴相互垂直。主轴可有垂直和水平两个方向。

flex容器可对子项进行的操控有:(即设置在容器的属性。这个很重要!)

  • 子项目的排列方向(也就是刚刚说的定义主轴)—— flex-direction
    子项目的换行方式(就是超出flex容器跨度时换不换行=。=怎么换) —— flex-wrap
    同时进行子项目排列方向和换行方式的设定 —— flex-flow
    子项目在主轴的对齐方式(想象成文字的对齐方式就容易理解了) —— justify-content
    子项目在侧轴的对齐方式 —— align-items
    同时进行子项目主轴和侧轴对齐方式的设定 —— align-content

下面来看看每一个属性的取值和实现效果

flex-direction:

CSS Code复制内容到剪贴板
  1. div{   
  2.     flex-direction: row /*水平排列,默认*/  
  3.                     <row-reverse> /*水平排列,但子项目从右侧开始排列*/  
  4.                     <column> /*垂直排列*/  
  5.                     <column-reverse>; /*垂直排列,但子项目从下侧开始排列*/  
  6.    }   

测试中我令flex容器的宽度为100px,高为200px,定义了5个未定义宽高的子项目,演示了上述的四种排列情况。效果:

结合CSS3的布局新特征谈谈常见布局方法

这里需要说明的是:在未定义子项目的伸缩方式时,默认是按子项目本身大小渲染的。

flex-wrap

CSS Code复制内容到剪贴板
  1. div{   
  2.     flex-directionnowrap    
  3.     /*当子项目在主轴上的总跨度大于主轴长度时,不进行换行,而是缩小每个子项目的跨度。默认*/  
  4.                     <wrap> /*---同上---进行换行显示*/  
  5.                     <wrap-reverse> /*从侧轴的末端进行换行(在主轴的排列方向不变)。实际不常用*/  
  6.    }   

测试中我定义了每个子项目的宽度为30px,flex容器还是原来的100px宽。效果:

结合CSS3的布局新特征谈谈常见布局方法

结合CSS3的布局新特征谈谈常见布局方法

结合CSS3的布局新特征谈谈常见布局方法

由于这里设定的是子项目宽度,所以对于主轴为垂直方向的容器子项没什么影响。

flex-flow

CSS Code复制内容到剪贴板
  1. div{   
  2.     flex-flow: <flex-direction> || <flex-wrap>;   
  3.     /*就是上述两个属性的结合简写 默认:flex-flow:row nowrap*/  
  4.    }   

justify-content

CSS Code复制内容到剪贴板
  1. div{   
  2.     justify-content: flex-start /*以项目开始进行排列的那端进行对齐,默认左对齐*/  
  3.                      <flex-end> /*以项目结束排列的那端进行对齐,默认右对齐*/  
  4.                      <center/*居中对齐,默认水平居中*/  
  5.            
  6.         /*两端对齐且项目之间的间隔都相等(贴边显示)*/  
  7.                      <space-between>    
  8.             
  9.          /*第一个元素前的空间以及最后一个元素后的空间为其他空白空间的一半下平均分布*/  
  10.                      <space-around>   
  11.                        
  12.    }   

测试时我设定了flex容器宽高都为200px,子项没有设定宽高。 效果:

主轴为水平方向时:

结合CSS3的布局新特征谈谈常见布局方法

主轴为水平垂直时:

结合CSS3的布局新特征谈谈常见布局方法

align-items

CSS Code复制内容到剪贴板
  1. div{   
  2.     align-items: flex-start /*侧轴起始点对齐*/  
  3.                  <flex-end> /*侧轴终止点对齐*/  
  4.                  <center/*侧轴中点点对齐*/  
  5.            
  6.         /*项目的第一行文字的基线对齐*/  
  7.                  <baselinebaseline>    
  8.             
  9.          /*默认值,如果项目未设定宽(高度),则占满整个容器侧轴跨度*/  
  10.                  <stretch>   
  11.                        
  12.    }     

结合CSS3的布局新特征谈谈常见布局方法

最后的baseline看起来跟flex-start没啥区别,因为我给每个子项设置高度。设置高度后:

结合CSS3的布局新特征谈谈常见布局方法

align-content

CSS Code复制内容到剪贴板
  1. div{   
  2.     align-content: flex-start /*与侧轴起始点对齐*/  
  3.                    <flex-end> /*与侧轴终止点对齐*/  
  4.                    <center/*与侧轴中点点对齐*/  
  5.            
  6.         /*与侧轴两端对齐,各子项在各轴上的间距相等*/  
  7.                    <space-between>    
  8.          /*各子项在各轴上的间距相等,项目间距比边距间距大一倍*/             
  9.                    <space-around>          
  10.          /*项目占满整个侧轴*/  
  11.                    <stretch>   
  12.                        
  13.    }   

上面已提到过,对于单轴线的子项来说,本属性不起作用。但是默认情况下是只有子项目是一根轴线的(flex-wrap默认是nowrap),所以要使这个属性看到效果,必须设置flex-wrap。
已下是flex-wrap为wrap的几种情况。

结合CSS3的布局新特征谈谈常见布局方法

子项

以下这些属性设置在子项上。

子项自身的操控有:

  • 子项目的排列顺序 —— order
    子项目的放大比例 —— flex-grow
    默认为0,即如果主轴上有剩余空间,也不放大子项。
    子项目的缩小比例 —— flex-shrink
    默认为1,即如果主轴空间不足,即缩小子项。
    同时设定前三者 —— flex
    设定单个项目其自身在侧轴的对齐方式 —— align-self

那么分别来看看每个属性的取值和实现效果()

order

利用这个属性可以解决某个区块优先加载但是在页面上的显示较靠后的问题。

CSS Code复制内容到剪贴板
  1. div .item {order:<integer>}   

/*数值越大,排列越靠后。默认为0*/

结合CSS3的布局新特征谈谈常见布局方法

这里我设置了第一个子项的order为1。

flex-grow

如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的空间将比其他项多一倍。

CSS Code复制内容到剪贴板
  1. div .item {flex-grow:<number>}     
  2.   

设置flex-grow前:

结合CSS3的布局新特征谈谈常见布局方法

设置后:

结合CSS3的布局新特征谈谈常见布局方法

第二个项目的flex-grow为2,其他为0:
<注意这个时候就不需要给子项设置宽度了>

结合CSS3的布局新特征谈谈常见布局方法

flex-shrink

如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。

CSS Code复制内容到剪贴板
  1. div .item {flex-shrink:<number>}    

我给每个子项设定了200px的宽度,而flex容器宽度为500px,这时候若不设置flex-shrink,则每个项目都会以相同比例缩小自身大小来适应容器。
此时我给第二个项目设置了flex-shrink: 0; 该项目大小不变。

结合CSS3的布局新特征谈谈常见布局方法

flex-basis

这个属性设置子项在主轴上的跨度,简单地说就是设置宽高。

CSS Code复制内容到剪贴板
  1. div .item {flex-basis:<length> | auto/*auto是默认值,就是项目本身大小*/}    

flex

这个就是把flex-grow、flew-shrink、flex-basis结合一起的写法啦=。=

CSS Code复制内容到剪贴板
  1. div .item {flex:none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]}    

flex-grow必须。默认为0 1 auto。

align-self

这个属性用来单独设定某个子项目在侧轴的对齐方式。

CSS Code复制内容到剪贴板
  1. div .item {align-self:flex-start|flex-end|center|baselinebaseline|stretch}    
  2.   

有关flex布局的方法就总结和介绍到这里了。

栗子(利用flex进行上述几种布局实现)

下边把利用flex布局实现上述几种布局的代码贴出来(可有多种实现方法)。

T布局

结合CSS3的布局新特征谈谈常见布局方法

CSS Code复制内容到剪贴板
  1. <!--css-->   
  2. <style type="text/css">   
  3.     *{margin: 0;padding: 0;}   
  4.     header, footer {background: sandybrown;height50px;}   
  5.     section {display: flex;align-items: flex-start;height500px;}   
  6.     article {order: 1;flex: 3;align-self: stretch;background: wheat;}   
  7.     aside {flex: 1;background: seashell;height100px;}   
  8. </style>   
  9.   
  10. <!--html-->   
  11. <header></header>   
  12. <section>   
  13.     <article></article>   
  14.     <aside></aside>   
  15. </section>   
  16. <footer></footer>   
  17.   

国字型布局

结合CSS3的布局新特征谈谈常见布局方法

CSS Code复制内容到剪贴板
  1. <!--css-->   
  2. <style type="text/css">   
  3.     *{margin: 0;padding: 0;}   
  4.     header, footer {background: sandybrown;height50px;}   
  5.     section {display: flex;align-items: flex-start;height500px;}   
  6.     article {order: 1;flex: 3;align-self: stretch;background: wheat;}   
  7.     aside {flex: 1;background: seashell;height100px;}   
  8.     section.sidebar {order: 2;flex: 1;height100px;background: seashell;}   
  9. </style>   
  10.   
  11. <!--html-->   
  12. <header></header>   
  13. <section>   
  14.     <article></article>   
  15.     <aside></aside>   
  16.     <section class="sidebar"></section>   
  17. </section>   
  18. <footer></footer>   
  19.   

等高布局

真心简单。

结合CSS3的布局新特征谈谈常见布局方法

CSS Code复制内容到剪贴板
  1. <!--css-->   
  2. <style type="text/css">   
  3.     *{margin: 0;padding: 0;}   
  4.     html,body {height: 100%;}   
  5.     section {display: flex;height: 100%;}   
  6.     article {order: 1;flex: 3;background: wheat;}   
  7.     aside {flex: 1;background: seashell;}   
  8. </style>   
  9.   
  10. <!--html-->   
  11. <header></header>   
  12. <section>   
  13.     <article></article>   
  14.     <aside></aside>   
  15.     <section class="sidebar"></section>   
  16. </section>   
  17. <footer></footer>   

以上就是本文的全部内容,希望对大家的学习有所帮助。

HTML / CSS 相关文章推荐
基于CSS3特效之动画:animation的应用
May 09 HTML / CSS
深入CSS3 动画效果的总结详解
May 09 HTML / CSS
css3实现可滑动跳转的分页插件示例
May 08 HTML / CSS
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
Sep 10 HTML / CSS
HTML5 b和i标记将被赋予真正的语义
Jul 16 HTML / CSS
HTML5 Web Database 数据库的SQL语句的使用方法
Dec 09 HTML / CSS
html5中为audio标签增加停止按钮动作实现方法
Jan 04 HTML / CSS
使用分层画布来优化HTML5渲染的教程
May 08 HTML / CSS
简单介绍HTML5中audio标签的使用
Sep 24 HTML / CSS
canvas实现烟花的示例代码
Jan 16 HTML / CSS
关于解决iframe标签嵌套问题的解决方法
Mar 04 HTML / CSS
html5实现输入框fixed定位在屏幕最底部兼容性
Jul 03 HTML / CSS
css3 border旋转时的动画应用
Jan 22 #HTML / CSS
CSS3实现swap交换动画
Jan 19 #HTML / CSS
基于CSS3制作立体效果导航菜单
Jan 12 #HTML / CSS
纯HTML5+CSS3制作图片旋转
Jan 12 #HTML / CSS
CSS3 text shadow字体阴影效果
Jan 08 #HTML / CSS
CSS3圆角和渐变2种常用功能详解
Jan 06 #HTML / CSS
使用CSS3的appearance属性改变元素的外观的方法
Dec 12 #HTML / CSS
You might like
php的日期处理函数及uchome的function_coomon中日期处理函数的研究
2011/01/12 PHP
PHP调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
深入理解require与require_once与include以及include_once的区别
2013/06/05 PHP
实现获取http内容的php函数分享
2014/02/16 PHP
PHP基于phpqrcode生成带LOGO图像的二维码实例
2015/07/10 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
2017/04/18 PHP
php实现的redis缓存类定义与使用方法示例
2017/08/09 PHP
百度地图api应用标注地理位置信息(js版)
2013/02/01 Javascript
EXTjs4.0的store的findRecord的BUG演示代码
2013/06/08 Javascript
JS图像无缝滚动脚本非常好用
2014/02/10 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
Javascript将数字转化成为货币格式字符串
2016/06/22 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
2016/10/25 Javascript
anime.js 实现带有描边动画效果的复选框(推荐)
2017/12/24 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
vue + axios get下载文件功能
2019/09/25 Javascript
解决Angularjs异步操作后台请求用$q.all排列先后顺序问题
2019/11/29 Javascript
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
vue项目接口域名动态获取操作
2020/08/13 Javascript
Windows下Anaconda的安装和简单使用方法
2018/01/04 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
2018/07/13 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
浅谈pandas dataframe对除数是零的处理
2020/07/20 Python
python实现视频压缩功能
2020/12/18 Python
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
2014/06/16 HTML / CSS
HTML5头部标签的一些常用信息小结
2016/10/23 HTML / CSS
ALDO英国官网:加拿大女鞋品牌
2018/02/19 全球购物
耐克亚太地区:Nike APAC
2019/12/07 全球购物
平面设计师工作职责范文
2013/12/03 职场文书
老师给学生的表扬信
2014/01/17 职场文书
年终晚会主持词
2014/03/25 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
2015年高中语文教学总结
2015/08/18 职场文书