CSS中的页面布局方式

页面布局

在实际工作,页面布局有以下几种:

  • table 布局

  • div+css布局

  • 弹性布局

  • 网格布局

table布局(了解)

这种布局方式早期经常使用,大概在 2000 看开始就基本上不使用这种布局方式了。因为它解析性能差。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>table 布局</title>
</head>
<body>
<table width="100%">
    <tr bgcolor="#cccccc">
        <td height="60" align="center">顶部内容</td>
    </tr>
    <tr>
        <td align="center">
            <form action="" method="post">
                <table width="300">
                    <tr bgcolor="#CCCCCC">
                        <th colspan="2">用户注册</th>
                    </tr>
                    <tr bgcolor="#E6E6E6">
                        <td width="30%" align="right">用户名</td>
                        <td width="70%"><input type="text" name="username"></td>
                    </tr>
                    <tr bgcolor="#E6E6E6">
                        <td align="right">密码</td>
                        <td><input type="password" name="password"></td>
                    </tr>
                    <tr bgcolor="#E6E6E6">
                        <td align="right">性别</td>
                        <td><input type="radio" name="gender" checked value="男"> 男 <input type="radio" name="gender" value="女"> 女</td>
                    </tr>
                    <tr bgcolor="#E6E6E6">
                        <td align="right">爱好</td>
                        <td><input type="checkbox" name="hobby" value="写作"> 写作 <input type="checkbox" name="hobby" value="听音乐"> 听音乐 <input type="checkbox" name="hobby" value="体育"> 体育</td>
                    </tr>
                    <tr bgcolor="#E6E6E6">
                        <td align="right">省份</td>
                        <td>
                            <select name="province">
                                <option value="陕西省">陕西省</option>
                            </select>
                        </td>
                    </tr>
                    <tr bgcolor="#E6E6E6">
                        <td align="right">自我介绍</td>
                        <td><textarea name="intro" cols="25" rows="5"></textarea> </td>
                    </tr>
                    <tr bgcolor="#CCCCCC">
                        <td colspan="2" align="center">
                            <input type="submit" value="提交">
                            <input type="reset" value="重置">
                        </td>
                    </tr>
                </table>
            </form>
        </td>
    </tr>
    <tr bgcolor="#cccccc">
        <td align="center" height="30">底部</td>
    </tr>
</table>
​
</body>
</html>

DIV+CSS布局

盒子模型

div是一个标准块标签,而HTML的块标签都存在了 margin, padding, border 等属性,我们就可以通过这些内边距、边框、外边距来控制不同的标签的布局和存放位置,这个就是我们经常说的盒子模型。

自从 1996 年 CSS1 的推出,W3C 组织就建议把所有网页上的对象都放在一个盒子(box)中,我们可以通过控制盒子属性,来操作页面。

盒模型主要定义四个区域:内容(content)、内边距(padding)、边界(border)和外边距(margin),如图5-1所示。

示例案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>DIV+CSS布局</title>
    <style>
        * {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }
        .box {
            width: 300px;
            margin: 0 auto;
            border: 1px solid #cccccc;
        }
        .row {
            width: 300px;
            background: #E6E6E6;
            margin: 1px 0;
        }
        .label {
            display: inline-block;
            width: 30%;
            background: #E6E6E6;
            text-align: right;
        }
        /*
        .row:nth-child(1) {
            width: 30%;
            text-align: right;
            background: red;    
        }
        .row:nth-child(2) {
            width: 60%;
            text-align: left;
            background: #317FE5;
        }
        .row:nth-child(2) input[type="text"] {
            width: 10px;
            border: 1px solid #0000ff;
        }*/
    </style>
