CSS3笔记---布局样式


1.多栏布局

使用float或position进行页面布局时,有个比较显著的缺点,元素之间是各自独立的,因此经常底部不能对齐,导致页面中出现一块空白区域。使用多栏布局,可以将一个元素中的内容分为两栏或多栏去显示。

  • 元素内部使用多栏布局(指定元素总宽度,多栏均分宽度):
div#div1{
    width: 40em; // 指定元素总宽度
    column-count: 2; // 指定内部分成两栏
    -moz-column-count: 2; // FireFox
    -webkit-column-count: 2; // Safari、Chrome、Opera
}
  • 元素内部使用多栏布局(不指定元素总宽度,指定每栏宽度):
// 元素如果没设定总宽度,则外面要套个容器元素
div#container{
    width: 42em;
}
div#div1{
    column-count: 2; // 指定元素内部分两栏
    -moz-column-count: 2; 
    -webkit-column-count: 2; 
    column-width: 20em; // 指定每栏宽度
    -moz-column-width: 20em;
    -webkit-column-width: 20em;
}
  • 还可以指定多栏之间的间隔距离,以及间隔线:
div#div1{
    column-count: 2; // 指定元素内部分两栏
    -moz-column-count: 2; 
    -webkit-column-count: 2; 
    column-width: 20em; // 指定每栏宽度
    -moz-column-width: 20em;
    -webkit-column-width: 20em;
    column-gap: 3em; // 指定栏之间间隔距离
    -moz-column-gap: 3em;
    -webkit-column-gap: 3em;
    column-rule: 1px solid red; // 指定栏之间分隔线
    -moz-column-rule: 1px solid red;
    -webkit-column-rule: 1px solid red;
}

使用多栏布局时,各栏宽度是相等的。也不可能具体指定什么栏中显示什么内容,因此比较适合用在显示文章内容的场景,不适合用于布局网页结构。


2. 盒布局

除多栏布局外,还可以使用盒布局解决使用float或position时多栏底部不能对齐的问题。

  • 使用float的旧方式(底部不对齐):
#left-sidebar{
    float: left;
    width: 200px;
    padding: 20px;
    background-color: orange;
}
#contents{
    float: left;
    width: 300px;
    padding: 20px;
    background-color: yellow;
}
#right-sidebar{
    float: left;
    width: 200px;
    padding: 20px;
    background-color: limegreen;
}
#left-sidebar, #contents, #right-sidebar{
    box-sizing: border-box;
}
  • 使用盒布局:
#container{
    display: -moz-box; // 指定使用盒布局 FireFox
    display: -webkit-box; // Safari、Chrome、Opera
}
#left-sidebar{ // 删除float
    width: 200px;
    padding: 20px;
    background-color: orange;
}
#contents{ // 删除float
    width: 300px;
    padding: 20px;
    background-color: yellow;
}
#right-sidebar{ // 删除float
    width: 200px;
    padding: 20px;
    background-color: limegreen;
}
#left-sidebar, #contents, #right-sidebar{
    box-sizing: border-box;
}

3. 弹性盒布局

在使用盒布局时,我们对各区块是单独设定宽度的。如果想让区块的总宽度等于浏览器的宽度,并且能随着窗口宽度的改变而改变,那么弹性盒布局就派上用场了。因此相比盒布局,弹性盒布局用来布局整个网页总体结构无疑是更佳的。

  • 将盒布局改成弹性盒布局:
#container{ // box改成flex
    display: flex;
}
#left-sidebar{
    width: 200px;
    padding: 20px;
    background-color: orange;
}
#contents{ // 去除中间栏的宽度,改成flex属性
    flex: 1;
    padding: 20px;
    background-color: yellow;
}
#right-sidebar{
    width: 200px;
    padding: 20px;
    background-color: limegreen;
}
#left-sidebar, #contents, #right-sidebar{
    box-sizing: border-box;
}
  • 使用order属性改变元素的显示顺序(内容在最左边,右栏在中间,左栏在最右边):
#container{
    display: flex;
}
#left-sidebar{
    order : 3;
    width: 200px;
    padding: 20px;
    background-color: orange;
}
#contents{
    order: 1;
    flex: 1; // 是flex-grow、flex-shrink 和 flex-basis的缩写
    padding: 20px;
    background-color: yellow;
}
#right-sidebar{
    order: 2;
    width: 200px;
    padding: 20px;
    background-color: limegreen;
}
#left-sidebar, #contents, #right-sidebar{
    box-sizing: border-box;
}

