目录
1. 盒子模型
页面布局要学习三大核心:盒子模型、浮动、定位
网页布局过程:
- 先准备好相关的网页元素,网页元素基本都是盒子Box。
- 利用CSS设置好盒子样式,然后摆放到相应位置。
- 往盒子里面装内容。
网页布局的核心本质:就是利用CSS摆盒子。
1.2 盒子模型(Box Model)组成
所谓盒子模型:就是把HTML页面中的布局元素看做是一个矩形的盒子,也就是一个盛装内容的容器。
CSS盒子模型本质上是一个盒子,封装周围的HTML元素,它包括:边框、外边距、内边距和实际内容。
盒子里的内容
盒子模型的组成:
border(边框)
content(内容)
padding(内边距)
margin(外边距)
1.1 边框(border)
border可以设置元素的边框。
- 边框有三部分组成:边框宽度(粗细)、边框样式、边框颜色
- 语法:
border : border-width | | border-style || border-color
属性 | 作用 |
---|---|
border-width | 定义边框粗细,单位是px |
border-style | 边框的样式 |
border-color | 边框颜色 |
1.1.1 border-style(边框类型)和border-color
border-style值 | 意义 |
---|---|
none | 没有边框即忽略所有边框的宽度(默认值) |
solid | 边框为单实线(最为常用的) |
dashed | 边框为虚线 |
dotted | 边框为点线 |
div {
width: 300px;
height: 200px;
border-width: 5px;
border-style: dashed;
border-color: pink;
}
1.1.2 边框简写border
边框简写:border: 1px solid red;
没有顺序
边框分开写法:
border-top: 1px solid red;
只设定上边框
boder-bottom: 5px bashed pink;
只设定下边框
div {
width: 300px;
height: 200px;
border-top: 5px solid pink;
border-bottom: 3px dashed red;
border-left: 2px dotted green;
border-right: 2px double yellow;
例子:设定上边框红色,其余边框蓝色。(利用层叠性)
div {
width: 200px;
height: 200px;
border: 5px solid blue;
border-top: 5px solid red;
}
1.1.3 表格的细线边框 border-collapse(边框合并)
border-collapse属性控制浏览器绘制表格边框的方式。它控制相邻单元格的边框。
语法:border-collapse: collapse;
- collapse单词是合并的意思
- border-collapse:collapse;表示相邻边框合并在一起
<style>
table {
width: 500px;
height: 249px;
}
table,
td {
border: 1px solid pink;
border-collapse: collapse;
}
</style>
</head>
<body>
<table align="center" cellspacing="0">
<thead>
<tr>
<th>排名</th>
<th>关键词</th>
<th>趋势</th>
<th>进入搜索</th>
<th>最近七日</th>
</tr>
</thead>
<tbody>
<tr>
<td>12</td>
<td>12</td>
<td>12</td>
<td>12</td>
<td>12</td>
</tr>
<tr>
<td>142</td>
<td>142</td>
<td>142</td>
<td>142</td>
<td>142</td>
</tr>
<tr>
<td>3797</td>
<td>3797</td>
<td>3797</td>
<td>3797</td>
<td>3797</td>
</tr>
</tbody>
</table>
</body>
如果没有 border-collapse: collapse;
就会变成单元格td线变粗(没有合并)。
1.1.4 边框会影响盒子实际大小
边框会额外增加盒子的实际大小,因此我们有两种方案解决:
- 测量盒子大小的时候,不量边框
- 如果测量的时候包含了边框,则需要在设定 width/height 时减去边框宽度
1.2 内边距(padding)⭐
padding属性用于设置内边距,即边框与内容之间的距离。
属性 | 作用 |
---|---|
padding-left | 左内边距 |
padding-right | 右内边距 |
padding -top | 上内边距 |
padding-bottom | 下内边距 |
padding简写属性:
值的个数 | 表达意思 |
---|---|
padding : 5px; | 1个值,代表上下左右都有5像素内边距 |
padding :5px 10px; | 2个值,代表上下内边距是5像素,左右内边距是10像素 |
padding: 5px 10px 20px; | 3个值,代表上内边距5像素,左右内边距10像素,下内边距20像素 |
padding :5px 10px 20px 30px | 4个值,上是5像素,右是10像素,下20像素,左是30像素,顺时针 |
以上四种情况,我们实际开发都会遇到。
1.2.1 padding会影响盒子大小的情况⭐
⭐当我们给盒子指定padding值之后,发生了两件事:
- 内容和边框有了距离,增加了内边距。
- padding影响了盒子的实际大小
⭐也就是说,如果盒子已经有了宽度和高度,此时再指定内边框,会撑大盒子。
💡解决:
如果保证盒子跟效果图大小保持一致,则让 width/height 减去多出来的内边距大小即可
利用padding影响盒子大小(如导航栏)
但是,有时候 padding 影响盒子大小是有好处的,比如我们要做导航:
因为每个导航栏里面的字数不一样多,我们可以不用给每个盒子宽度了,直接给 padding 最合适。
案例1:新浪导航栏
<head>
<style>
.nav {
border-top: 3px solid #ff8500;
border-bottom: 1px solid #edeef0;
background-color: #fcfcfc;
}
.nav a {
/* a属于行内元素 此时必须要转换成行内块,这样设置的高度41px才会有效 */
display: inline-block;
height: 41px;
font-size: 12px;
line-height: 41px;
color: #4c4c4c;
text-decoration: none;
padding: 0 20px;
}
.nav a:hover {
background-color: #eee;
color: #ff8500;
}
</style>
</head>
<body>
<div class="nav">
<a href="#">新浪导航</a>
<a href="#">手机新浪网</a>
<a href="#">移动客户端</a>
<a href="#">微博</a>
<a href="#">三个字</a>
</div>
</body>
案例2:小米侧边栏(修改)
padding内边距可以撑开盒子,有时候也会让我们去修改宽度(以确保最后盒子的宽度是预期效果)
所以小米侧边栏这个案例,文字距离左侧的距离不应该用text-indent,实际开发使用padding更精确。
<style>
a {
display: block;
background-color: #a5a3a3;
color: #fff;
width: 200px;
height: 40px;
text-decoration: none;
text-align: left;
font-size: 14px;
line-height: 40px;
padding-left: 30px;
}
a:hover {
background-color: #ff6700;
}
</style>
</head>
<body>
<a href="#">手机</a>
<a href="#">电视</a>
<a href="#">笔记本 平板</a>
<a href="#">家电</a>
<a href="#">出行 穿戴</a>
<a href="#">智能 路由器</a>
<a href="#">电源 配件</a>
<a href="#">健康 儿童</a>
<a href="#">耳机 音箱</a>
<a href="#">生活 箱包</a>
</body>
1.2.2 padding不会影响盒子大小的情况
如果盒子本身没有指定width/height属性,则此时padding不会撑开盒子大小
<head>
<style>
div {
width: 300px;
height: 100px;
background-color: purple;
}
div p {
padding: 30px;
background-color: skyblue;
}
</style>
</head>
<body>
<a href="#">手机</a>
<a href="#">电视</a>
<a href="#">笔记本 平板</a>
<a href="#">家电</a>
<a href="#">出行 穿戴</a>
<a href="#">智能 路由器</a>
<a href="#">电源 配件</a>
<a href="#">健康 儿童</a>
<a href="#">耳机 音箱</a>
<a href="#">生活 箱包</a>
<div>
<p></p>
</div>
</body>
p没有设置宽度的情况下(padding不影响盒子大小),因为p是块元素,块元素宽度默认是容器(父级元素)的100%。
但如果设置了p宽度(padding影响了盒子大小):
div p {
width: 100%;
padding: 30px;
background-color: skyblue;
}
则效果就变成:
1.3 外边距(margin)
margin(外边距)属性用于设置外边距,即控制盒子和盒子之间的距离
属性 | 作用 |
---|---|
margin-left | 左外边距 |
margin-right | 右外边距 |
margin-top | 上外边距 |
margin-bottom | 下外边距 |
margin简写方式代表意义跟padding完全一致 |
1.3.1 外边距典型应用——块级盒子水平居中
外边距可以让块级盒子水平居中,但是必须满足两个条件:
- 盒子必须制定了宽度(width)
- 盒子左右的外边距都设置为 auto
语法:
.header {
width: 960px;
margin: 0 auto;
}
常见的写法,以下三种都可以:
margin-left: auto; margin-right: auto;
margin: auto;
margin: 0 auto;
⭐注意: 以上方法是让块级元素居中,行内元素或者行内块元素水平居中:给其父元素添加 text-align: center
即可。
1.3.2 外边距合并
使用 margin 定义块级元素的垂直外边距时,可能会出现外边距的合并。
主要有两种情况:
- 相邻块元素垂直外边距的合并(兄弟上下块元素之间,只会出现垂直的现象)
- 嵌套块元素垂直外边距的塌陷(父子级之间)
①相邻块元素垂直外边距的合并
当上下相邻的两个块元素(兄弟关系)相遇时,如果上面的元素有下外边距 margin-bottom,下面的元素有上外边距 margin-top ,则他们之间的垂直间距不是 margin-bottom 与 margin-top 之和。取两个值中的较大者这种现象被称为相邻块元素垂直外边距的合并。
解决方案:尽量只给一个盒子添加 margin 值
②嵌套块元素垂直外边距的塌陷
对于两个嵌套关系(父子关系)的块元素,父元素有上外边距同时子元素也有上外边距,此时父元素会塌陷较大的外边距值。
例如:
<head>
<style>
.father {
width: 400px;
height: 400px;
background-color: purple;
margin-top: 50px;
}
.son {
width: 200px;
height: 200px;
background-color: pink;
margin-top: 100px;
}
</style>
</head>
<body>
<div class="father">
<div class="son"></div>
</div>
</body>
解决方案:
- 可以为父元素定义上边框
- 可以为父元素定义上内边距
- 可以为父元素添加 overflow: hidden
- 还有其他方法,比如浮动、固定、绝对定位的盒子不会有塌陷问题。后面会进行总结。
解决1:父元素定义边框:
.father {
width: 400px;
height: 400px;
background-color: purple;
margin-top: 50px;
/* 父元素定义边框 */
border: 1px solid transparent;
}
效果:
解决2:父元素定义上内边距
.father {
width: 400px;
height: 400px;
background-color: purple;
margin-top: 50px;
/* 父元素定义边框 */
padding: 1px;
}
解决3:父元素添加 overflow: hidden
.father {
width: 400px;
height: 400px;
background-color: purple;
margin-top: 50px;
overflow: hidden;
}
加边框和内边距会使盒子变大,而加 overflow: hidden;
并不会使盒子变大。
1.4 清除内外边距
网页元素很多都带有默认的内外边距,而且不同浏览器默认的也不一致。因此我们在布局前,首先要清除下网页元素的内外边距。
* {
padding: 0;
margin: 0;
}
⭐注意:
行内元素为了照顾兼容性,尽量只设置左右内外边距,不要设置上下内外边距。但是转换为块级和行内块元素就可以了。
2. PS
2.1 PS基本操作
因为网页美工大部分效果图都是利用 PS(Photoshop)来做的,所以以后我们大部分切图工作都是在 PS 里面完成。
-
文件➡打开 :可以打开我们要测量的图片
-
Ctrl+R:可以打开标尺,或者 视图➡标尺
-
右击标尺,把里面的单位改为像素
-
Ctrl+ 加号(+)可以放大视图, Ctrl+ 减号(-)可以缩小视图
-
按住空格键,鼠标可以变成小手,拖动 PS 视图
-
用选区拖动 可以测量大小
-
Ctrl+ D 可以取消选区,或者在旁边空白处点击一下也可以取消选区
2.2 PS切图
PS 有很多的切图方式:图层切图、切片切图、PS 插件切图等。
- 图层切图
最简单的切图方式:移动工具点击图片找到图层➡右击图层 ➡快速导出为PNG
但在很多情况下,我们需要合并图层再导出:
- 选中需要的图层:图层菜单➡合并图层(ctrl+e)
- 右击➡快速导出为PNG
-
切片切图
利用切片选中图片
利用切片工具手动划出
导出选中的图片
文件菜单➡存储为 web 设备所用的格式➡选择我们要的图片格式➡存储 -
PS插件切图
Cutterman 是一款运行在 Photoshop 中的插件,能够自动将你需要的图层进行输出,以替代传统的手工 “导出 web 所用格式” 以及使用切片工具进行挨个切图的繁琐流程。
官网:Cutterman官网
注意:Cutterman 插件要求你的 PS 必须是完整版,不能是绿色版,所以大家需要安装完整版本
3 综合案例——产品模块
分析布局:
box布局
PS取整个页面底色: #f5f5f5
body {
background-color: #f5f5f5;
}
PS测量:W:298px、H:415px、box盒子的背景色:白色(#fff)
.box {
width: 298px;
height: 415px;
background-color: #fff;
/* 让块级盒子水平居中对齐 */
margin: 100px auto;
}
img布局
图片太大?修改img属性为和盒子一样宽:
.box img {
width: 100%;
}
review布局
评价和详情制作
p.review部分:因为这个段落没有width属性,所以 padding 不会撑开盒子的宽度
但是要设置高度,为了div.appraise位置相同。
.review {
height: 70px;
font-size: 14px;
/* 因为这个段落没有width属性,所以 padding 不会撑开盒子的宽度 */
padding: 0 28px;
margin-top: 30px;
}
appraise布局
div.appraise部分:
.appraise {
font-size: 12px;
color: #b0b0b0;
padding: 0 28px;
margin-top: 20px;
}
info布局
.info {
font-size: 14px;
margin-top: 15px;
padding: 0 28px;
}
.info h4 {
display: inline-block;
font-weight: 400;
}
.info span {
color: #ff6700;
}
div.info部分细节:
- 竖线 | 有自己的颜色和粗细,将其放到一个盒子em中去。
- 盒子与盒子之间的距离用margin
.info em {
/* 让倾斜的文字不倾斜 */
font-style: normal;
color: #ebe4e0;
margin: 0 6px 0 15px;
}
<div class="info">
<h4>Redmi AirDosts无线蓝...</h4>
<em>|</em> <span>99.9元</span>
</div>
链接补充…
最后
<head>
<style>
* {
margin: 0;
padding: 0;
}
body {
background-color: #f5f5f5;
}
.box {
width: 298px;
height: 415px;
background-color: #fff;
/* 让块级盒子水平居中对齐 */
margin: 100px auto;
}
.box img {
width: 100%;
}
.review {
height: 70px;
font-size: 14px;
/* 因为这个段落没有width属性,所以 padding 不会撑开盒子的宽度 */
padding: 0 28px;
margin-top: 30px;
}
.appraise {
font-size: 12px;
color: #b0b0b0;
padding: 0 28px;
margin-top: 20px;
}
.info {
font-size: 14px;
margin-top: 15px;
padding: 0 28px;
}
.info h4 {
display: inline-block;
font-weight: 400;
}
.info span {
color: #ff6700;
}
.info em {
/* 让倾斜的文字不倾斜 */
font-style: normal;
color: #ebe4e0;
margin: 0 6px 0 15px;
}
a {
color: #333;
text-decoration: none;
}
</style>
</head>
<body>
<div class="box">
<img src="images/img.jpg" alt="">
<p class="review"><a href="#">快递牛,整体不错蓝牙可以秒连。红米给力</a></p>
<div class="appraise">来自于117384232的评价</div>
<div class="info">
<h4><a href="#">Redmi AirDosts无线蓝...</a></h4>
<em>|</em> <span>99.9元</span>
</div>
</div>
</body>
4 综合案例——快报模块
box和h3部分
.box {
width: 248px;
height: 163px;
border: 1px solid #ccc;
margin: 100px auto;
}
.box h4 {
height: 32px;
font-size: 14px;
font-weight: 400;
line-height: 32px;
border-bottom: 1px dotted #ccc;
/* 盒子内部的相对位置改变用padding,没有设置宽,左右不会撑大盒子 */
padding-left: 15px;
}
要写:
* {
margin: 0;
padding: 0;
}
否则标题就会变成:
快报模块列表制作ul
.box ul li a {
text-decoration: none;
font-size: 12px;
color: #666;
}
<body>
<div class="box">
<h4>品优购快报</h4>
<!-- ul>li*5>a -->
<ul>
<li><a href="#">【特惠】爆款耳机5折秒!</a></li>
<li><a href="#">【特惠】母亲节,健康好礼低至5折!</a></li>
<li><a href="#">【特惠】爆款耳机5折秒!</a></li>
<li><a href="#">【特惠】9.9元洗100张照片!</a></li>
<li><a href="#">【特惠】长虹智能空调立省1000</a></li>
</ul>
</div>
</body>
⭐去掉 li 前面的 项目符号(小圆点)
语法:list-style: none;
li {
list-style: none;
}
设置li的高度并且垂直居中:
.box ul li {
height: 23px;
line-height: 23px;
}
设置li距离左侧和上侧的距离:
.box ul li {
height: 23px;
line-height: 23px;
padding-left: 20px;
}
.box ul {
margin-top: 7px;
}
鼠标经过有下划线:
.box ul li a:hover {
text-decoration: underline;
}
最终效果:
<head>
<style>
/* 如果不加这个就会导致后面h3盒子始终有个上下边距视觉上标题没有垂直居中 */
/* 而且h3中设置了边框视觉上看上去就会导致标题内容和边框一起,上面有个空白 */
* {
margin: 0;
padding: 0;
}
li {
list-style: none;
}
.box {
width: 248px;
height: 163px;
border: 1px solid #ccc;
margin: 100px auto;
}
.box h4 {
height: 32px;
font-size: 14px;
font-weight: 400;
line-height: 32px;
border-bottom: 1px dotted #ccc;
/* 盒子内部的相对位置改变用padding,没有设置宽,左右不会撑大盒子 */
padding-left: 15px;
}
.box ul li a {
text-decoration: none;
font-size: 12px;
color: #666;
}
.box ul li a:hover {
text-decoration: underline;
}
.box ul li {
height: 23px;
line-height: 23px;
padding-left: 20px;
}
.box ul {
margin-top: 7px;
}
</style>
</head>
<body>
<div class="box">
<h4>品优购快报</h4>
<!-- ul>li*5>a -->
<ul>
<li><a href="#">【特惠】爆款耳机5折秒!</a></li>
<li><a href="#">【特惠】母亲节,健康好礼低至5折!</a></li>
<li><a href="#">【特惠】爆款耳机5折秒!</a></li>
<li><a href="#">【特惠】9.9元洗100张照片!</a></li>
<li><a href="#">【特惠】长虹智能空调立省1000</a></li>
</ul>
</div>
</body>
5 一些解惑
- 布局为啥用不同的盒子,只想用div?
- 标签都是有语义的,合理的地方用合理的标签。比如产品标题就用 h,大量文字段落就用p
- 为啥用那么多类名?
- 类名就是给每一个盒子起一个名字,就可以更好的找到这个盒子,选取盒子更容易,后期维护也方便。
- 到底用 margin 还是 padding ?
- 大部分情况都可以用,各有优缺,根据实际情况,总有更简单的方法实现。
- 自己做没有思路?
- 布局有很多实现方式,尝试自己做出自己的风格。
6 圆角边框(C3新增)border-radius
- 在 CSS3 中,新增了圆角边框样式,这样我们的盒子就可以变圆角了。
- border-radius 属性用于设置元素的外边框圆角。
border-radius: length;
- radius半径(圆的半径) 原理:(椭)圆与边框的交集形成圆角效果
常用圆角边框写法
- 参数值可以是数值或百分比的形式
- ⭐如果是正方形,想要设置为一个圆,把数值修改为高度或者宽度的一半即可,或者直接写为50%
- ⭐如果是一个矩形,设置为高度的一半就可以(圆角矩形)
- 该属性是一个简写属性,可以跟四个值,分别代表左上角,右上角,右下角,左下角(顺时针),两个数值是对角相同
- 分开写:
border-top-left-radius:
border-top-right-radius:
border-bottom-right-radius:
border-bottom-left-radius:
设置为圆:
div {
width: 300px;
height: 300px;
background-color: pink;
/* border-radius: 150px; */
border-radius: 50%;
}
7 盒子阴影(C3新增)box-shadow⭐
CSS3 中新增了盒子阴影,我们可以使用 box-shadow 属性为盒子添加阴影。
box-shadow: h-shadow v-shadow blur spread color inset;
值 | 描述 |
---|---|
h-shadow | 必需。水平(horizontal)阴影的位置,允许负值 |
v-shadow | 必需。垂直(vertical)阴影的位置,允许负值 |
blur | 可选。模糊距离。 |
spread | 可选,阴影的尺寸。 |
color | 可选,阴影的颜色。 |
inset | 可选,将外部阴影(outset)改为内部阴影 |
- 模糊距离:影子的虚实
- 阴影尺寸:影子的大小
⭐⭐注意:
- 默认的是外阴影(outset),但是不可以在后面写这个单词,否则导致阴影无效,要改为内阴影最后加上inset
- 盒子阴影不占用空间,不会影响其他盒子排列
div {
width: 200px;
height: 200px;
background-color: pink;
margin: 100px auto;
}
/* 原先盒子没有影子,当我们鼠标经过盒子就添加阴影效果 */
div:hover {
box-shadow: 10px 10px 10px -4px rgba(0, 0, 0, 0.3);
}
8 文字阴影(C3新增)了解
在 CSS3 中,我们可以使用 text-shadow 属性将阴影应用于文本。
text-shadow: h-shadow v-shadow blur color
值 | 描述 |
---|---|
h-shadow | 必需。水平阴影的位置,允许负值 |
v-shadow | 必需。垂直阴影的位置,允许负值 |
blur | 可选。模糊距离 |
color | 可选,阴影的颜色。 |
p {
font-size: 50px;
color: orangered;
font-weight: 700;
text-shadow: 5px 5px 6px rgba(0, 0, 0, 0.3);
}