1 CSS三大特性
1.1 层叠性
层叠性是指时间选择器给设置相同的样式,此时一个样式就会覆盖(层叠)另一个冲突的样式。层叠性主要解决样式冲突问题。
层叠性原则:
1.样式冲突,遵循的原则是就近原则,哪个样式离结构近,执行哪个样式。
2.样式不冲突,不会层叠。
以下是层叠性的例子。层叠性只会把冲突的样式进行层叠,不冲突的不会层叠。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>层叠性</title>
<!-- 层叠性指:时间选择器给设置相同的样式,此时一个样式就会覆盖(层叠)另一个冲突的样式。层叠性主要解决样式冲突问题。 -->
<style>
/* 层叠性原则: */
/* 1.样式冲突,遵循的原则是就近原则,哪个样式离结构近,执行哪个样式 */
/* 样式不冲突,不会层叠 */
div {
color: red;
/* 字体大小不会覆盖 */
font-size: 12px;
}
div {
color: pink;
}
</style>
</head>
<body>
<div>长江后浪推前浪</div>
</body>
</html>
1.2 继承性
继承,在现实生活中,好似你继承了父亲的类。
CSS中的继承是指子标签会继承父标签的某些样式,如文本颜色和字号。继承可以用来简化代码。
子元素可以继承父亲的样式,如text-,font-,line-这些元素开头的和color可以继承。
以下有一个例子。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>继承性</title>
<!-- 现实中的继承:我们继承了父亲的姓 -->
<!-- css中的继承:子标签会继承父标签的某些样式,如文本颜色和字号 -->
<!-- 以便简化代码 -->
<!-- 子元素可以继承父亲的样式,如text-,font-,line-这些元素开头的可以继承以及color -->
<!-- <style>
div {
color: pink;
font-size: 14px;
}
</style> -->
<style>
body {
color: red;
font: 12px/1.5 'Microsoft YaHei';
/* 写成1.5 这样写最大的优势就是里面子元素可以根据自己文字大小自动调整行高 */
}
div {
/* 子元素继承了父元素body的行高 1.5 */
/* 这个1.5就是当前元素文字大小 font-size的1.5倍 所以当前div的行高为21px*/
font-size: 14px;
}
p {
/* 1.5*16 = 当前的行高24 */
font-size: 16px;
}
/* li没有手动指定文字大小 则会继承父亲的文字大小body 12px 所有li的文字大小为12px */
/* 当前li的行高就是12*1.5 = 18px */
</style>
</head>
<body>
<div>粉红色的回忆</div>
<p>粉红色的回忆</p>
<ul>
<li>我没有指定文字大小</li>
</ul>
</body>
</html>
上述代码中,行高需要注意的是:设置为1.5,子标签会继承父亲的文字大小,然后行高是文字大小的1.5倍。
1.3 优先级
优先级的含义:当同一个元素指定多个选择器,就会有优先级的产生。
- 选择器相同,则执行层叠性。
- 选择器不同,则依据选择器权重执行。
以下是各个选择器的权重。
- 继承或者*选择器权重:0,0,0,1
- 元素选择器权重:0,0,0,1
- 类选择器,伪类选择器权重:0,0,0,1
- ID选择器权重:0,1,0,0
- 行内样式style=""选择器权重1,0,0,0
- !important 选择器权重为无穷大
优先级的注意点:
- 权重是由4组数组组成的,但是不会有进位
- 可以理解为类选择器永远大于元素选择器,id选择器永远大于类选择器
- 等级判断从左往右,如果某一位数值相同,则判断下一位数值
- 继承的权重是0!!!!!!不管父元素权重多高,子元素得到的权重永远是0。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>优先级</title>
<style>
.test {
color: red
}
div {
color: pink!important;
/* 这是直接无穷大 */
}
#demo {
color: green;
}
body {
color: red;
}
</style>
</head>
<body>
<!-- 优先级:当同一个元素指定多个选择器,就会有优先级的产生 -->
<!-- 1、选择器相同,则执行层叠性 -->
<!-- 2、选择器不同,则根据选择器权重执行 -->
<!-- 继承或者* 选择器权重:0,0 0,0 -->
<!-- 元素选择器 选择器权重:0,0,0,1 -->
<!-- 类选择器,伪类选择器 选择权重 0,0,1,0 -->
<!-- ID选择器 选择权重 0,1,0,0 -->
<!-- 行内样式style="" 选择器权重1,0,0,0 -->
<!-- !important重要的 选择器权重为无穷大 -->
<div class="test" id="demo">你笑起来真好看</div>
<a href="#">我不会继承body</a>
<!-- a链接浏览器默认指定了一个样式 蓝色的有下划线 所以他不会继承父亲样式-->
<!-- 优先级注意点: -->
<!-- 1.权重是有4组数组组成,但是不会有进位。 -->
<!-- 2.可以理解为类选择器永远大于元素选择器,id选择器永远大于类选择器 -->
<!-- 3.等级判断从左往右,如果某一位数值相同,则判断下一位数值 -->
<!-- 4.继承的权重是0!!!!!! 不管父元素权重多高,子元素得到的权重永远是0-->
</body>
</html>
1.4 权重叠加
复合选择器有权重叠加的问题,但是权重会叠加,却永远不会进位。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>权重叠加</title>
<style>
/* 复合选择器有权重叠加的问题 */
/* 权重虽然会叠加,但是永远不会进位 */
/* ul li的权重0,0,0,1+0,0,0,1=0,0,0,2 */
ul li {
color: green;
}
li {
color: red;
}
/* .nav li 权重为0,0,1,0+0,0,0,1 = 0,0,1,1 */
.nav li {
color: blue;
}
</style>
</head>
<body>
<ul class="nav">
<li>大猪蹄子</li>
<li>大肘子</li>
<li>猪尾巴</li>
</ul>
</body>
</html>
2 css盒子模型
网页核心的本质是利用css摆放盒子。
以下是步骤。
- 先准备好相关的网页元素,网页元素基本都是盒子box
- 利用css设置好盒子样式,然后摆放到相应位置
- 往盒子里面装内容。
以下是一些属性。
- border:边框
- content:内容
- padding:内边距
- margin:外边距
2.1 盒子模型之边框
border-width:边框的粗细(单位px)
border-style:边框样式
- solid:实线边框
- dashed:虚线
- dotted:点线边框
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=\, initial-scale=1.0">
<title>盒子模型之边框</title>
<style>
div {
width: 300px;
height: 200px;
/* 边框的粗细 */
border-width: 5px;
/* 边框的样式 */
/* solid:实线边框 */
/* border-style: solid; */
/* dashed:虚线 */
/* dotted:点线边框*/
border-style:dotted;
border-color: green;
}
</style>
</head>
<body>
<div></div>
</body>
</html>
复合写法:border:边框大小 border-style color
还可以分别设置上边框、下边框等
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>边框的复合写法</title>
<style>
div {
width: 500px;
height: 300px;
/* 复合写法 */
/* border: 5px solid red; */
/* 可以分别设置上边框和下边框: */
border-top: 5px solid purple;
border-bottom: 5px dotted blue;
}
</style>
</head>
<body>
<div></div>
</body>
注意:添加边框后,盒子的宽度和高度需要加上边框的2倍,所以要保持添加后的盒子大小和之前一致的话,需要减去边框的大小。
2.2 表格细线
border-collapse:collapse可以合并表格相邻的边框。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>表格细线边框</title>
<style>
table,
td,th {
border: 1px solid red;
/* 合并相邻的边框 */
border-collapse: collapse;
font-size: 14px;
text-align: center;
}
th {
height: 35px;
}
table {
width: 500px;
height: 249px;
}
</style>
</head>
<body>
<table>
<thead>
<th>排名</th>
<th>关键词</th>
<th>趋势</th>
<th>进入搜索</th>
<th>最近七日</th>
<th>相关链接</th>
</thead>
<tbody>
<tr>
<td>1</td>
<td>鬼吹灯</td>
<td><img src="" alt="上升"></td>
<td>456</td>
<td>123</td>
<td>
<a href="#">贴吧</a>
<a href="#"> 图片</a>
<a href="#"> 百科</a>
</td>
</tr>
<tr>
<td>1</td>
<td>鬼吹灯</td>
<td><img src="" alt="上升"></td>
<td>456</td>
<td>123</td>
<td><a href="#">贴吧</a>
<a href="#"> 图片</a>
<a href="#"> 百科</a>
</td>
</tr>
<tr>
<td>3</td>
<td>西游记</td>
<td><img src="" alt="下降"></td>
<td>456</td>
<td>123</td>
<td><a href="#">贴吧</a>
<a href="#"> 图片</a>
<a href="#"> 百科</a>
</td>
</tr>
<tr>
<td>3</td>
<td>西游记</td>
<td><img src="" alt="下降"></td>
<td>456</td>
<td>123</td>
<td><a href="#">贴吧</a>
<a href="#"> 图片</a>
<a href="#"> 百科</a>
</td>
</tr>
<tr>
<td>1</td>
<td>鬼吹灯</td>
<td><img src="" alt="上升"></td>
<td>456</td>
<td>123</td>
<td>
<a href="#">贴吧</a>
<a href="#"> 图片</a>
<a href="#"> 百科</a>
</td>
</tr>
<tr>
<td>1</td>
<td>鬼吹灯</td>
<td><img src="" alt="上升"></td>
<td>456</td>
<td>123</td>
<td><a href="#">贴吧</a>
<a href="#"> 图片</a>
<a href="#"> 百科</a>
</td>
</tr>
</tbody>
</table>
</body>
</html>
加不加 border-collapse: collapse;的效果对比图。
不加的时候:
加的时候:
2.3 padding属性
padding属性用于设置内边距,即边框与内容之间的距离。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>内边距</title>
<!-- padding属性用于设置内边距,即边框与内容之间的距离 -->
<style>
div {
background-color: aliceblue;
width: 200px;
height: 200px;
padding-left: 20px;
padding-right: 20px;
padding-top: 20px;
padding-bottom: 20px;
}
</style>
</head>
<body>
<div>你是谁我是谁打打打的大卫阿娇的大大大大大大大哇</div>
</body>
</html>
padding的复合属性。
- 如果padding后面跟一个值,意思是上下左右都是那个值。
- 如果padding后面跟两个值,代表上下是第一个值,左右是第二个值
- 如果padding后面跟三个值,代表上,左右,下
- 如果padding后面跟四个值,上,右,下,左
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>padding复合属性</title>
<style>
div {
/* 如果padding后面跟一个值,意思是上下左右都是5px */
/* padding: 5px */
/* 如果padding后面跟两个值,代表上下是第一个值,左右是第二个值 */
/* padding: 5px 10px; */
/* 如果padding后面三个值 代表上,左右,下 */
/* padding: 5px 10px 20px; */
/* padding后面四个值:上、右、下、左 */
padding: 5px 10px 20px 30px;
}
</style>
</head>
<body>
<div>大大的坏蛋</div>
</body>
</html>
注意:当给我们的盒子指定padding值之后,发生两件事:
- 内容和边框有了距离,添加了内边距
- padding影响了盒子的实际大小,也就是说,如果盒子已经有了高度和宽度,此时在指定内边距,会撑大盒子。
如何解决?
答:如果保证盒子跟效果图大小保持一致,则让width和height减去多出来的内边距大小即可。
padding应用:新浪导航栏
每个导航栏文字字数不同,这会导致不美观,如何解决?
答:给盒子padding合理,巧妙应用padding撑大盒子。
因为如果盒子本身没有指定width/height属性,则此时padding不会撑开盒子大小。遇到孩子和父亲这种嵌套关系的,孩子没必要写宽度,不然写padding会撑开。
2.4 margin属性
margin属性用于设置外边距,即控制盒子和盒子之间的距离
margin简写方式和padding完全一致!!!!
外边距的典型运用:
- 外边距可以让块级盒子水平居中,但是必须满足两个条件:
- 盒子必须指定了宽度
- 盒子左右的外边距都设置为auto
注意:以上方法是让块级元素水平居中,行内元素或者行内块元素水平居中给其父元素添加text-align:center即可。
以下是一个例子。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>外边距典型运用-块级盒子水平居中对齐</title>
<!-- 外边距可以让块级盒子水平居中,但是必须满足两个条件 -->
<!-- 1.盒子必须指定了宽度 -->
<!-- 2.盒子左右的外边距都设置为auto -->
<!-- 注意:以上方法是让块级元素水平居中,行内元素或者行内块元素水平居中给其父元素添加text-align:center即可 -->
<style>
div {
width: 300px;
margin: 0 auto;
background-color: red;
text-align: center;
}
</style>
</head>
<body>
<div>你好</div>
</body>
</html>
外边距合并-嵌套块元素塌陷
对于两个嵌套关系的块元素,父元素有上外边距同时子元素也有上外边距,此时父元素会塌陷较大的外边距。
解决方案:
- 可以为父元素定义上边框
- 可以为父元素定义上内边距
- 可以为父元素添加overflow:hidden
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>外边距合并-嵌套块元素塌陷</title>
<style>
.father {
width: 400px;
height: 400px;
background-color: purple;
margin-top: 50px;
/* 解决方案:1.可以为父元素定义上边框 */
/* border: 1px solid transparent; */
/* 2.可以为父元素定义上内边距 */
/* padding: 1px; */
/* 3.可以为父元素添加overflow:hidden */
overflow: hidden;
}
.son {
width: 200px;
height: 200px;
background-color: pink;
/* 对于两个嵌套关系的块元素,父元素有上外边距同时子元素也有上外边距,此时父元素会塌陷较大的外边距 */
/* margin-top: 100px; */
}
</style>
</head>
<body>
<div class="father">
<div class="son">
</div>
</div>
</body>
</html>
2.5 清除内外边距
网页元素很多都带有默认的内外边距,而且不同浏览器默认的也不一致,因此我们在布局前,需要清除网页元素的内外边距。
记住:行内元素是为了照顾兼容性,尽量只设置左右内外边距,不要设置上下内外边距,但是转换为块级和行内元素就可以了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>清除内外边距</title>
<style>
/* 记住;行内元素为了照顾兼容性,尽量只设置左右内外边距,不要设置上下内外边距,但是转换为块级和行内元素就可以了 */
* {
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<!-- 网页元素很多都带有默认的内外边距,而且不同浏览器默认的也不一致,因此我们在布局前,需要清除网页元素的内外边距 -->
123
<ul>
<li>dadada</li>
</ul>
</body>
</html>
3 ps基本操作
网页美工大部分效果都是利用ps来做的,所以以后我们大部分的切图工作都是在PS里面完成。
ctrl+R打开标尺,右击换成像素
ctrl+加号放大视图
ctrl+减号缩小视图
按住空格键,鼠标可以变成小手,拖动ps视图
通过选区来测量大小
ctrl+D可以取消选区,或者在旁边空白处点击一下也可以取消选区
吸管工具!
4 综合案例-产品布局模块分析
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<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;
margin-top: 20px;
padding: 0 28px;
}
.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-left: 15px;
margin-right: 6px;
}
a {
color:#333;
text-decoration: none;
}
</style>
</head>
<body>
<div class="box">
<img src="img.jpg" alt="">
<p class="review">
快递牛,整体不错蓝牙可以说秒连。红米给力
</p>
<div class="appraise">
来自于 117384232 的评价
</div>
<div class="info">
<h4><a href="#">Redmi AirDots真无限蓝...</a></h4>
<em>|</em>
<span>99.9元</span>
</div>
</div>
</body>
效果图如下: