CSS 基础
框架
赖先生 1994年提出CSS概念(层叠样式表),用于指定网页文档的样式和布局,用 html 标签分隔内容,分块,再用css控制距离、大小等属性。
CSS 框架 | 内容 | 备注 |
---|---|---|
语法 | 选择器 声明 @media | |
布局 | 研究屏幕平面如何分布 新手推荐由小到大的布局思路 | 文档流:默认布局方式 脱离文档流:浮动、绝对定位、相对定位 float布局(IE专用) 父元素 .clearfix 子元素 float:left flex布局(一维) 父元素 display:flex grid布局(二维) 父元素 display:grid |
定位 | 研究垂直于屏幕如何分布 | positon:static默认值/relative相对定位/absolute绝对定位/fixed固定定位 |
动画 |
工具
-
关键词 MDN
-
关键词 CSS tricks
-
最权威的标准 W3C 搜索 CSS specc
-
张鑫旭的博客
-
常用草图软件:Balsamiq、Figma、墨刀、Adobe XD
调试
- W3C验证器
- 用VScode、WebStorm编辑器看代码颜色
- 用开发者工具看警告:是否有选择器、样式是否被划掉、是否有警告
- Border调试法:border没出现,说明选择器或者语法错了
.a{
color:red
border: 1px solid red; /*可控制在哪行来判断代码是否错误*/
}
常见错误:拼写错误(选择器、属性名、属性值、大小写)、没写分号、中文冒号、没写反花括号、没加单位。
引入
引入方式 | 内容 | 备注 |
---|---|---|
行内样式 | 直接在元素上,加style 属性 | 优先级最高 |
内部样式表 | 直接写在<head> 标签内,添加<style> 标签 | |
外部样式表 | 用<head> 标签内的<link> 标签引入样式文件 |
// 行内样式
<p style="color:red"> 我是内联样式</p>
// 内部样式表
<style>
p{color:red}
</style>
// 外部样式表
<link rel="stylesheet" type="text/css" href="style.css">
语法
CSS语法由选择器和声明组成。
/*语法一*/
选择器{
属性名:属性值;
/*注释 区分大小写,注意分号*/
}
/*语法二*/
@charset "UTF-8"; /*必须放在第一行,必须以分号;结尾*/
@import url(2.css); /*必须以分号;结尾*/
@media(min-width:100px)and(max-width:200px){
语法一
}
选择器分类 | 内容 | 备注 |
---|---|---|
全局选择器 | 可与任何元素匹配;初始化 | 优先级最低 |
基础选择器 | 元素选择器 类选择器 (对应元素的class属性 用 . )id选择器 (对应元素的id属性 用 # )通配符选择器 | |
关系选择器 | 后代选择器:选择所有被祖先元素包含的后代元素 子代选择器:选择所有被祖先元素包含的直接子元素 相邻兄弟选择器:选择紧跟E元素后的F元素,相邻的第一个兄弟元素 通用兄弟选择器:选择E元素之后的所有兄弟元素F | 后代 E F{} 子代 E>F{} 相邻兄弟 E+F{} 通用兄弟 E~F{} |
// 全局选择器
*{
margin:0;
}
// 元素选择器
<p>hello</p>
p{color:red}
// 类选择器
<p class='content size'> hello</p>
.content{color:red}
.size{font-size:14}
<!--后代选择器-->
<ul>
<li>benz</li>
<li>BMW</li>
<ul>
ul li{color:green}
<!--子代选择器-->
<div>
<p>hello</p>
<ul>
<li>
<p>nice</p>
</li>
</ul>
<div>
div > p {color:green}
盒模型
-
盒模型可以想象为一个盒子里装东西content,这个东西跟盒子边框的距离就是padding,盒子的壳子厚度就是border,这个盒子的外边距margin。
-
两种盒子在页面流和元素之间的关系上表现不同的行为。
块元素、行内元素
display: inline; // 内联元素,比如 span
display: block; // 块级元素,比如 div
display: inline-block; // 内联块元素
display: flex; // 弹性块
display: table; // table块
span{第$个span元素}*8 // 按tab键快速输入8个span元素
span.id{第$个inline-block元素}*4
文档流 | 流动方向 | 宽度 | 高度 |
---|---|---|---|
span inline元素 | 从左到右 | 由内联元素的总宽度决定 不接受指定宽度 | 由行高line-height间接决定,跟height无关 |
div block元素 | 从上到下 | 默认自动计算宽度auto不是100% 可由width指定 | 由内部文档流元素决定,可设置高度 |
内联块元素 inline-block元素 | 从左到右 | 结合前两者特点 可由width指定 | 跟block类似,可设置高度 |
CSS中不要写宽度100%
当内容大于容器时,会溢出:
.div1{
border:1px solid red;
height:200px;
overflow:hidden; // 值可以取:visible/hidden/scroll/auto
}
脱离文档流:
span{
position:absolute; // 值为 absolute/fixed 或者是 float:left;
}
CSS 布局
把页面分成一块一块,按左中右、上中下等排列
布局方式 | 内容 | 备注 |
---|---|---|
固定宽度 | PC端 | 960 / 1000 / 1024px |
不固定宽度 | 手机端 | 根据文档流原理布局 |
响应式布局 | PC端固定,手机不固定 | 混合布局 |
文档流
指的是网页中元素默认的排列方式,自上而下,从左到右。文档中可显示对象在排列时所占用的位置,有很多不利限制,导致页面效果无法实现
脱离文档流
有三种方式:浮动、绝对定位、相对定位
浮动
浮动是用于让网页中同级下不能并排的盒子实现并排效果。
float属性定义元素向左或向右浮动。可实现元素的水平排列。
元素设置浮动以后,会脱离文档流造成父元素高度塌陷。
清除浮动方案:父元素设置高度、受影响的元素添加clear属性、overflow清除浮动、伪对象方式。
Flex布局
display:flex // 弹性盒模型。设置为flex后,可以控制下级盒子的位置
Flex布局是一种用于按行或按列布局元素的一维布局方法,举个🌰:
当元素<body>
设置为Flex框时,就自动有了坐标轴和3个默认属性:flex-direction
、justify-content
、align-items
这个父元素即为flex容器,其内的子元素<p>
即为flex项flex item
,flex项沿着两个轴布局:主轴是沿着flex项放置的方向延伸的轴,交叉轴是垂直于flex项放置方向的轴。
- 父元素
flex-direction:column;
// 指定主轴的方向,默认为row 从左到右; column 从上到下
justify-content:center // 控制flex项在主轴上的位置
align-items:center // 控制flex项在交叉轴上的位置,默认是stretch
- 下级盒子
align-self:flex-end;
margin:auto;
flex:1
- flex是由以下属性组成的缩写:
flex-grow:
flex-shirk: // 用于溢出容器的 flex 项
flex-basis:
- flex-flow
flex-direction:column; // 指定主轴的方向,默认为row 从左到右
flex-wrap:wrap // 指定flex项是否换行,默认为nowrap
// 可合并缩写为
flex-flow:column wrap
Grid布局
display:grid
布局方案选择
CSS 定位
布局是屏幕平面上的,定位是垂直于屏幕的
position属性值 | 描述 | 备注 |
---|---|---|
static | 默认值 | |
relative | 相对定位 | 用于给absolute元素做爸爸 配合 z-index |
absolute | 绝对定位(脱离文档流) | 定位基准是祖先里的非static |
fixed | 固定定位(脱离文档流) | 相对于视口的定位 用于广告页、回到顶部按钮 |
相对定位
升起来,但不脱离文档流。
用法一:用于做位移
<div class="container">
<div class="demo"></div>
</div>
.container{
border:1px solid red;
height: 300px;
}
.demo{
border:1px solid green;
width:50px;
height:50px;
position:relative; /*占的位置不变,显示的有偏移*/
top:10px;
}
用法二:用于给absolute元素做爸爸
用法三:配合 z-index
每个元素的 z-index属性 默认为auto,计算出的值为0,
绝对定位
脱离原来的位置,另起一层,比如对话框的关闭按钮:
absolute是相对于其祖先元素中第一个不是position:static
定位的,即定位基准是祖先里的非static
固定定位
用于广告页、回到顶部按钮
div 分层
层叠上下文
某些DIV的渲染顺序是由z-index的值影响的。这些DIV的特殊属性可以使他们形成一个层叠上下文,
对于定位了的元素z-index = 0
,在内联子元素的上方,对于定位元素z-index = -1
就在background的下方,但不低于HTML元素。
CSS 动画
动画其实就是由多个静止的画面,也叫帧,以每秒30张的速度连续播放,人脑视觉错乱的把这些静止的画面当成了活动的。播放速度=每秒xx帧,游戏一般是30帧/s
js优化:使用requestAnimationFrame代替setTimeout或setInterval;
css优化:使用will-change或translate;
transform 变形金刚
动画v1.0
inline元素不支持transform,需要先变成block
有四个常用功能:
- translate 位移
(比较生硬的动画效果,配合transition过渡会平滑很多,也就是translate只是1.0版本的动画,而transition就是2.0版本的动画,有点丝滑了,后面会说,看后面的实例代码也体现了这点)
transform:rotate(45deg) translateY(32px);
- 缩放 scale
transform:scale(1.2); /放大1.2倍
- 旋转 rotate
用于360度旋转制作loading,到用时再搜索rotate MDN文档
transform:rotate(45deg) translateY(32px); /先旋转45度,再沿y轴平移32像素
- 倾斜 skew
transform:skewX(xx);
- 多重组合效果和取消所有
transform:rotate(45deg) translateY(-100%,-100%);
transform:none; /取消所有
transition
动画v2.0,平滑的效果,作用就是补充中间帧
transition: all .5s; /所有属性过渡 0.5s
transition: 属性名 时长 过渡方式 延迟 /transition: left 200ms linear
不是所有属性都能过渡!
过渡必须要有起始,一般只有一次动画或者两次,中间点的话,就只有通过中继的方式:a先到b,b再到c,通过setTimeout或者监听transitionend事件,还有一种方式就是用animation。
animation 声明关键帧
动画v3.0与v2.0的transition相比,keyframes可以控制动画序列的中间步骤
-
缩写语法animation:时长|过渡方式 |延迟 |次数 |方向 |填充模式 |是否暂停 |动画名
-
@keyframe完整语法:一种是from to;另一种写法是百分数。
-
如何让动画停在最后一帧:加个forwards 或者搜索css animation stop at end
实例:
/* 语法2 */
@keyframes slidein {
from {
transform: translateX(0%);
}
to {
transform: translateX(100%);
}
}
/* 语法2 */
@keyframes identifier {
0% { top: 0; left: 0; }
30% { top: 50px; }
68%, 72% { left: 50px; }
100% { top: 100px; left: 100%; }
}
transition版 制作爱心
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div id="heart">
<div class="left"></div>
<div class="right"></div>
<div class="bottom"></div>
</div>
</body>
</html>
box-sizing:border-box属性:padding和border的值就不会在影响元素的宽高,相当于把padding和border的值都算在content里。盒子模型会自动根据padding和border的值来调整content的值,就不需要手动调整
*{
margin:0;padding:0;box-sizing:border-box;
}
#heart{
margin:100px;
position:relative; /*00相对定位,父元素*/
display: inline-block; /*快捷键为d:ib让border缩小*/
transition: all .5s; /*给图案加动画2.0效果,加了个渐进过渡的平滑效果,用transition的属性*/
}
#heart:hover{
transform:scale(1.2); /*给图案加动画1.0效果,只能生硬的变大,用transform的scale属性*/
}
#heart>.bottom{
width:50px;
height:50px;
transform:rotate(45deg); /*把正方形旋转45度*/
background: red;
border-radius:0% 0% 10% 0%;
}
#heart>.left{
width:50px;
height:50px;
position:absolute; /*00绝对定位,子元素以父元素为基准*/
bottom:100%; /*01定位调整,把left调整到bottom的上方.先让left的底边上去*/
right:100%; /*01定位调整,把left调整到bottom的左上方*/
transform:rotate(45deg) translateX(32px); /*02格式调整,transform先加个旋转,再用translate整体平移,各种试值调到要的位置*/
border-radius:50% 0% 0% 50%; /*02格式调整,用border-radius的完整格式各种试值调到要的形状*/
background: red;
}
#heart>.right{
width:50px;
height:50px;
position:absolute; /*00绝对定位,子元素以父元素为基准*/
bottom:100%;
left:100%;
transform:rotate(45deg) translateY(32px);
border-radius:50% 50% 0% 0%;
background: red;
}
/*写代码时,要先给元素加个边框,方便找到位置,敲完后再删去*/
/*border-radius:50% 0% 0% 0% 四个角圆形*/
/*易错1:不加>*/
/*易错2:中英文切换时标点符号忘切英文/
必须自己思考和写一遍这个过程,这样一些顺序和细节就会得到复习。
animation版 制作爱心
*{
margin:0;padding:0;box-sizing:border-box;
}
#heart{
display: inline-block;
margin:100px;
position:relative;
animation: heart 800ms infinite alternate,liner;
/*循环*/
}
@keyframes heart{
0%{
transform: scale(1.0);
}
100%{
transform: scale(1.2);
}
}
#heart>.bottom{
width:50px;
height:50px;
transform:rotate(45deg);
background: red;
border-radius:0% 0% 10% 0%;
}
#heart>.left{
width:50px;
height:50px;
position:absolute;
bottom:100%;
right:100%;
transform:rotate(45deg) translateX(32px);
border-radius:50% 0% 0% 50%;
background: red;
}
#heart>.right{
width:50px;
height:50px;
position:absolute;
bottom:100%;
left:100%;
transform:rotate(45deg) translateY(32px);
border-radius:50% 50% 0% 0%;
background: red;
}
CSS Sprite 精灵图
一种网页图片应用处理方式,允许将一个页面涉及到的所有零星图片都包含到一张大图中去。
CSS心得
-
不必全部都搞懂,只需要知道个框架和常用的东西就行,到用时再搜索rotate MDN文档;
-
梳理时,要学会看懂MDN的语法示例;
-
css需要想象力,而不是逻辑;
-
css给出的属性都很简单,但是可以组合得很复杂。
CSS 进阶
grid layout 网页自适应;
Mobile First 和 Desktop First 理念
博文内容来自饥人谷官网