说说css3布局

使用float属性或position属性布局的缺点

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <style type="text/css">
        div {
            width: 20em;
            float: left;
        }

        #div1 {
            margin-right: 2em;
        }

        #div3 {
            width: 100%;
            background-color: yellow;
            height: 200px;
        }
    </style>
</head>
<body>
    <div id="div1">
        <p>

            示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        </p>
    </div>
    <div id="div2">
        <p>
            示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        </p>
    </div>
    <div id="div3">
        页面中其它内容
    </div>

</body>
</html>

使用上面代码页面显示如下所示:

但是当上面示例中div1和div2中任何一个元素中添加了一点不一样的东西,比如说增加一个图片

那么显示的页面效果就会如下所示,(也就是说无法实现两个元素的询问对齐)

那么该怎么样解决这个问题呢

css3中加入多栏布局,使用多栏布局可以将一个元素中的内容分成多栏显示,并且确保各栏中内容底部对齐。主要可以使用如下属性

column-count:要显示的列数

column-width:当前列显示的宽度

column-gap:多栏之间的间隔距离

column-rule:在栏与栏之间增加一条间隔线,并设置该间隔线的宽度颜色等

一般性盒布局

一般性页面布局都是分成左中右,像如下的例子一样的

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <style type="text/css">
        #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 {
            -moz-box-sizing: border-box;
            -webkit-box-sizing: border-box;
        }
    </style>
</head>
<body>
    <div id="container">
        <div id="left-sidebar">
            <h2>左侧边栏</h2>
            <ul>
                <li><a href="#">超链接</a></li>
                <li><a href="#">超链接</a></li>
                <li><a href="#">超链接</a></li>
                <li><a href="#">超链接</a></li>
                <li><a href="#">超链接</a></li>
            </ul>
        </div>
        <div id="contents">
            <h2>内容</h2>
            <p>
                示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
        示例文字。相对来说比较长的示例文字。
            </p>
        </div>
        <div id="right-sidebar">
            <h2>右侧边栏</h2>
            <ul>
                <li><a href="#">超链接</a></li>
                <li><a href="#">超链接</a></li>
                <li><a href="#">超链接</a></li>

            </ul>
        </div>
    </div>
</body>
</html>

代码运行后的界面效果如下所示:

可以看到使用float属性或position属性,左右两侧或多栏中div元素的底部并没有对齐

使用盒布局

下面使用盒布局的方式来使得底部对齐,将上面的css改为如下所示:

        #container {
            display:-moz-box;
            display:-webkit-box;
        }
        #left-sidebar {
            width: 200px;
            padding: 20px;
            background-color: orange;
        }

        #contents {
            width: 300px;
            padding: 20px;
            background-color: yellow;
        }

        #right-sidebar {
            width: 200px;
            padding: 20px;
            background-color: limegreen;
        }

        #left-sidebar, #contents, #right-sidebar {
            -moz-box-sizing: border-box;
            -webkit-box-sizing: border-box;
        }

其实也就是在最外层的div上使用了display:box,并去除了里面三个div的float:left的属性,界面运行效果图如下所示:

这里顺便说一下,使用盒而已和多栏布局的区别:1、多栏布局每栏宽度必须相等2、使用多栏布局不可能具体指定什么栏显示什么内容,也就是说多栏布局适合在使用显示文章内容的时候而不适合用于安排整个网页的各个元素的结构

使用自适应窗口的弹性盒布局

对于上面的例子,如果我们想让这三个div的总宽度等于浏览器窗口的宽度,也就是说随着浏览器窗口宽度的改变而改变,应该怎么做呢

事实上很简单,只要在中间的div上增加-webkit-box-flex:1;-moz-box-flex:1; 这个属性就可以了,css代码如下所示:

        #container {
          display:-moz-box;
          display:-webkit-box;
        }
        #left-sidebar {
            width: 200px;
            padding: 20px;
            background-color: orange;
        }

        #contents {
            -webkit-box-flex:1;
            -moz-box-flex:1;
            width: 300px;
            padding: 20px;
            background-color: yellow;
        }

        #right-sidebar {
            width: 200px;
            padding: 20px;
            background-color: limegreen;
        }

        #left-sidebar, #contents, #right-sidebar {
            -moz-box-sizing: border-box;
            -webkit-box-sizing: border-box;
        }

界面运行效果如所示所示:

改变元素的显示顺序

那么我们怎样改变元素的显示顺序呢,比如说我想让左侧栏在最右,内容栏在最左显示,怎么办?

css3提供了一个属性box-ordinal-group属性来改变各元素的显示顺序,大家看看我的css只是在里面的每个div增加了box-ordinal-group,就轻而易举的改变了它们的显示顺序

        #container {
            display: -moz-box;
            display: -webkit-box;
        }

        #left-sidebar {
            -moz-box-ordinal-group: 3;
            -webkit-box-ordinal-group: 3;
            width: 200px;
            padding: 20px;
            background-color: orange;
        }

        #contents {
            -moz-box-ordinal-group: 1;
            -webkit-box-ordinal-group: 1;
            -webkit-box-flex: 1;
            -moz-box-flex: 1;
            width: 300px;
            padding: 20px;
            background-color: yellow;
        }

        #right-sidebar {
            -moz-box-ordinal-group: 2;
            -webkit-box-ordinal-group: 2;
            width: 200px;
            padding: 20px;
            background-color: limegreen;
        }

        #left-sidebar, #contents, #right-sidebar {
            -moz-box-sizing: border-box;
            -webkit-box-sizing: border-box;
        }