</head>
<body>
<div class="box">
    <h3>用户注册</h3>
    <form action="" method="post">
        <div class="row">
            <label class="label" for="username">用户名</label>
            <input type="text" id="username" name="username">
        </div>
        <div class="row">
            <label class="label" for="password">密码</label>
            <input type="password" id="password" name="password">
        </div>
        <div class="row">
            <label class="label">性别</label>
            <input type="radio" name="gender" id="man" checked value="男"> <label for="man">男</label>
            <input type="radio" name="gender" id="feman" value="女"> <label for="feman">女</label>
        </div>
        <div class="row">
            <label class="label">爱你</label>
            <input type="checkbox" name="hobby" id="writer" value="写作"> <label for="writer">写作</label>
            <input type="checkbox" name="hobby" id="music" value="听音乐"> <label for="music">听音乐</label>
        </div>
        <div class="row">
            <label class="label" for="province">省份</label>
            <select name="province" id="province">
                <option value="陕西省">陕西省</option>
            </select>
        </div>
        <div class="row">
            <label class="label" for="intro">自我介绍</label>
            <textarea name="intro" id="intro" cols="25" rows="5"></textarea>
        </div>
        <div class="row">
            <input type="submit" value="提交">
            <input type="reset" value="重置">
        </div>
    </form>
</div>
</body>
</html>

DIV+CSS

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>DIV+CSS布局</title>
    <style>
        * {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }
        .box {
            width: 300px;
            margin: 0 auto;
            border: 1px solid #cccccc;
        }
​
        .row {
            width: 100%;
            margin: 1px 0;
            background: #E6E6E6;
        }
        .row .label {
            width: 30%;
            display: inline-block;   /* 使用 display 属性可以把一个内联元素变为块元素 */
            text-align: right;
        }
        .row1 {
            height: 82px;
            margin-bottom: 1px;
        }
        .intro {
            width: 30%;
            height: 82px;
            text-align: right;
            float: left;
            line-height: 82px;
        }
        .content {
            width: 70%;
            float: right;
        }
        div.title {
            height: 25px;
            text-align: center;
            background: #CCCCCC;
        }
        .footer {
            background: #CCCCCC;
            height: 25px;
            text-align: center;
        }
    </style>
</head>
<body>
<div class="box">
    <div class="title">用户注册</div>
    <form action="" method="post">
        <div class="row">
            <label class="label" for="username">用户名</label>
            <input type="text" id="username" name="username">
        </div>
        <div class="row">
            <label class="label" for="password">密码</label>
            <input type="password" id="password" name="password">
        </div>
        <div class="row">
            <label class="label">性别</label>
            <input type="radio" name="gender" id="man" checked value="男"> <label for="man">男</label>
            <input type="radio" name="gender" id="feman" value="女"> <label for="feman">女</label>
        </div>
        <div class="row">
            <label class="label">爱你</label>
            <input type="checkbox" name="hobby" id="writer" value="写作"> <label for="writer">写作</label>
            <input type="checkbox" name="hobby" id="music" value="听音乐"> <label for="music">听音乐</label>
        </div>
        <div class="row">
            <label class="label" for="province">省份</label>
            <select name="province" id="province">
                <option value="陕西省">陕西省</option>
            </select>
        </div>
        <div class="row row1">
            <div class="intro">自我介绍</div>
            <div class="content"><textarea name="intro" id="intro" cols="25" rows="5"></textarea></div>
        </div>
        <div class="footer">
            <input type="submit" value="提交">
            <input type="reset" value="重置">
        </div>
    </form>
</div>
</body>
</html>

弹性布局

        弹性布局是 CSS3 中出现一种布局方式,它的作用是更加方便快捷来进行页面布局。但它只能对一维元素进行布局,如果是多维元素就不能胜任。

要想使用弹性布局,我们就需要使用 display: flex; 来开启弹性布局。

引入案例:

1)不使用弹性布局,而是使用 DIV+CSS

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用DIV+CSS实现导航菜单</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        .container {
            width: 900px;
            height: 60px;
            margin: 0 auto;
        }
        ul {
            width: 100%;
            height: 100%;
        }
        ul li {
            list-style: none;
            width: 100px;
            height: 100%;
            background: #2A3C5C;
            float: left;
            text-align: center;   /* 水平居中 */
            line-height: 60px; /* 垂直居中 */
            color: white;
            font-weight: 500;
        }
        ul li:hover {
            background: #8B0000;
            cursor: pointer;  /* 将鼠标变为手 */
        }
    </style>
</head>
<body>
<div class="container">
    <ul>
        <li>游戏1</li>
        <li>游戏2</li>
        <li>游戏3</li>
        <li>游戏4</li>
        <li>游戏5</li>
        <li>游戏6</li>
        <li>游戏7</li>
        <li>游戏8</li>
        <li>游戏9</li>
    </ul>