flex 属性定义弹性盒模型子元素如何分配“容器剩余空间”,是 flex-grow、flex-shrink 和 flex-basis 属性的简写属性:
flex: 1: 则其计算值为 flex: 1 1 0%; // 子元素不定义flex相关属性时的默认值
flex: auto,:则其计算值为 flex: 1 1 auto;// flex-basis为auto,伸缩基准值为自身width值,如果没有定义width,则基准值为内容宽度
flex: none,:则其计算值为 flex: 0 0 auto;// 本子元素不参与容器剩余空间分配
flex-grow:
扩展比率,即剩余空间是正值时此「flex子项」相对于「flex容器」里其他「flex子项」能分配到空间比例。在「flex」属性中该值如果被省略则默认为「1」。
flex-shrink:
收缩比率,即剩余空间是负值时此「flex子项」相对于「flex容器」里其他「flex子项」能收缩的空间比例。在收缩的时候收缩比率会以伸缩基准值加权在「flex」属性中该值如果被省略则默认为「1」。
flex-basis:
伸缩基准值,即在根据伸缩比率计算出剩余空间的分布之前,「flex子项」长度的起始数值。在「flex」属性中该值如果被省略则默认为「0%」在「flex」属性中该值如果被指定为「auto」,则伸缩基准值的计算值是自身的width值,如果自身的宽度没有定义,则长度取决于内容。

  • 使用flex-direction改变元素的排列顺序
#container{
    display: flex;
    border: solid 5px blule;
    flex-direction: column; // 纵向排列(默认row)
    width: 500px
    height: 300px;
}
  • 控制换行方式
    子元素宽度超过容器时,默认会进行伸缩或扩张。可通过制定flex-wrap属性控制换行:
#container{
    display: flex;
    border: solid 5px blue;
    flex-direction: row;
    flex-wrap: wrap; // 换行
    width: 500px;
    height: 300px;
}
#text-a{
    background-color: orange;
}
#text-b{
    background-color: yellow;
}
#text-c{
    background-color: limegreen;
}
#text-a, #text-b, #text-c{
    box-sizing: border-box;
    font-size: 1.5em;
    font-weight: bold;
    // 3个子元素宽度合计超过容器宽度,由于对容器设置了flex-wrap: wrap,因此会换行而不伸缩
    width: 250px; 
}

4. 弹性盒布局下,指定元素的水平和垂直对齐方式

当flex-grow属性值不为0时,各子元素在main axis轴方向上自动伸缩,所以justify-content无效。

下面假设弹性盒的布局方向按照默认的flex-direction: row,横向布局:

  • justify-content指定元素在水平方向(main axis)的对齐方式
    justify-content属性值如下:
    flex-start:从main-start开始布局所有子元素
    flex-end:从main-end开始布局所有子元素
    center:居中布局所有子元素
    space-between:将剩余空间平均分配在子元素之间
    space-around:子元素周围平均分配剩余空间

    下面是一个示例,在容器里指定justify-content:

#container{
    display: flex;
    border: 5px solid blue;
    flex-direction: row;
    width: 600px;
    height: 30px;
    justify-content: flex-end;
}
  • align-items指定子元素在垂直方向(cross axis)的对齐方式
    align-items属性值如下:
    flex-start:从cross-start开始布局所有子元素
    flex-end:从cross-end开始布局所有子元素
    center:居中布局所有子元素
    baseline:
    stretch:垂直方向上高度被调整为最大

  • align-self指定某子元素的脱离出align-items的独立对齐方式
    align-self属性值如下:
    auto:继承父元素的align-items属性值
    其他可指定属性值同align-items

下面是一个示例,在容器里指定justify-content:

#container{
    display: flex;
    border: 5px solid blue;
    flex-direction: row;
    width: 600px;
    align-items: flex-start;
}
#div-a{
    background-color: orange;
    width: 100px;
    font-size: 12px;
    align-self: flex-end;
}
#div-b{
    background-color: yellow;
    width: 150px;
    font-size: 24px;
}
#div-c{
    background-color: limegreen;
    width: 200px;
    font-size: 36px;
}

弹性盒多行布局时(flex-wrap: wrap),可以使用align-content属性指定各行的对齐方式。该属性与align-items的区别在于:align-items指定子元素的对齐方式,而align-content指定行对齐方式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,104评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,816评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,697评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,836评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,851评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,441评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,992评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,899评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,457评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,529评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,664评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,346评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,025评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,511评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,611评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,081评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,675评论 2 359

推荐阅读更多精彩内容

  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,316评论 0 11
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    wzhiq896阅读 1,760评论 0 2
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,759评论 1 92
  • 移动开发基本知识点 一.使用rem作为单位 html { font-size: 100px; } @media(m...
    横冲直撞666阅读 3,483评论 0 6
  • 据说,如果你是个解答题高手,又做对了选择题,就会取得巨大的成功。解释一下,如果你本身非常有才华和能力,又有眼光和魄...
    知笔行阅读 289评论 0 2