界面效果图如下所示(是不是挺神奇的):

改变元素的排列方向

那如果要改变元素的排列方向呢,在css3中可以使用box-orient来指定多个元素的排列方向。只需要在最外层的div上增加box-orient属性就可以了。css代码如下所示:

        #container {
            display: -moz-box;
            display: -webkit-box;
            -moz-box-orient:vertical;
            -webkit-box-orient:vertical;
        }

        #left-sidebar {
            -moz-box-ordinal-group: 3;
            -webkit-box-ordinal-group: 3;
            width: 200px;
            padding: 20px;
            background-color: orange;
        }

        #contents {
            -moz-box-ordinal-group: 1;
            -webkit-box-ordinal-group: 1;
            -webkit-box-flex: 1;
            -moz-box-flex: 1;
            width: 300px;
            padding: 20px;
            background-color: yellow;
        }

        #right-sidebar {
            -moz-box-ordinal-group: 2;
            -webkit-box-ordinal-group: 2;
            width: 200px;
            padding: 20px;
            background-color: limegreen;
        }

        #left-sidebar, #contents, #right-sidebar {
            -moz-box-sizing: border-box;
            -webkit-box-sizing: border-box;
        }

界面立马就完全变了

元素宽度与高度的自适应

在使用盒布局时,元素的宽度与高度具有自适应性,也就是说元素的宽度与高度可以根据排列方向的改变而改变

看下面的例子,整个html界面代码如下所示:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <style type="text/css">
        #container {
            display: -moz-box;
            display: -webkit-box;
            border: 5px solid blue;
            -moz-box-orient: horizontal;
            -webkit-box-orient: horizontal;
            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 {
            -moz-box-sizing: border-box;
            -webkit-box-sizing: border-box;
        }
    </style>
</head>
<body>
    <div id="container">
        <div id="text-a">示例文字A</div>
        <div id="text-b">示例文字B</div>
        <div id="text-c">示例文字C</div>
    </div>
</body>
</html>

界面效果如下所示:

当我们改变上述代码container里面的css如下所示(也就是改变排列方式为垂直方向):

        #container {
            display: -moz-box;
            display: -webkit-box;
            border: 5px solid blue;
            -moz-box-orient: vertical;
            -webkit-box-orient: vertical;
            width: 500px;
            height: 300px;
        }

则界面效果图如下所示:

使用弹性盒布局来消除空白

看了上面的效果图,大家一定在想,容器中总还是留出一大片空白的区域,应该要怎样来消除呢?其实可以使用css3中的弹性盒布局来解决,也就是使得多个参与排列的元素的总宽度与总高度始终等于容器的宽度与高度

下面我们来修改一下上述代码(将排列方向设置为水平,在中间一个子div上加入box-flex属性)

css样式如下所示:

        #container {
            display: -moz-box;
            display: -webkit-box;
            border: 5px solid blue;
            -moz-box-orient: horizontal;
            -webkit-box-orient: horizontal;
            width: 500px;
            height: 300px;
        }

        #text-a {
            background-color: orange;
        }

        #text-b {
            background-color: yellow;
            -moz-box-flex:1;
            -webkit-box-flex:1;
        }

        #text-c {
            background-color: limegreen;
        }

        #text-a, #text-b, #text-c {
            -moz-box-sizing: border-box;
            -webkit-box-sizing: border-box;
        }

界面显示效果便如下所示了

当然你也可以设置排列方向为垂直,那么界面自然会显示成如下这样了

对多个元素使用box-flex属性

现在我们不只对中间的子div加上box-flex,也对第一个子div加上box-flex,那么结果会怎么样呢

        #container {
            display: -moz-box;
            display: -webkit-box;
            border: 5px solid blue;
            -moz-box-orient: vertical;
            -webkit-box-orient: vertical;
            width: 500px;
            height: 300px;
        }

        #text-a {
            background-color: orange;
            -moz-box-flex: 1;
            -webkit-box-flex: 1;
        }

        #text-b {
            background-color: yellow;
            -moz-box-flex: 1;
            -webkit-box-flex: 1;
        }

        #text-c {
            background-color: limegreen;
        }

        #text-a, #text-b, #text-c {
            -moz-box-sizing: border-box;
            -webkit-box-sizing: border-box;
        }

如果三个子div都加上box-flex属性,那么每个div高度等于容器的高度除以3,也就是效果图所示所示:

其实box-flex:1就是让其占据刚刚好的宽度,也就是说除去其它的部分,它刚好占满全部