</div>
</body>
</html>

2)使用弹性布局

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用弹性布局实现导航菜单</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        .container {
            width: 900px;
            height: 60px;
            margin: 0 auto;
            background: #317FE5;
        }
        ul {
            width: 100%;
            height: 100%;
            list-style: none;
            display: flex;   /* 开启弹性布局,注意它需要放到父容器中 */
        }
        ul li {
            width: 100px;
            height: 100%;
            background: #2A3C5C;
            color: white;
            text-align: center;
            line-height: 60px;
        }
        ul li:hover {
            background: #8B0000;
            cursor: pointer;  /* 将鼠标变为手 */
        }
    </style>
</head>
<body>
<div class="container">
    <ul>
        <li>游戏1</li>
        <li>游戏2</li>
        <li>游戏3</li>
        <li>游戏4</li>
        <li>游戏5</li>
        <li>游戏6</li>
        <li>游戏7</li>
        <li>游戏8</li>
        <li>游戏9</li>
    </ul>
</div>
</body>
</html>

弹性布局属性介绍

  • flex-direction:指定弹性容器中子元素的排列方式,默认是以水平轴为主轴,垂直轴为辅助轴。有以下几个值:

    • row,默认值,水平排列

    • row-reverse:水平反向排列

    • column:垂直排列

    • column-reverse:垂直反向排列

  • flex-wrap:设置弹性盒子的子元素超出父容器时是否换行,有以下几个值:

    • nowrap:不换行,默认值

    • wrap:换行

    • wrap-reverse:换行并反向排列

  • flex-flow:它是上面两个的简写方式

  • align-items:设置弹性盒子元素在侧轴(纵轴)方向上的对齐方式,有以下几个值:

    • flex-start:顶对齐,默认值

    • flex-end:底对齐

    • center:垂直居中对齐

    • baseline:基线对齐

    • stretch:拉申充满容器

  • align-content:修改 flex-wrap 属性的行为,类似于 align-items,但不是设置子元素对齐,而是设置行对齐。

  • justify-content:设置弹性盒子元素在主轴(横轴)方向上的对齐方式,有以下几个值:

    • flex-start:左对齐

    • flex-end:右对齐

    • center:水平居中对齐

    • space-around:子元素的左右空白相等的对齐方式

    • space-between:子元素平均分配空白,则左右两边对齐

    • space-evenly:子元素平均分配空白对象

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>弹性布局属性介绍</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      ul {
        width: 600px;
        height: 300px;
        border: 1px solid #666666;
        list-style: none;
        display: flex;
        flex-direction: row;
        flex-wrap: wrap;   /*nowrap,wrap, wrap-reverse*/
        /*align-items: flex-start;*/
        /*align-items: flex-end;*/
        /*align-items: center;*/
        /*align-items: baseline;*/
        /*align-items: stretch;*/
        /*justify-content: flex-start;*/
        /*justify-content: flex-end;*/
        /*justify-content: center;*/
        /*justify-content: space-around;*/
        /*justify-content: space-between;*/
        justify-content: space-evenly;
      }
      li {
        width: 150px;
        /*height: 100px;*/
        background: #317FE5;
      }
      li:first-child {
        background: #C44F00;
      }
      li:nth-child(2) {
        background: blue;
      }
      li:nth-child(3) {
        background: red;
      }
      li:nth-child(4) {
        background: #317FE5;
      }
      li:nth-child(5) {
        background: #2A3C5C;
      }
      li:nth-child(6) {
        background: #8B0000;
      }
      li:nth-child(7) {
        background: #333333;
      }
      li:nth-child(8) {
        background: blueviolet;
      }
    </style>
</head>
<body>
<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <!--<li>4</li>-->
    <!--<li>5</li>-->
    <!--<li>6</li>-->
    <!--<li>7</li>-->
    <!--<li>8</li>-->
</ul>
</body>
</html>

