高级特效开发阶段学习总结
目录
一、css预编译工具
一、npm方式下载
二、 基本语法
三、编译生成css文件
四、监视文件变化(自动编译生成css文件)
五、监视目录变化
六、进阶语法
二、元素的固定宽高比等比例缩放
一、原理
二、具体步骤
三、屏幕自适应大小
一、什么是rem布局
二、rem的作用
三、应用场景
五、总结:
四、bootstrap
一、bootstrap的安装方式
一、下载方式
二、引入项目
布局
一、响应式布局
二、断点
三、布局容器
四、网格布局
单选框和多选框
一、单选框(radio)
二、多选框(checkbox)
三、开关按钮
四、按钮式单选框
float-position-flex
一、float浮动
二、position定位
三、flex弹性盒子
文本的操作
1、对齐方式
2、换行和溢出
3、字体大小
4、粗细和加斜
5、行高
6、文本装饰线
size-space-stack
一、size(元素大小操作)
二、space
三、stack间距
gird网格布局
一、网格布局基本用法
二、横向纵向排列方式
三、单元格的偏移
四、单元格间距
五、指定每一行显示多少列
五、react
React的引入
一、React简介
二、环境搭建
条件渲染和循环渲染
一、条件渲染
二、循环渲染
受控组件
一、受控组件是什么
二、屏蔽默认事件
状态提升
一、理论原理
二、操作方法
一、css预编译工具
一、npm方式下载
npm install -g sass
二、 基本语法
定义变量:
语法:
$varName :value
$color:red
访问变量:
.content{
color: $color
}
三、编译生成css文件
语法:sass <inputPath> <outputPath>
<inputPath>:要编译的sass或scss文件路径
<outputPath>:编译完的css文件的输出路径
sass main.scss ./css/main.css
四、监视文件变化(自动编译生成css文件)
添加--watch 标识 可以让sass自动监视文件变化 然后自动输出到指定路径
sass --watch main.scss ./css/main.css
五、监视目录变化
路径参数变成 <inputDir>:<outputDir> 这样就可以监视文件夹中任一文件的变化并输出到对应文件夹
sass --watch ./sass:./css
六、进阶语法
1、嵌套
嵌套的本质就是后代选择器
ul{ background-color:#f00; li{ border:1px solid black; } }
2、混合(类似函数)
定义一个混合:
@mixin fn($a:50px,$b:orange){ height:$a; width:$a; background-color:$b; }
调用混合:
.box{ //不带参数调用混合 @include fn; //带指定参数 @include fn($b:red) //按顺序传参 @includ fn(50px,blue) }
3、样式的继承
声明父样式
%parent{ width:200px; height:200px; background-color:red }
继承父样式:
.box{ @extend %parent }
4、四则运算
// 四则运算 .box4 { // 加减法需要相同单位进行运算 // width: 1px + 1em; width: 100px + 100px; width: 200px - 100px; width: 100% - 50%; // 乘除 // 乘法只能用一个带单位的值乘以一个不带单位的数字 width: 5px * 10; // width: (50rem/25rem) * 1px; // 除法只能使用 calc 计算函数 width: calc(50rem / 25rem) * 1px; }
二、元素的固定宽高比等比例缩放
一、原理
一个父元素中的第一个子元素,其padding-top的百分比大小是参照的父元素的宽度
例如:padding-top:25%,则子元素上侧内边距就是父元素宽度的25%
如此以来只要不设置父元素的高度,则父元素的高度就是第一个子元素的高度,从而让父元素宽高成比例
二、具体步骤
1、创建一个等比例的比例盒,作为要填充元素的父元素使用
2、创建不同比例尺的伪元素例如:.box_3x4::before 并在其中使用padding-top来达成固定高宽比
3、给所有box的子元素添加绝对定位和100%宽高
4、给box填入需要固定宽高比的子元素
注意:如果需要固定宽高比的盒子,则参考屏幕自适应大小.md
三、屏幕自适应大小
屏幕自适应大小一、什么是rem布局二、rem的作用三、应用场景五、总结:
一、什么是rem布局
rem是浏览器描述长度的单位,含义为:相对于 html
的字体大小的单位。1rem = html 根节点上1个字符的宽度
二、rem的作用
使用 rem
单位设置的元素尺寸,会在不同的设备屏幕宽度下(例如:手机屏幕和平板屏幕)等比例缩放
三、应用场景
当页面元素需要在不同屏幕宽度下保证元素的比例大小不变时,则可以使用 rem
五、总结:
-
确立参考系,定义标准设备的屏幕宽度和字体大小
-
比例公式(等式左右两边比例尺相同,从而达到等比例缩放的目的):标准屏幕宽度 / 标准字体大小 = 新的屏幕宽度 / 新的屏幕字体大小
-
将页面样式中的
px
单位换算并替换为rem
,方法是?rem = 元素的尺寸 / 标准字体大小
-
绑定窗口的
resize
和load
事件,触发事件时计算出新的屏幕宽度时的字体大小,设置html
的字体大小 原屏幕宽度/根节点字体大小 = 新屏幕宽度/根节点字体大小新根节点字体大小 = 新屏幕宽度/(原屏幕宽度/根节点字体大小)
四、bootstrap
一、bootstrap的安装方式
一、下载方式
npm安装:
初始化npm:npm init -y
下载bootstrap:npm i bootstrap
官方地址:Breakpoints · Bootstrap v5.2
二、引入项目
导入bootstrap文件
引入bootstrap.css文件
布局
布局一、响应式布局二、断点三、布局容器四、网格布局
一、响应式布局
响应式布局就是根据屏幕宽度,切换不同页面布局的一种布局方式
bootstrap是使用断点来完成响应式布局的。
二、断点
断点是bootstrap面向不同屏幕宽度,预制好的媒体查询
通常的将,断点,代表的就是不同屏幕宽度
bootstrap中如何体现断点,在class中,添加不同断点的名称,可以采用不同断点的样式
xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px
三、布局容器
通常是页面的根节点,可以使用class = "container"
来设置容器
布局容器受断点影响,可以设置不同断点上的容器。
四、网格布局
将内容进行行列分布的布局方式就叫网格布局
bootstrap中网格布局的灵魂样式就是行:row
,列:col
单选框和多选框
单选框和多选框一、单选框(radio)二、多选框(checkbox)三、开关按钮四、按钮式单选框
一、单选框(radio)
将input输入框的type设置为radio,再将多个input框的name设置为一样的,这样就是一组单选框了
代码:
<div> <div class="form-check"> <input class="form-check-input" type="radio" name="sex" value="male" id="male"> <label class="form-check-label" for="male">男</label> </div> <div class="form-check"> <input class="form-check-input" type="radio" name="sex" value="female" id="female"> <label class="form-check-label" for="female">女</label> </div> <div class="form-check"> <input class="form-check-input" type="radio" name="sex" value="other" id="other"> <label class="form-check-label" for="other">其他</label> </div> </div>
二、多选框(checkbox)
将input输入框的type设置为checkbox,再将多个input框的name设置为一样的,这样就是一组多选框了
代码:
<div> <div class="form-check-inline"> <input type="checkbox" class="form-check-input" id="sing" name="hobbies" value="sing"> <label class="form-check-label" for="sing">唱</label> </div> <div class="form-check-inline"> <input type="checkbox" class="form-check-input" id="dance" name="hobbies" value="dance"> <label class="form-check-label" for="dance">跳</label> </div> <div class="form-check-inline"> <input type="checkbox" class="form-check-input" id="rap" name="hobbies" value="rap"> <label class="form-check-label" for="rap">rap</label> </div> <div class="form-check-inline"> <input type="checkbox" class="form-check-input" id="dlq" name="hobbies" value="dlq"> <label class="form-check-label" for="dlq">打篮球</label> </div> </div>
三、开关按钮
form-switch 是开关 只要给普通的 checkbox 添加该类名即可
<!-- form-switch 是开关 只要给普通的 checkbox 添加该类名即可 --> <div class="form-check form-switch"> <input class="form-check-input" type="checkbox"> <label class="form-check-label">某某协议</label> </div>
四、按钮式单选框
输入框类btn-check
label类btn btn-outline-{value} value取值颜色
<div class="form-check-inline"> <!-- input 中添加 btn-check --> <input id="a" class="btn-check" type="radio" value="a" name="btn"> <!-- label 中添加 btn btn-outline-{color} --> <!-- 注意: 为了能够勾选成功 必须给label添加for 给 input 添加id --> <label for="a" class="btn btn-outline-warning">a</label> </div>
float-position-flex
float-position-flex一、float浮动二、position定位三、flex弹性盒子
一、float浮动
<!-- float浮动 --> <!-- clearfix 清除浮动 --> <div class="clearfix"> <div class="box bg-danger float-start"></div> <div class="box bg-success float-start"></div> <div class="box bg-warning float-end"></div> <div class="box bg-secondary float-end"></div> </div> <div class="box bg-info"></div>
二、position定位
<!-- position定位 --> <div style="height: 500px; width: 500px;" class="d-flex bg-success position-relative"> <div class="box bg-danger position-absolute"></div> <div class="box bg-danger position-absolute top-50 translate-middle-y"></div> <div class="box bg-danger position-absolute bottom-0"></div> <div class="box bg-danger position-absolute bottom-0 start-50 translate-middle-x"></div> <div class="box bg-danger position-absolute bottom-0 end-0"></div> <div class="box bg-danger position-absolute top-0 end-0 "></div> <div class="box bg-danger position-absolute top-50 end-0 translate-middle-y"></div> <div class="box bg-danger position-absolute start-50 translate-middle-x"></div> <div class="box bg-danger position-absolute start-50 top-50 translate-middle"></div> </div>
三、flex弹性盒子
<!-- flex 弹性盒子 --> <div style="width: 500px; height:500px; margin-top:15px" class="bg-success d-flex flex-wrap"> <div class="box bg-warning"></div> <div class="box bg-warning"></div> <div class="box bg-warning"></div> <div class="box bg-warning"></div> <div class="box bg-warning"></div> <div class="box bg-warning"></div> <div class="box bg-warning"></div> </div>
文本的操作
文本的操作1、对齐方式2、换行和溢出3、字体大小4、粗细和加斜5、行高6、文本装饰线
1、对齐方式
语法:text-{value}
value值:
start
center
end
2、换行和溢出
语法:
text-{value}(换行) value值:wrap nowrap overflow-{value}(溢出)value值:scroll hidden
3、字体大小
语法: fs-{value}
value值:
1、2、3、4、5、6
4、粗细和加斜
语法:
粗细: fw-{value} value值:bold、bolder、semibold、normal、light、lighter
加斜:fst-italic
5、行高
语法:lh-{value}
value取值:
1
sm
base
lg
6、文本装饰线
语法:text-decoration-{value}
value取值:
underline 下划线
line-through 穿过文本线
none 无
size-space-stack
size-space-stack一、size(元素大小操作)1、w-{value} h-{value}2、vh vw 是相对视口大小二、space1、内边距2、外边距三、stack间距1、元素间的间距
一、size(元素大小操作)
1、w-{value} h-{value}
官方文档:Sizing · Bootstrap v5.2
语法:w-{value}(设置宽) 或则 h-{value} (设置高)
value取值:
25
50
75
100
auto
2、vh vw 是相对视口大小
语法:vh-100 或 vw-100
{value}只能取100
二、space
1、内边距
使用 p- 开头
语法:
p-{value} 设置四周的内边距
pt-{value} 设置上内边距
pe-{value} 设置右内边距
pb-{value} 设置下内边距
ps-{value} 设置左内边距
2、外边距
与内边距写法一样
使用 m- 开头
语法:
m-{value} 设置四周的外边距
mt-{value} 设置上外边距
me-{value} 设置右外边距
mb-{value} 设置下外边距
ms-{value} 设置左外边距
三、stack间距
1、元素间的间距
官方地址:Stacks · Bootstrap v5.2
vstack 竖直方向产生间距
hstack 水平方向产生间距
gap-{value} 间距的大小
gird网格布局
gird网格布局一、网格布局基本用法二、横向纵向排列方式纵向:横向:三、单元格的偏移四、单元格间距五、指定每一行显示多少列
一、网格布局基本用法
行:row
列:col
语法:col-{breakpoints}-{value}
例如:col-sm-3 col-lg-12
value:取值范围在1~12
bootstrap中 一行 row 被等份为12份,所以col的value值代表的是占多少份
例如:col-3代表此单元格占 3/12 份
示例:
<div class="container"> <!-- 行 --> <div class="row"> <!-- 列 col 语法: col-{breakpoints}-{value} 例如: col-sm-3 col-lg-12 value: 范围在 1~12 bootstrap 中 一行 row 被等分为 12 分 那么col的value值代表的是占多少份 例如: col-3 此单元格占 12分之3份 --> <div class="col"> <div class="bg-primary">1</div> </div> <div class="col"> <div class="bg-primary">2</div> </div> <div class="col"> <div class="bg-primary">3</div> </div> </div> <div class="row"> <div class="col-8"> <div class="bg-primary">1</div> </div> <div class="col"> <div class="bg-primary">2</div> </div> <div class="col"> <div class="bg-primary">3</div> </div> </div> </div>
二、横向纵向排列方式
纵向:
在 row 上可以使用flex 的 align-items 来进行竖直方向的排列
语法:align-items-{value}
横向:
在row上可以使用flex 的justify-content 来进行水平方向的排列
语法:justify-items-{value}
三、单元格的偏移
通过offset 来设置单元格左侧的偏移量 数字代表的含义和col相同
语法:offset-{value}
例如:offset-3
四、单元格间距
添加单元格间距使用 gutter 的首字母g
可以使用 g-{value} 或 gx-{value} 或 gy-{value}
g-{value} 水平和竖直间距
gx-{value} 水平间距
gy-{value} 竖直间距
五、指定每一行显示多少列
让一行显示多少列
语法:row-cols-{breakpoints}-{value}
例如:row-cols-lg-3
五、react
React的引入
React的引入一、React简介二、环境搭建
一、React简介
中文官网:React 官方中文文档 – 用于构建用户界面的 JavaScript 库
特点:
声明式:
也就是js中的数据决定页面最终渲染的结果
声明式不是响应式,但往往都是同时出现共同作用页面
响应式:数据变化页面会立即更新
组件化:
一个包含所有外观和行为的,独立可以运行的模块,称为组件
组件化的思想可以将复杂页面,化繁为简的进行设计
组件可提高代码复用性
一次学习,跨平台编写
使用React
可以开发 桌面web页面,移动端页面,移动app,桌面app等
二、环境搭建
使用cdn在html引入react
<!-- react 需要引入 react 核心库 和 react-dom 库 --> <script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script> <!-- 为了更方便书写 react 通常会使用 jsx 语法,为了支持该语法 需要引入 babel --> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
然后可以在body中加入如下代码:
<body> <div id="root"></div> <!-- 采用 jsx 语法 需要在 type 处加上 text/babel --> <script type="text/babel"> ReactDOM.render( <h1>Hello World</h1>, document.getElementById('root') ); </script> </body>
这里需要介绍几个概念:
-
react.js 这是框架核心库,用于解析 react 语法
-
react-dom.js 这个库是用于 react 元素(也就是react的文档对象模型)的创建
-
babel.js 这个库用来将 jsx 语法翻译为普通的 js
-
条件渲染和循环渲染
条件渲染和循环渲染一、条件渲染二、循环渲染
一、条件渲染
使用三元运算符 按条件显示不同的内容
{/* 使用三元运算符 按条件显示不同的内容 */} {sex === 'male' ? <div style={{color: '#00f'}}>男</div> : sex === 'female' ? <div style={{color: 'pink'}}>女</div> : <div style={{color: '#ff0'}}>其他</div> }
二、循环渲染
ReactDOM.createRoot(document.querySelector('#root')).render(( <div> <ul> {/* 循环渲染,使用一个数组的map函数 返回一个由 react-dom 充当成员形成的一个新数组 */} {students.map(item => <li>姓名: {item.name}; 性别: {item.sex === 'male' ? '男' : item.sex === 'female' ? '女' : '不详' }; 年龄: {item.age}</li>)} </ul> </div> ))
-
受控组件
受控组件 一、受控组件是什么二、屏蔽默认事件
一、受控组件是什么
被React 的 state状态 控制显示和输入的表单元素称为受控组件
控制显示则需要 调用 setState 方式
参考state状态:组件状态
<input type="text" value={name} onInput={onNameInput}/>
二、屏蔽默认事件
react 中 所有的事件都不能通过 return false 来屏蔽默认事件 如果需要屏蔽默认事件则需要通过preventDefault方法 function submit(ev) { ev.preventDefault() }
// 挂载
constructor() //
static getDerivedStateFromProps()
render()
componentDidMount()
// 更新
static getDerivedStateFromProps(props, state)=>{[key: string]: any} 每次调用渲染函数render前调用,返回值是希望改变的状态对象
shouldComponentUpdate(props, state)=>boolean 判断是否应该更新,返回一个布尔值
render()
getSnapshotBeforeUpdate(prevProps, prevState)=>{[key: string]: any} 每次更新前调用,返回值将被传递给 componentDidUpdate 充当第三个参数
componentDidUpdate(prevProps, prevState, snapshot)
// 卸载
componentWillUnmount()
// 异常捕获
static getDerivedStateFromError()
componentDidCatch()
//应用场景
其中 挂载和卸载的 生命周期用得比较多
constructor() 常用于初始化组件,拉取远程数据
componentDidMount() 用于页面第一次渲染完成后,查询页面元素
componentWillUnmount() 卸载组件时对事件的解绑等需要处理的事
//卸载组件
root.unmount()
状态提升
状态提升一、理论原理二、操作方法
一、理论原理
参考地址:状态提升 – React
组件可以利用自身props属性将自身状态提升到上级组件
上级组件只要绑定事件(本质是提供一个回调函数)接受参数即可
二、操作方法
1、父组件中,给子组件添加props属性,并分配一个函数值,该函数接受子组件的状态值作为参数
// 此函数的参数用于接收子组件状态 function onCountChange(args) { console.log(args) } return( <div> {/* 给子组件分配一个函数 用于接收组件状态 */} <Child countChange={onCountChange}></Child> </div> )
2、子组件中,调用父组件提供的 props ,并将自身状态作为参数传入父组件提供的函数
props.countChange(count)
子组件的状态依赖于父组件传入的 props
由于 props 是只读的
所以要修改 props 子组件只能通知父组件更新数据
这个过程就会用到组件间的通信方法