你动手去尝试一下用box-flex:2,会发现box-flex:2并非box-flex:1的两倍就是这个道理,1只是代表单位像素,也就是刚刚好的宽高,并非代表数值

指定水平方向与垂直方向的对齐方式

在css2中,如果想方案水平居中就只能用text-align:center,但是却不能让文字垂直居中,在css3中,只要让div元素使用box-align属性就行了。

示例代码

        div {
            display: -moz-box;
            display: -webkit-box;
            -moz-box-align: center;
            -webkit-box-align: center;
            -moz-box-pack: center;
            -webkit-box-pack: center;
            width: 200px;
            height: 100px;
            background-color: pink;
        }

如果在div容器中放入“示例文字”这几个字,界面运行效果就会如下所示:(同样,如果我们在div里面放入图像也是可以实现水平和垂直方向居中的)

时间: 2024-10-31 04:17:55

说说css3布局的相关文章

2017-1-11 css3布局

2017-1-11 css3布局 css 布局 多列布局 columns:column-width||coumn-count; column-width定义每列的宽度 coumn-count定义列数 columns 属性初始值根据元素个别属性而定,适用于不可替换的块元素.行内块元素和单元格,但是表格元素除外. column-width 属性可以定义单列显示的宽度,该属性可以与其他多列布局属性配合使用,也可以单独使用. column-gap 定义两栏之间的间距 column-gap:normal

学习笔记 第十一章 CSS3布局基础

第11章   CSS3布局基础 [学习重点] 了解CSS2盒模型. 设计边框样式. 设计边界样式. 设计补白样式. 了解CSS3盒模型. 11.1  CSS盒模型基础 页面中所有元素基本显示形态为方形的盒子(Box),根据盒模型规则,网页中所有元素对象都被放在一个盒子里,设计师可以通过CSS来控制这个盒子的显示方式. 11.1.1 盒模型结构 Box具有如下特点: 每个盒子都有:边界.边框.填充.内容4个属性. 每个属性都包括4个部分:上.右.下.左.属性的四部分可以同时设置,也可以分别设置.

CSS3布局样式

1.多列布局--columns 为了能在Web页面中方便实现类似报纸.杂志那种多列排版的布局,W3C特意给CSS3增加了一个多列布局模块(CSS Multi Column Layout Module).它主要应用在文本的多列布局方面. columns:<column-width> || <column-count> 参数 参数说明 <column-width> 主要用来定义多列中每列的宽度 <column-count> 主要用来定义多列中的列数 2.colu

CSS3 布局

1.1 列布局   CSS3中新出现的多列布局(multi-column)是传统HTML网页中块状布局模式的有力扩充.这种新语法能够让WEB开发人员轻松的让文本呈现多列显示.我们知道,当一行文字太长时,读者读起来就比较费劲,有可能读错行或读串行:人们的视点从文本的一端移到另一端.然后换到下一行的行首,如果眼球移动浮动过大,他们的注意力就会减退,容易读不下去.所以,为了最大效率的使用大屏幕显示器,页面设计中需要限制文本的宽度,让文本按多列呈现,就像报纸上的新闻排版一样. 1.1 伸缩布局 CSS3

CSS3基础(3)——CSS3 布局属性全接触

一. 弹性盒模型 1.弹性盒子模型介绍 弹性盒模型(Flexible Box或Flexbox)是一个CSS3新增布局模块,官方称为CSS Flexible Box Layout Module,用于实现容器里项目的对齐.方向.排序(即使在线吗大小位置.动态生成的情况). 弹性盒模型最大的特征在于,能够动态修改子元素的宽度和高度,以满足在不同尺寸屏幕下的洽当布局. 兼容性:http://caniuse.com/#search=flex 2.弹性盒子属性 ①弹性容器属性 属性 描述 display 指

CSS3布局之flex布局效果

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> *{ margin: 0; padding: 0; } .container{ width: 1000px; margin:0 auto; } he

css3布局样式相关

伸缩布局(一); 1.创建一个flexbox容器. .flexconfainer{ display:-webkit-flex;display:flex; } 2.flex项目显示: flex项目是flex容器的子元素,他们沿着主要轴和横轴定位,默认的是沿着水平轴排列一行,可以通过flex-direction来改变主轴 方向修改为column,其默认值是row. 3.项目列显示; .flexcontainer{ display:-webkit-flex; display:flex; -webkit

【转】CSS3 布局属性全接触

1.[弹性盒模型Flexbox],最大的特性在于,能够动态修改子元素的宽度和高度,以满足在不同尺寸屏幕下的恰当布局. flex-direction:row | row-reverse | column | column-reverse /*设置主轴方向,确定弹性子元素排列方式*/ flex-wrap: nowrap | wrap | warp-reverse /* 设置弹性子元素超出弹性容器范围时是否换行 */ flex-flow: [flex-direction]||[flex-wrap] /

css3布局属性flex

html代码如下: <ul class="ul_box"> <li><a href="#">html</a></li> <li><a href="#">css</a></li> <li><a href="#">javascript</a></li> <li>&l