商品案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>弹性布局案例</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-size: 14px;
        }
        :root {
            --letterspace: 3px;
        }
        .container {
            width: 1100px;
            height: 600px;
            margin: 0 auto;
        }
        ul {
            width: 100%;
            height: 100%;
            list-style: none;
            display: flex;
            flex-wrap: wrap;
            justify-content: space-between;
        }
        li {
            width: 260px;
            height: 270px;
            display: flex;
            flex-direction: column;
        }
        li > img {
            width: 260px;
        }
        li div.title {
            width: 100%;
            height: 30px;
            background: #FB4E52;
            padding: 3px;
            display: flex;
            justify-content: space-between;
        }
        li div.title .name {
            width: 50%;
            background: #9D0002;
            color: white;
            text-align: center;
            letter-spacing: var(--letterspace);
        }
        li div.title .comfort {
            width: 50%;
            background: #ffffff;
            text-align: center;
            letter-spacing: var(--letterspace);
        }
        li div.footer {
            width: 100%;
            height: 30px;
            background: white;
            display: flex;
            justify-content: space-between;
        }
        li div.footer .price {
            width: 50%;
            color: red;
            font-weight: bold;
        }
        li div.footer .popularity {
            width: 50%;
            color: #989A9E;
            font-size: 12px;
            text-align: right;
            padding-right: 5px;
        }
    </style>
</head>
<body>
<div class="container">
    <ul>
        <li>
            <img src="image/111405.png">
            <div class="title">
                <span class="name">蕾丝薄杯</span>
                <span class="comfort">舒适透气</span>
            </div>
            <div class="footer">
                <span class="price">¥2581</span>
                <span class="popularity">2000人付款</span>
            </div>
        </li>
        <li>
            <img src="image/111405.png">
            <div class="title">
                <span class="name">蕾丝薄杯</span>
                <span class="comfort">舒适透气</span>
            </div>
            <div class="footer">
                <span class="price">¥2581</span>
                <span class="popularity">2000人付款</span>
            </div>
        </li>
        <li>
            <img src="image/111405.png">
            <div class="title">
                <span class="name">蕾丝薄杯</span>
                <span class="comfort">舒适透气</span>
            </div>
            <div class="footer">
                <span class="price">¥2581</span>
                <span class="popularity">2000人付款</span>
            </div>
        </li>
        <li>
            <img src="image/111405.png">
            <div class="title">
                <span class="name">蕾丝薄杯</span>
                <span class="comfort">舒适透气</span>
            </div>
            <div class="footer">
                <span class="price">¥2581</span>
                <span class="popularity">2000人付款</span>
            </div>
        </li>
        <li>
            <img src="image/111405.png">
            <div class="title">
                <span class="name">蕾丝薄杯</span>
                <span class="comfort">舒适透气</span>
            </div>
            <div class="footer">
                <span class="price">¥2581</span>
                <span class="popularity">2000人付款</span>
            </div>
        </li>
        <li>
            <img src="image/111405.png">
            <div class="title">
                <span class="name">蕾丝薄杯</span>
                <span class="comfort">舒适透气</span>
            </div>
            <div class="footer">
                <span class="price">¥2581</span>
                <span class="popularity">2000人付款</span>
            </div>
        </li>
        <li>
            <img src="image/111405.png">
            <div class="title">
                <span class="name">蕾丝薄杯</span>
                <span class="comfort">舒适透气</span>
            </div>
            <div class="footer">
                <span class="price">¥2581</span>
                <span class="popularity">2000人付款</span>
            </div>
        </li>
        <li>
            <img src="image/111405.png">
            <div class="title">
                <span class="name">蕾丝薄杯</span>
                <span class="comfort">舒适透气</span>
            </div>
            <div class="footer">
                <span class="price">¥2581</span>
                <span class="popularity">2000人付款</span>
            </div>
        </li>
    </ul>
</div>
</body>
</html>

