0x01 双飞翼布局和圣杯布局
关于网页布局,有两种常用方式:双飞翼布局和圣杯布局。下面是相关示例:
双飞翼布局:
html文档:
实例
<!-- 主体 --> <div class="container"> <!-- 双飞翼DOM结构 --> <!-- 内容主体 --> <div class="wrap"> <!-- 主体内容区 --> <div class="main"> <h1>主体内容区</h1> </div> </div> <!-- 左侧边栏 --> <div class="left"> <h1>左侧</h1> </div> <!-- 右侧边栏 --> <div class="right"> <h1>右侧</h1> </div> </div>
运行实例 »
点击 "运行实例" 按钮查看在线实例
对应的css样式:
实例
/* 第一步:设置主体的宽度 */ .container { width: 90%; /* 父元素应该由子元素撑开,不要写高度 */ margin: 5px auto; background-color: lightgray; } /* 第二步:设置左中右内容区的高度 */ .left { width: 200px; min-height: 600px; background-color: lightgreen } .right { width: 200px; min-height: 600px; background-color: lightcoral } /* 中间内容区宽度分离,使盒子不受padding影响 */ .wrap { /* 子元素100%表明占满父元素的全部空间 */ width: 100%; background-color: lightblue; } .main { /* 一般高度都设置在子元素上,父元素的高度由子元素撑起 */ min-height: 600px; } /* 第三步:将主体,左右两侧全部浮动 */ .wrap, .left, .right { float: left; } .container { overflow: hidden; } /* 第四步:将左右区块移动到相应的位置上 */ /* margin属性一般和浮动配合使用 */ .main { padding: 0 200px; } .left { margin-left: -100%; } .right { margin-left: -200px; }
运行实例 »
点击 "运行实例" 按钮查看在线实例
圣杯布局:
实例
<!-- 主体 --> <div class="container"> <!-- 圣杯DOM结构 --> <!-- 主体内容区 --> <div class="main"> <h1>主体内容区</h1> </div> <!-- 左侧边栏 --> <div class="left"> <h1>左侧</h1> </div> <!-- 右侧边栏 --> <div class="right"> <h1>右侧</h1> </div> </div>
运行实例 »
点击 "运行实例" 按钮查看在线实例
对应的css样式:
实例
/* 第一步:设置主体的宽度 */ .container { width: 90%; /* 父元素应该由子元素撑开,不要写高度 */ margin: 5px auto; background-color: lightgray; } /* 第二步:设置左中右内容区的高度 */ .left { width: 200px; min-height: 600px; background-color: lightgreen } .right { width: 200px; min-height: 600px; background-color: lightcoral } .main { width: 100%; background-color: lightblue; /* 一般高度都设置在子元素上,父元素的高度由子元素撑起 */ min-height: 600px; } /* 第三步:将主体,左右两侧全部浮动 */ .main, .left, .right { float: left; } .container { overflow: hidden; } /* 第四步:将左右区块移动到相应的位置上 */ /* margin属性一般和浮动配合使用 */ .main { /* 设置一个盒子大小的计算方式,将盒子的计算标准设置到边框上 */ box-sizing: border-box; padding: 0 200px; } .left { margin-left: -100%; } .right { margin-left: -200px; }
运行实例 »
点击 "运行实例" 按钮查看在线实例
0x02 网站模拟
由于内容过多,请拉到最后看效果图。以下是相关代码:
实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <link rel="stylesheet" href="static/css/style5.css"> <title>网站练习</title> </head> <body> <!-- 头部 --> <div class="header"> <!-- 头部内容区 --> <div class="content"> <!-- 导航 --> <ul class="nav"> <li class="item"><a href="">首页</a></li> <li class="item"><a href="">公司新闻</a></li> <li class="item"><a href="">最新产品</a></li> <li class="item"><a href="">关于我们</a></li> <li class="item"><a href="">联系我们</a></li> </ul> </div> </div> <!-- 轮播图 --> <div class="slider"> <img src="static/images/2233.png" alt=""> </div> <!-- 主体 --> <div class="container"> <!-- 圣杯DOM结构 --> <!-- 主体内容区 --> <div class="main"> <ul class="goods_list"> <li class="list_item"> <div class="good_wrap"> <div class="good_img"> <a href=""></a> </div> <div class="good_price"><i>¥</i><span>41.80</span></div> <div class="good_name"><a href="">死侍 皮卡丘 神奇宝贝COS盒装手办动漫周边创意实用生日礼物 死侍皮卡丘</a></div> <div class="good_commit"><a href="">900+<a><span>条评价</span></div> <div class="good_shop"> <a href="">兰鲸家居专营店</a> <a class="service" href=""></a> </div> <div class="good_icon"> <i class="icon1">放心购</i> <i class="icon2">每满41-2</i> <i class="icon3">险</i> </div> <div class="good_control"> <a class="contrast" href=""><i></i><span>对比</span></a> <a class="follow" href=""><i></i><span>关注</span></a> <a class="add" href=""><i></i><span>加入购物车</span></a> </div> </div> </li> </ul> </div> <!-- 左侧边栏 --> <div class="left"> <ul class="type_list"> <li class="list_item"><a href="">视频</a><span>0</span></li> <li class="list_item"><a href="">音频</a><span>0</span></li> <li class="list_item"><a href="">专栏</a><span>0</span></li> <li class="list_item"><a href="">相簿</a><span>282</span></li> </ul> </div> <!-- 右侧边栏 --> <div class="right"> <div class="right_header"> <a href="">原创榜</a> <a href="">流行榜</a> <a href="">支持榜</a> </div> <div class="right_content"> <div class="control"> <a href=""><i class="play"></i>全部播放</a> <a href=""><i class="refresh"></i>下一批</a> </div> <div class="music_list"> <ol class="rank" id="rank"> <li class="first"><a class="before" href=""><span>千里行走</span></a><a class="after" href=""><span>暗杠/寅子</span></a></li> <li class="second"><a class="before" href=""><span>再谈记忆</span></a><a class="after" href=""><span>盘尼西林</span></a></li> <li class="third"><a class="before" href=""><span>赤伶</span></a><a class="after" href=""><span>HITA</span></a></li> <li class="rank_item"><a class="before" href=""><span>最近</span></a><a class="after" href=""><span>李圣杰</span></a></li> <li class="rank_item"><a class="before" href=""><span>孤独な巡礼</span></a><a class="after" href=""><span>川井憲次</span></a></li> <li class="rank_item"><a class="before" href=""><span>童话镇Plus</span></a><a class="after" href=""><span>暗杠</span></a></li> <li class="rank_item"><a class="before" href=""><span><span>海绵***</span></a><a class="after" href=""><span>回音哥</span></a></li> <li class="rank_item"><a class="before" href=""><span>干杯</span></a><a class="after" href=""><span>五月天</span></a></li> <li class="rank_item"><a class="before" href=""><span>画</span></a><a class="after" href=""><span>赵雷</span></a></li> <li class="rank_item"><a class="before" href=""><span>旅途</span></a><a class="after" href=""><span>朴树</span></a></li> </ol> </div> </div> </div> </div> <!-- 底部 --> <div class="footer"> <!-- 底部内容区 --> <div class="content"> <p> <!-- ©为版权实体符 --> <a href="">© html.io版权所有</a> | <a href="">0759-33****332</a> | <a href="">皖ICP备19**6666</a> </p> </div> </div> <script type="text/javascript"> function bgChange() { var lis = document.getElementById('rank').getElementsByTagName('li'); for (var i = 0; i < lis.length; i += 2) lis[i].style.background = '#EEE'; } window.onload = bgChange; </script> </body> </html>
运行实例 »
点击 "运行实例" 按钮查看在线实例
对应的css样式:
实例
body, h1, p { /* 首先要清除body默认的margin 8px */ margin: 0; } body { background-color: #eee; } /* 头部样式 开始 */ .header { /* 通过内容撑开 */ /* 一般header的背景色设置和内容区的颜色一致 */ background-color: #000; } /* 头部内容区 */ .header .content { /* 实现自适应,且不顶边 */ width: 90%; height: 60px; background-color: #000; margin: 0 auto; } /* 头部中的导航 */ .header .content .nav { /* 清除ul默认样式 */ margin: 0; padding: 0; } .header .content .nav .item { list-style: none; } .header .content .nav .item a { float: left; /* 设置宽和高做好使用最小值,防止没有内容时会进行收缩 */ min-width: 80px; /* 高度根据导航栏高度设定以撑开导航栏 */ min-height: 60px; text-align: center; line-height: 60px; color: #fff; /* 清除下划线 */ text-decoration: none; padding: 0 15px; } /* 伪类设置鼠标滑动到元素上的效果 */ .header .content .nav .item a:hover { background: red; /* 设置字体为原来的1.1倍 */ font-size: 1.1rem; } /* 设置轮播图 */ .slider { width: 90%; margin: 5px auto; } .slider img { width: 100%; } /* 主体 */ /* 第一步:设置主体的宽度 */ .container { box-sizing: border-box; width: 90%; /* 父元素应该由子元素撑开,不要写高度 */ margin: 5px auto; background-color: lightgray; border: 1px solid rgb(216, 216, 216); border-radius: 6px; } /* 第二步:设置左中右内容区的高度 */ .left { box-sizing: border-box; width: 200px; /* min-height: 600px; */ background-color: rgb(248, 248, 248); border-right: 1px solid rgb(216, 216, 216); border-bottom: 1px solid rgb(216, 216, 216); border-top-left-radius: 6px; border-bottom-right-radius: 6px; } .left .type_list { margin-top: 20px; padding: 0; } /* 消除li默认小圆点 */ .left .type_list .list_item { list-style: none; padding-left: 30px; } .left .type_list .list_item:hover { background-color: #eee; } .left .type_list .list_item a { display: inline-block; text-decoration: none; color: #333; min-height: 40px; width: 110px; text-align: left; line-height: 40px; margin-right: 12px; } .left .type_list .list_item a:hover { color: lightskyblue; cursor: pointer; } .left .type_list .list_item span { display: inline-block; font-size: 400; width: 32px; color: #888; text-align: center; line-height: 40px; } .right { box-sizing: border-box; width: 200px; /* min-height: 600px; */ background-color: rgb(248, 248, 248); border-left: 1px solid rgb(216, 216, 216); border-bottom: 1px solid rgb(216, 216, 216); border-top-right-radius: 6px; border-bottom-left-radius: 6px; } .right .right_header { margin: 20px 5px 0; min-height: 30px; } .right .right_header a { float: left; text-decoration: none; width: 60px; height: 30px; text-align: center; line-height: 30px; border-bottom: 2px solid #dadada; font-size: 14px; color: #666; } .right .right_header a:hover { font-weight: bold; cursor: pointer; color: #333; border-bottom: 2px solid lightskyblue; } .right .right_content .control { min-height: 36px; } .right .right_content .control a { float: right; text-decoration: none; color: #666; font-size: 12px; text-align: center; line-height: 36px; margin-right: 12px; } .right .right_content .control a:hover { color: lightskyblue; } .right .right_content .control .refresh { background-image: url("../images/refresh.png"); background-repeat: no-repeat; background-position: center; float: left; width: 12px; height: 12px; margin: 13px 3px 0; } .right .right_content .control .play { background-image: url("../images/play.png"); background-repeat: no-repeat; background-position: center; float: left; width: 12px; height: 12px; margin: 13px 3px 0; } .right .right_content .music_list .rank { margin-top: 0; padding-left: 30px; } .right .right_content .music_list .rank li { line-height: 40px; margin-bottom: 8px; } .right .right_content .music_list .rank .rank_item { padding-left: 5px; color: #333; } .right .right_content .music_list .rank .first { padding-left: 5px; color: #ed2a20; } .right .right_content .music_list .rank .second { padding-left: 5px; color: #eb7000; } .right .right_content .music_list .rank .third { padding-left: 5px; color: #f1a009; } .right .right_content .music_list .rank a { text-decoration: none; } .right .right_content .music_list .rank span { display: inline-block; color: #555; font-size: 13px; height: 40px; } .right .right_content .music_list .rank span:hover { color: lightskyblue; } .right .right_content .music_list .rank .after { float: right; width: 60px; margin-right: 10px; text-align: right; } .main { /* width: 100%; */ background-color: rgb(248, 248, 248); /* 一般高度都设置在子元素上,父元素的高度由子元素撑起 */ min-height: 600px; } .main .goods_list { margin-top: 0; padding: 0; } .main .goods_list .list_item { list-style: none; margin-left: 3px; } .main .goods_list .list_item .good_wrap { padding: 30px 10px 10px; width: 220px; min-height: 300px; margin: 20px 0; float: left; } .main .goods_list .list_item .good_wrap:hover { box-shadow: 0 0 10px #bbb; /* border: 1px solid lightgray; */ } .main .goods_list .list_item .good_wrap .good_img a { display: inline-block; height: 220px; width: 220px; text-decoration: none; background-image: url("../images/ss.jpg"); background-repeat: no-repeat; background-position: center; margin-bottom: 10px; } .main .goods_list .list_item .good_wrap .good_price { line-height: 22px; height: 22px; margin: 0 0 8px; } .main .goods_list .list_item .good_wrap .good_price i { font-style: normal; font-style: 16px; color: #e4393c; font-weight: 400; } .main .goods_list .list_item .good_wrap .good_price span { color: #e4393c; font-size: 20px; font-weight: 400; line-height: 22px; } .main .goods_list .list_item .good_wrap .good_name { height: 40px; margin-bottom: 6px; overflow: hidden; } .main .goods_list .list_item .good_wrap .good_name a { text-decoration: none; color: #333; font-size: 13px; } .main .goods_list .list_item .good_wrap .good_name a:hover { color: #e4393c; } .main .goods_list .list_item .good_wrap .good_commit { height: 18px; margin-bottom: 8px; } .main .goods_list .list_item .good_wrap .good_commit a { text-decoration: none; color: #646fb0; font-weight: 700; font-size: 12px; } .main .goods_list .list_item .good_wrap .good_commit span { color: #999; font-weight: normal; } .main .goods_list .list_item .good_wrap .good_shop { line-height: 18px; height: 18px; margin-bottom: 8px; } .main .goods_list .list_item .good_wrap .good_shop a { text-decoration: none; font-size: 12px; color: #777; } .main .goods_list .list_item .good_wrap .good_shop .service { display: inline-block; width: 12px; height: 12px; background-image: url("../images/icon.png"); background-repeat: no-repeat; background-position: center; margin: 0 0 -2px 2px; } .main .goods_list .list_item .good_wrap .good_icon { height: 16px; line-height: 16px; margin-bottom: 8px; } .main .goods_list .list_item .good_wrap .good_icon i { font-style: normal; font-size: 12px; line-height: 16px; text-align: center; } .main .goods_list .list_item .good_wrap .good_icon .icon1 { box-sizing: border-box; border: 1px solid #4b9bfc; border-radius: 3px; color: #4b9bfc; padding: 0 3px; } .main .goods_list .list_item .good_wrap .good_icon .icon2 { box-sizing: border-box; border: 1px solid #e23a3a; border-radius: 3px; color: #e23a3a; padding: 0 3px; } .main .goods_list .list_item .good_wrap .good_icon .icon3 { box-sizing: border-box; background-color: #4b9bfc; border-radius: 3px; color: #fff; padding: 1px 4px; } .main .goods_list .list_item .good_wrap .good_control { margin: 14px 0 6px; } .main .goods_list .list_item .good_wrap .good_control i { font-style: normal; display: inline-block; } .main .goods_list .list_item .good_wrap .good_control a { text-decoration: none; display: inline-block; font-size: 12px; } .main .goods_list .list_item .good_wrap .good_control .contrast { height: 25px; line-height: 25px; border: 1px solid #DDD; padding: 0 3px; background: #fff; color: #999; } .main .goods_list .list_item .good_wrap .good_control .contrast:hover { color: #e23a3a; border-color: #e23a3a; } .main .goods_list .list_item .good_wrap .good_control .contrast:hover i { border-color: #e23a3a; } .main .goods_list .list_item .good_wrap .good_control .contrast i { height: 12px; width: 12px; border: 1px solid #DDD; top: 2px; position: relative; } .main .goods_list .list_item .good_wrap .good_control .contrast span { display: inline-block; padding: 0 3px 0 5px; } .main .goods_list .list_item .good_wrap .good_control .follow { height: 25px; line-height: 25px; /* border-top: 1px solid #DDD; border-bottom: 1px solid #DDD; */ border: 1px solid #DDD; padding: 0 3px; background: #fff; color: #999; margin-left: -5px; } .main .goods_list .list_item .good_wrap .good_control .follow:hover { color: #e23a3a; border-color: #e23a3a; } .main .goods_list .list_item .good_wrap .good_control .follow:hover i { background-image: url("../images/ax_after.png"); background-repeat: no-repeat; background-position: center; } .main .goods_list .list_item .good_wrap .good_control .follow i { height: 14px; width: 14px; background-image: url("../images/ax_before.png"); background-repeat: no-repeat; background-position: center; top: 3px; position: relative; } .main .goods_list .list_item .good_wrap .good_control .follow span { display: inline-block; padding: 0 3px 0 5px; } .main .goods_list .list_item .good_wrap .good_control .add { height: 25px; line-height: 25px; /* border-top: 1px solid #DDD; border-bottom: 1px solid #DDD; */ border: 1px solid #DDD; padding: 0 3px; background: #fff; color: #999; margin-left: -4.8px; } .main .goods_list .list_item .good_wrap .good_control .add:hover { border-color: #e23a3a; } .main .goods_list .list_item .good_wrap .good_control .add i { height: 14px; width: 14px; background-image: url("../images/add.png"); background-repeat: no-repeat; background-position: center; top: 3px; position: relative; } .main .goods_list .list_item .good_wrap .good_control .add span { display: inline-block; padding: 0 3px 0 5px; color: #e23a3a; } /* 第三步:将主体,左右两侧全部浮动 */ .main, .left, .right { float: left; } .container { overflow: hidden; } /* 第四步:将左右区块移动到相应的位置上 */ /* margin属性一般和浮动配合使用 */ .main { /* 设置一个盒子大小的计算方式,将盒子的计算标准设置到边框上 */ box-sizing: border-box; padding: 0 200px; } .left { margin-left: -100%; } .right { margin-left: -200px; } /* 页面的底部样式 开始 */ .footer { /* background-color: lightgray; */ } .footer .content { width: 90%; background-color: #444; height: 60px; margin: 0 auto; } .footer .content p { text-align: center; line-height: 60px; } .footer .content p a { color: #999; text-decoration: none; } .footer .content p a:hover { color: #fff; }
运行实例 »
点击 "运行实例" 按钮查看在线实例
0x03 总结
1. 双飞翼布局和圣杯布局的区别其实就在于对于主体内容区的处理上。对于双飞翼布局来说:它采取了宽度分离的方式,使内容盒子的padding属性不再对盒子造成影响;对于圣杯布局来说:它重新设置了内容盒子大小的计算方式,将盒子的计算标准设置到边框上。然后其余部分差别不大。
2. 对于元素高度的处理上,一般父级元素只需要设置宽度,其宽度由子元素的内容撑开。
3. 将一个元素浮动后,该元素就变成了块元素。浮动元素一般和margin配合使用布局。
4. 有两个问题我想了很久还是没解决:
(1)主体内容区是靠左右边栏挤出来的,所以设置主体是width:90%; 然后主体内容区设置100%以自适应。但这导致一个问题,当改变浏览器的分辨率时,例如调到80%,那么内容区中的内容会收缩,例如下面的商品会跑到上一列。但内容区又不能设置宽度,左右边栏会错位。最终是通过在内容外再加个盒子,给该盒子设置宽度暂时解决的,但缩小后和左右边框间距过大,有一大片空白。。。
(2)有序列表的序号的背景色无法设置。