本文主要对 CSS 布局中常见的经典问题进行简单说明,并提供相关解决方案的参考链接,涉及到三栏式布局,负 margin,清除浮动,居中布局,响应式设计,Flexbox 布局,等等。
下面几个入门教程不错:
1、幕课网 - HTML+CSS基础课程:偏基础,可以在线练习和预览
链接:http://www.imooc.com/learn/9
2、MDN - CSS入门教程: MDN 的官方文档
链接:https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Getting_started
3、学习 CSS 布局:排版和配色特别舒服,简短但不深入,适合概览入门
链接:http://zh.learnlayout.com/
主要就是经典的绝对定位,相对定位问题。
1、10个文档学布局:通过十个例子讲解布局,主要涉及相对布局,绝对布局,浮动。
链接:http://www.barelyfitz.com/screencast/html-training/css/positioning/
2、百度前端学院笔记 - 理解绝对定位:文章本身一般,几篇参考文献比较详细
链接:http://ife.baidu.com/note/detail/id/662
3、HTML和CSS高级指南之二——定位详解(译文):介绍浮动的使用,详细介绍定位的技巧,包括如何准确的给元素在 X 轴、Y 轴和 Z 轴定位
链接:http://www.w3cplus.com/css/advanced-html-css-lesson2-detailed-css-positioning.html
涉及浮动和清除浮动,主要讲解“圣杯”和“双飞翼”两种解决方法。这两种方法实现的都是三栏布局,两边的盒子宽度固定,中间盒子自适应,它们实现的效果是一样的,差别在于其实现的思想。
圣杯:父盒子包含三个子盒子(左,中,右)
中间盒子的宽度设置为 width: 100%; 独占一行;
使用负边距(均是 margin-left)把左右两边的盒子都拉上去和中间盒子同一行;
父盒子设置左右的 padding 来为左右盒子留位置;
对左右盒子使用相对布局来占据 padding 的空白,避免中间盒子的内容被左右盒子覆盖;
双飞翼:父盒子包含三个子盒子(左,中,右),中间的子盒子里再加一个子盒子。
中间盒子的宽度设置为 width: 100%; 独占一行;
使用负边距(均是 margin-left)把左右两边的盒子都拉上去和中间盒子同一行;
在中间盒子里面再添加一个 div,然后对这个 div 设置 margin-left 和 margin-right来为左右盒子留位置;
圣杯布局和双飞翼布局解决的问题是一样的,都是两边定宽,中间自适应的三栏布局,中间栏要在放在文档流前面以优先渲染。
简单说起来就是双飞翼布局比圣杯布局多创建了一个 div,但不用相对布局了,少设置几个属性。
我自己使用浮动也实现了三栏式布局:左边盒子左浮动,右边盒子右浮动,中间盒子利用 margin-left 和 margin-right 来为左右盒子留位置,同时父盒子设置 overflow: auto; 来避免子盒子溢出。
三栏式布局参考下面几个链接:
1、CSS三栏布局——中间固定两边自适应宽度: w3cplus 的文章,使用了双飞翼和浮动实现两侧定宽、中间自适应,也实现了两侧自适应、中间定宽
链接:http://www.w3cplus.com/blog/104.html
2、简书 - 圣杯布局和双飞翼布局(前端面试必看):只讲了圣杯,不过特别详细
链接:http://www.jianshu.com/p/f9bcddb0e8b4
3、In Search of the Holy Grail:圣杯布局的来源
链接:https://alistapart.com/article/holygrail
4、百度前端学院笔记 - 三栏式布局之双飞翼与圣杯:百度前端学院学员的前端学习笔记
链接:http://ife.baidu.com/note/detail/id/1025
三栏式布局涉及到负 magin 和 清除浮动的问题。
这里引出了“负 margin”的问题:
1、负margin用法权威指南:The Definitive Guide to Using Negative Margins 的译文,介绍了负 magin 的一些性质和很多实用技巧
链接:https://www.smashingmagazine.com/2009/07/the-definitive-guide-to-using-negative-margins/
2、简书 - margin为负值产生的影响和常见布局应用:包括对自身的影响,对文档流的影响,以及一些在布局中的应用技巧(比如去除列表右边框,负边距+定位实现水平垂直居中,去除列表最后一个 li 元素的 border-bottom,多列等高)
链接:http://www.jianshu.com/p/549aaa5fabaa
3、博客园 - CSS布局奇淫巧计之-强大的负边距:和上文内容差不多
链接:http://www.cnblogs.com/2050/archive/2012/08/13/2636467.html
简单总结几点:
不使用 float 的话,负 margin 元素是不会破坏页面的文档流。所以如果你使用负 margin 上移一个元素,所有跟随的元素都会被上移(而 relative 定位的元素则不同,会保留原位置,影响文档流)。
当 static 元素的 margin-top/margin-left 被赋予负值时,元素将被拉进指定的方向。
如果你设置 margin-bottom/right 为负数,元素并不会如你所想的那样向下/右移动,而是将后续的元素拖拉进来,覆盖本来的元素。
当元素不存在 width 属性或者 width: auto 的时候,负 margin 会增加元素的宽度.
margin-top 为负值不会增加高度,只会产生向上位移;margin-bottom 为负值不会产生位移,会减少自身的供 CSS 读取的高度,影响下方的元素位置;上下相邻的元素两者均为负时,效果不叠加,取负值更多的那个效果。
清除浮动主要是为了解决高度塌陷问题。而简单的 clear: both 并不能解决这个问题,所以引出了许多解决方案。
1、StackOverflow - What methods of ‘clearfix’ can I use?:清除浮动黑科技完整解读
链接:http://stackoverflow.com/questions/211383/what-methods-of-clearfix-can-i-use
2、那些年我们一起清除过的浮动:神文,把“清除浮动”定义为“闭合浮动”,把问题由来和解决方案都讲清楚了,并且分析了各种解决方案的优劣。
链接:http://www.iyunlu.com/view/css-xhtml/55.html
各种解决方案在上面的链接里有很详细的说明了,这里就不赘述了。大体分为两类:
其一,通过在浮动元素的末尾添加一个空元素,设置 clear: both 属性,after 伪元素其实也是通过 content 在元素的后面生成了内容为一个点的块级元素;
其二,通过设置父元素 overflow 或者 display: table 属性来闭合浮动
顺便补充一句,clear float(例如 clear: left) 是对某个元素设置,以避免其某一边有浮动元素,即对当前元素产生约束,约束的边界为其他的浮动元素。对于已经浮动的元素,设置 clear float 是无效的。
Centering in CSS: A Complete Guide:非常全面的居中定位博客,包括各种情况下的水平居中,垂直居中和水平垂直居中方案。有展示示例及相应的 HTML 和 CSS 代码
链接:https://css-tricks.com/centering-css-complete-guide/
文章大致结构:
水平居中
对于行内元素(inline):text-align: center;
对于块级元素(block):设置宽度且 marigin-left 和 margin-right 是设成 auto
对于多个块级元素:对父元素设置 text-align: center;,对子元素设置 display: inline-block;;或者使用 flex 布局
垂直居中
已知高度:子元素使用绝对布局 top: 50%;,再用负的 margin-top 把子元素往上拉一半的高度
未知高度:子元素使用绝对布局 position: absolute; top: 50%; transform: translateY(-50%);
使用 Flexbox:选择方向,justify-content: center;
单行:设置上下 pandding 相等;或者设置 line-height 和 height 相等
多行:设置上下 pandding 相等;或者设置 display: table-cell; 和 vertical-align: middle;;或者使用 flex 布局;或者使用伪元素
对于行内元素(inline)
对于块级元素(block):下面前两种方案,父元素需使用相对布局
水平垂直居中
定高定宽:先用绝对布局 top: 50%; left: 50%;,再用和宽高的一半相等的负 margin 把子元素回拉
高度和宽度未知:先用绝对布局 top: 50%; left: 50%;,再设置 transform: translate(-50%, -50%);
使用 Flexbox:justify-content: center; align-items: center;
“响应式设计(Responsive Design)” 是一种让网站针对不同的浏览器和设备“呈现”不同显示效果的策略。
媒体查询(Media Queries)是做此事所需的最强大的工具。
注: Responsive Web Design = RWD,Adaptive Web Design = AWD
RWD:
采用 CSS 的 media query 技术
流体布局(fluid grids)
自适应的图片/视频等资源素材
(为小、中、大屏幕做一些优化,目的是让任何尺寸的屏幕空间都能得到充分利用)
AWD:
以上 RWD 和 AWD 解释引自 知乎 @屹峰
可以参考 Bootstrap 的网格系统:http://getbootstrap.com/css/#grid-less
The Bootstrap 3 grid system has four tiers of classes: xs (phones), sm (tablets), md (desktops), and lg (larger desktops).
自己实现网格系统: Creating Your Own CSS Grid System
链接:http://j4n.co/blog/Creating-your-own-css-grid-system
Flexbox 布局参考下面几篇文章就可以了,几篇文章大同小异,看一两篇就知道大概了,讲的挺详细的,在此不赘述
1、w3cplus - 一个完整的Flexbox指南:A Complete Guide to Flexbox的译文
链接:http://www.w3cplus.com/css3/a-guide-to-flexbox.html
2、SegmentFault - Flexbox详解
链接:https://segmentfault.com/a/1190000002910324
3、w3cplus - 图解CSS3 Flexbox属性
链接:https://www.w3cplus.com/css3/a-visual-guide-to-css3-flexbox-properties.html
4、w3cplus - Flexbox——快速布局神器
链接:http://www.w3cplus.com/css3/flexbox-basics.html