登录案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>弹性布局之登录案例</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        body {
            background: #2B4B6B;
        }
        .container {
            width: 450px;
            height: 300px;
            background: white;
            border-radius: 5px;
            position: absolute;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%);
        }
        .logo_box {
            position: absolute;
            left: 50%;
            width: 130px;
            height: 130px;
            border-radius: 50%;
            border: 1px solid #eeeeee;
            padding: 10px;
            box-shadow: 0 0 10px #dddddd;
            transform: translate(-50%, -50%);
            background: white;
        }
        .logo_box > img {
            position: absolute;
            left: 10px;
            top: 10px;
            width: 110px;
            height: 110px;
            background: #eeeeee;
            border-radius: 50%;
        }
        .info_box {
            margin: 90px auto;
            width: 90%;
            height: 150px;
            display: flex;
            flex-direction: column; /* 将纵轴变为主轴 */
            justify-content: space-around;
            position: relative;
        }
        .info_box > .account > input {
            border: 1px solid #EDEFF3;
            height: 25px;
            border-radius: 5px;
            outline: none;
            padding-left: 30px;
        }
        .info_box > .account > img {
            width: 20px;
            height: 20px;
            position: absolute;
            left: 5px;
            top: 15px;
        }
        .info_box > .passwd > input {
            border: 1px solid #EDEFF3;
            height: 25px;
            border-radius: 5px;
            outline: none;
            padding-left: 30px;
        }
        .info_box > .passwd > img {
            width: 20px;
            height: 20px;
            position: absolute;
            left: 5px;
            top: 62px;
        }
        .info_box > input:focus {
            border: 1px solid #409EFF;
        }
        .btn_box {
            width: 100%;
            height: 30px;
            display: flex;
            justify-content: flex-end;
            align-items: center;
        }
        .btn_box > input {
            width: 60px;
            height: 30px;
            margin-left: 5px;
            color: white;
        }
        .btn_box > input[type="reset"] {
            background: #909399;
            border: none;
            border-radius: 3px;
        }
        .btn_box > input[type="submit"] {
            background: #409EFF;
            border: none;
            border-radius: 3px;
        }
    </style>
</head>
<body>
<div class="container">
    <div class="logo_box">
        <img src="image/logo.png">
    </div>
    <form action="" method="post">
        <div class="info_box">
            <div class="account">
                <img src="image/man.png">
                <input type="text" name="username">
            </div>
            <div class="passwd">
                <img src="image/lock.png">
                <input type="password" name="password">
            </div>
            <div class="btn_box">
                <input type="submit" value="登录">
                <input type="reset" value="重置">
            </div>
        </div>
    </form>
</div>
</body>
</html>

网格布局

        前面的弹性布局只适合用于对一维布局,而对于二维的布局就不行,我们需要使用网格布局来实现。它是通过行(row)和列(column)来构成的。

下面以一个简单案例来演示网格布局如何使用。案例的效果图如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>网格布局</title>
    <style>
        .box {
            /* 定义容器的大小 */
            width: 500px;
            height: 400px;
​
            /* 1. 启用网格布局*/
            display: grid;
​
            /* 2. 设置网格布局的列数,需要使用 grid-template-columns 属性,它的值可以是固定值,也可以是百分比 */
            /*grid-template-columns: 20% 20% 20% 20% 20%;*/
            grid-template-columns: repeat(5, 1fr); /* 重复 5 次(即 5 列), 1fr 表示等比例 */
​
            /* 2. 设置网格布局的行数,需要使用 grid-template-rows 属性,它的值可以是固定值,也可以是百分比 */
            /*grid-template-rows: 200px 200px 200px;*/
            grid-template-rows: repeat(3, 200px);
​
            /* 3. 设置单元格的间距 */
            grid-gap: 10px;
        }
        .box > div {
            border: 1px solid red;
        }
        .box > .test {
            /*grid-row-start: 2;  !* 指定开始行所在位置,这个值包含 *!*/
            /*grid-row-end: 3;  !* 指定结束行所在位置,这个值不包含 *!*/
            /*grid-column-start: 2;  !* 指定开始的列所在位置,这个值是包含的 *!*/
            /*grid-column-end: 5; !* 指定结束的列所在位置,这个值不包含 *!*/
​
            /* 上面的写法可以简化为下面的写法,格式为:开始行(或列)的位置 / 结束行(或列)的位置 */
            /*grid-row: 2 / 3;*/
            /*grid-column: 2 / 5;*/
​
            /* 还可以简化为如下的写法:格式为:开始行位置 / 开始列位置 / 结束行位置 / 结束列位置 */
            grid-area: 2 / 2 / 3 / 5;
        }
    </style>
</head>
<body>
<div class="box">
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div>
    <div>6</div>
    <div>7</div>
    <div class="test">8</div>
    <div>9</div>
    <div>7</div>
    <div>8</div>
    <div>9</div>
    <div>9</div>
    <div>9</div>
    <div>9</div>
</div>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值