接触前端开发也有半年了,每当需要将一个空白的纸,”画“成一个页面的时候,总会出现不知所措的几秒钟。除了因为对css中的各种属性的不熟练之外,更难为人的是怎么简练的将这些属性排列组合起来。其实静下心来,仔细想一想,无非就是整体-->局部这么个思路。所谓整体,就是页面的局,局部就是各自的整体到局部,再加上一些展示性的属性的组合的这么个过程。考虑好浏览器的兼容性,做一个尽量完美的布局,是写好页面样式的关键一步。
可是,我总是希望能用尽量少的代码,来表现尽量多的内容,但是,如果不考虑其他因素,这一点很容易做到。比如 ,我们要分列,flex足矣。但其他因素终归是必须要顾及的。
布局方式
布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。
第一 标准流布局
第二 浮动布局
第三 定位布局
案例一--水平居中
从一个最简单的居中布局说起
<div class="parent">
<div class=""child></div>
</div>
就可以有好多种实现方式,
比如第一种inline-block+text-align的常见方式:
.child{display:inline-block;}
.parent{text-align:center;}
这种方法兼容性比较好,虽然ie6,7不支持inline-block,但是我们可以通过
display:block;zoom:1 近似于 inline-block
第二种table+margin的方式,同样是上例的结构:
.child{display:table;margin:0 auto;}
这种方式需要的css代码很简单,对ie8以上也能很好的支持,但是由于ie6,7对display:table不认,但是我们可以将结构改成table的结构也能达到效果。
第三种方式采用absolute+trasnform的方式
.parent{position:relative;}
.child{position:absolute;left:50%;transform:translateX(-50%);}
这种方式关键的一点是利用transform属性,旋转自身的50%。达到居中的效果。但是ie6,7,8均不能很好的支持。
第三种方式是通过flex+justify-content的组合实现的
.parent{display:flex;justify-content:center;}
这种方同第二种类似,css代码比较简单,这里是不需要对子元素进行任何的设置,这是由于flex的子元素默认是flex-item,宽为元素宽。关于flex的详细内容,可以参考这个介绍flex布局
当然,这里的
justify-content:center;
也有替代的方法,可以通过
.child{margin:0 auto;}
实现相同的效果。
案例二--垂直居中
垂直居中,这里总结三种常见的方式
利用table-cell
.parent{display:table-cell;vertical-align:middle;}
这种方式兼容ie8及以上,对ie6,7可以通过前面介绍的,改成table的结构来兼容。
借助定位和transform属性
.parent{position:relative;}
.child{position:absolute;top:50%;transform:translateY(-50%)}
css3的flex
.parent{display:flex;align-item:center;}
案例三--水平垂直居中
水平垂直居中就可以综合考虑前面的水平居中的一些方法和垂直居中的一下方法了。兼容性当然跟前面考虑的原因也类似,这里总结了三种。
基本水平居中方法加table-cell
.parent{text-align:center;display:table-cell;vertical-algin:center;}
.child{display:inline-block;}
定位+ transform属性
.parent{position:relative;}
.child{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}
flex
.parent{display:flex;justify-content:center;align-items:center;}
这种情况下,我们也是不需要对.child进行特殊的设置就可以达到垂直水平居中的效果。
关于布局,当然肯定还有更多的更好的方法。而且,从更宏观的角度,还有对于全局的一个布局,比如top固定,或者一部分定宽,一部分自适应等等要求,这里仅仅是总结了一下常见的,这个需要不断的在实践中进行摸索和改进,css的学习不断的累积很重要。