【前端】移动互联动画
目录
- 一、CSS动画
- (一)2D动画
- (二)transition过渡动画
- (三)animation动画
- (四)3D动画
- 二、jQuery
- (一)基础用法
- (1)网页中的使用
- (2)jQuery使用方法
- (二)eq和get方法
- (1)eq()方法
- (2)get()方法
- (三)事件
- (1)使用事件属性
- (2)使用事件监听器
- (3)解绑事件
- 三、canvas画布
- (一)基础简介
- (1)创建canvas标签
- (2)给canvas标签设置 width height 属性
- (3)通过js获取canvas标签
- (4)通过canvas标签获取context画布上下文(画布对象)
- (5)通过context绘制画布
- (二)绘制
- (1)绘制矩形
- (2)绘制文本
- (3)绘制线
- (4)绘制图片
- 四、多媒体标签
- (一)视频标签(video)
- (二)音频播放器(audio)
- (三)使用Audio类名创建
- (四)数据源标签(source)
- (五)自定义控制器
- (六)滑块
- (七)图片标签(picture)
一、CSS动画
(一)2D动画
CSS的2D转换
CSS 转换(transforms):可以移动、旋转、缩放和倾斜元素。
平移 translate()
translate()方法是将元素从当前位置开始平移
第一个参数 水平平移量 右为正方向
第二个参数 竖直平移量 下为正方向
transform: translate(-50px, -50px);
transform: translateX(300px);
transform: translateY(200px);
transform: translateZ(50px);//translateZ:电脑屏幕向外移动
旋转 rotate()
参数:可以是角度值 (deg) 也可以是弧度值 (rad) 弧度制的PI = 180°
沿轴进行顺时针旋转为正方向,0°代表竖直向上
负数的含义其实就是 360 - 对应度数
默认旋转函数rotate 是沿着z轴进行旋转
缩放 sacle()
参数:比率 1 为原本大小
scale 写负数代表反向:
倾斜 skew()
transform: skew(30deg);
transform: skew(0deg, 30deg);
transform: skewX(30deg);
transform: skewY(30deg);
matrix() 方法
matrix() 方法把所有 2D 变换方法组合为一个。
matrix() 方法可接受六个参数,其中包括数学函数,这些参数使您可以旋转、缩放、移动(平移)和倾斜元素。
参数如下:matrix(scaleX(),skewY(),skewX(),scaleY(),translateX(),translateY())
div {transform: matrix(1, -0.3, 0, 1, 0, 0);
}
transform也可以直接同时赋值多个值
.box {width: 200px;height: 200px;background-color: red;transform: translateX(100px) rotate(45deg) scale(0.5);
}
变化原点
设置transform的原点
原点的位置会影响旋转的圆心,缩放的位置
待选值: top bottom left right center 还可以填入像素值
第一个参数代表水平偏移量 第二个参数代表竖直偏移量
transform-origin: right center;
transform-origin: center bottom;
当值为像素值的时候,像素值的参考位置是元素的左上角
transform-origin: 20px 70px;
(二)transition过渡动画
过渡名称
还有两个待选项
none: 无
all: 所有属性都能播放过渡动画
transition-property: left, transform;
transition-property: all;
过渡时长
动画播放的时长
transition-duration: 2s;
过渡速度
动画播放的速度曲线
待选项
linear: 匀速直线运动
ease-in: 慢进
ease-out: 慢出
ease-in-out: 慢进慢出
cubic-bezier: 曲线函数
transition-timing-function: linear;
过渡延迟
transition-delay: 3s;
合成所有属性
语法:transition: property duration timing-function delay;
transition: all 3s linear 3s;
(三)animation动画
动画帧序列
@keyframes move{//起始帧from{transfrom:translateX(0px);}//可以用百分比来代表动画的中间状态50%{transfrom:translateX(600px)}//结束帧to{transform:translateX(300px);}
}
动画属性
动画animation必须包含,名称和时长两个属性,才会进行播放
以下属性可以和transition一起记忆
- 动画名称:animation-name:move;
- 动画播放时长:animation-duration:3s;
- 动画播放的速度曲线:animation-timing-function:linear;
- 动画延迟:animation-delay:3s;
以下属性为animation独有的属性
- 动画迭代次数:animation-iteration-count:1; //infinite 无限次
- 动画播放方向:animation-direction:normal;
normal:顺向播放
reverse:反向播放
alternate:来回播放
alternate-reverse:反向来回播放 - 动画填充模式:animation-fill-mode:forwords
forwards:保留结束帧的状态
backwards:保留起始帧的状态
both:保留初始和结束时的值 - 动画播放和暂停状态:animation-play-state:
pause:暂停
running:继续
复合属性
- 官方顺序
duration | name
animation:2s move;
duration | timing-function | delay | name
animation:2s linear 3s move;
duration | timing-function | delay | iteration-count | direction | fill-mode | play-state | name
animation: - 一般顺序(参考transition)
animation:move 3s linear 3s forwards
动画播放和暂停
动画播放和暂停状态:animation-play-state:
pause:暂停
running:继续
btn.addEventListener('click', () => {box.style.animation = 'move 1s linear forwards infinite alternate running'})btn2.addEventListener('click', () => {// animationPlayState 动画播放状态// paused 暂停// running 播放if (box.style.animationPlayState === 'paused') {box.style.animationPlayState = 'running'} else {box.style.animationPlayState = 'paused'}})
(四)3D动画
创建一个场景
搭建3d场景,在父元素上设置:transform-style: preserve-3d;
设置透视距离
perspective: 300px;
若三维场景中不添加 perspective 则三维场景是一个正交视图
设置透视原点
perspective-origin: center center;
透视原点(灭点所在的坐标)
原点为 0 值时,所在位置是scene的左上角:perspective-origin: 0 0;
在场景里添加子元素
<!-- 创建一个场景,用来显示三维图形 --><div class="scene"><!-- 给三维空间中添加三维元素 --><div class="box"></div></div>
在子元素上使用3d变换
transform: rotateY(65deg);
二、jQuery
(一)基础用法
(1)网页中的使用
<!DOCTYPE html>
<html><head></head><body></body><!-- 通过脚本形式进行引入 --><script src="./jquery.min.js"></script><script>// 在引入jquery后,此处就可以使用jquery的功能了</script>
</html>
(2)jQuery使用方法
1.查询并存储元素
2.操作元素,包括修改元素样式,绑定事件等
使用$()
函数获取一个jQuery对象
jQuery对象的变量名,一般以$开头
let $box=$('.box')
jQuery对象看上去像一个数组,其中数组成员就是dom对象
console.log($box)
给元素修改样式
$box.css('height','100px')
$box.css('background-color','#f00')
jQuery对象的函数总是返回自己
所以可以进行链式调用
$box.css('height','100px').css('background-color','#f00').css('color','#f0f').text('hello word')
(二)eq和get方法
(1)eq()方法
eq 读取对应索引位置的jQuery对象
let $li=$lis.eq(1)
因为$li是jQuery对象,所以可以直接使用jQuery操作它
$li.css('color','#f00')
(2)get()方法
get 读取对应索引位置的dom对象
let li = $lis.get(2)
li.style.color = '#f00'
使用 [] 方括号的方式去获取索引对应的 dom 对象
其结果等价于 get 函数获取的结果
let li = $lis[2]
li.style.color = '#f00'
(三)事件
(1)使用事件属性
绑定事件
和dom对象绑定事件进行类比
// 对应 jquery 的写法如下$btn.click(ev => {console.log('click');// ev 是jquery封装的事件对象console.log(ev);})// 再例如$btn.mousemove(ev => {console.log('mousemove');})
触发事件
// 可以直接使用事件对应的函数去触发事件,例如:$btn.click()$btn.mousemove()
(2)使用事件监听器
绑定事件
const handler = ev => {console.log(ev);console.log(1);}// 绑定事件$btn.on('click', handler)$btn.on('mousemove', ev => {console.log(ev);console.log(2);})
绑定一次性事件
// 绑定一次性事件$btn.one('click', ev => {console.log(ev);console.log('one');})
(3)解绑事件
// 解绑指定事件处理程序//$btn.off('click', handler)// 解绑所有事件处理程序$btn.off('click')
三、canvas画布
(一)基础简介
(1)创建canvas标签
<canvas></canvas>
(2)给canvas标签设置 width height 属性
//width height 属性可以设置画布的像素大小
//width="800" 就意味着画布水平有800个真实像素
<canvas width="400" height="300"></canvas>
canvas {border: 3px solid #000;/*样式的宽高也可以设置canvas标签的大小,但不是真实的像素值而是拉伸后的大小*/width: 800px;height: 600px;
}
(3)通过js获取canvas标签
const canvas = document.querySelector('canvas')
(4)通过canvas标签获取context画布上下文(画布对象)
const ctx = canvas.getContext('2d')
(5)通过context绘制画布
//绘制一个实心矩形
ctx.fillRect(100, 50, 100, 100)
颜色修改
fillStyle 可以修改所有使用fill的函数所填充的颜色
strokeStyle 可以修改所有stroke函数的描边颜色
(二)绘制
(1)绘制矩形
实心矩形
语法:ctx.fillRect(x, y, w, h)
x:水平坐标 y:竖直坐标 (坐标原点在canvas左上角)
w:矩形宽度 h:矩形高度
//修改颜色
ctx.fillStyle = '#f00'
ctx.fillRect(50, 100, 150, 50)
镂空矩形
语法:ctx.strokeRect(x, y, w, h)
x:水平坐标 y:竖直坐标 (坐标原点在canvas左上角)
w:矩形宽度 h:矩形高度
ctx.strokeRect(300, 100, 200, 100)
清空矩形
用于清空画布
ctx.clearRect(0, 0, 800, 600)
(2)绘制文本
实心文字
语法:ctx.fillText(text, x, y, max-width)
text: 要渲染的文本
x,y: 文本渲染的坐标位置
max-width: 文本最大宽度,当大于该宽度,文本字体将自动缩小以自适应宽度
ctx.fillText('祖国万岁!!', 200, 100, 100)
//最后一个参数可省略
ctx.fillText('祖国万岁!!', 200, 100)
镂空文字
参数和实心文本相同
ctx.strokeText('祖国万岁!!', 200, 300)
(3)绘制线
画直线
设置颜色和线宽
ctx.strokeStyle = '#ff0'
ctx.lineWidth = 15
使用beginPath开启路径(此方法的路径是非封闭的)
ctx.beginPath()
使用moveTo移动笔头,但不会记录路径上的线条
xtx.moveTo()
用线绘制一个点到下一个点
ctx.lineTo()
将路径封闭
ctx.closePath()
显示图形,将路径所包围的图形用纯色来填充
ctx.fill()
将路径用镂空线条进行填充
ctx.stroke()
画弧线
//每画一个图形开启一次路径ctx.beginPath()ctx.moveTo(400, 400)ctx.lineTo(500, 400)// 角度转弧度的公式: rad = (PI / 180) * deg// 弧线// ctx.arc(x, y, r, start, end)// x: 圆心横坐标// y: 圆心纵坐标// r: 圆半径// start: 起始弧度 0度时的方向为水平向右 顺时针为正方向// end: 结束弧度ctx.arc(400, 400, 100, 0, Math.PI / 180 * 30)ctx.closePath()ctx.fill()// ctx.stroke()
(4)绘制图片
语法
ctx.drawImage(image, dx, dy);
ctx.drawImage(image, dx, dy, dWidth, dHeight);
ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);
image: img 标签的 dom 对象
dx dy: 图片在canvas中的坐标
dWidth dHeight: 图片在canvas中的宽高
sx, sy: 参考图片源,截图的坐标
sWidth, sHeight: 截图的宽高
方式一
const img = document.querySelector('img')const canvas = document.querySelector('canvas')const ctx = canvas.getContext('2d')img.addEventListener('load', () => {// 图片加载完成后 再绘制图片// ctx.drawImage(img, 100, 100)// ctx.drawImage(img, 100, 100, 100, 100)ctx.drawImage(img, 10, 100, 170, 170, 100, 100, 170, 170);})
方式二
const canvas = document.querySelector('canvas')const ctx = canvas.getContext('2d')// 动态生成图片进行绘图let img = document.createElement('img')img.style.display = 'none'img.src = './img/heihei.png'img.addEventListener('load', ev => {// 绘图ctx.drawImage(img, 10, 100, 170, 170, 100, 100, 170, 170);// 删除图片节点img.remove()})// 插入图片到页面document.body.appendChild(img)
四、多媒体标签
(一)视频标签(video)
宽高(width height)
控制面板(controls)
静音(muted)
自动播放(autoplay):自动播放要配合静音才能实现
媒体源(src)
预载模式(preload)
循环(loop)
海报(poster):video特有
(二)音频播放器(audio)
由于audio和video都属于HTMLMediaElement的实例
所以audio的所有使用方法和video一样
可以通过 instanceof 来判断一个对象是否是某个类型的实例
video instanceof HTMLMediaElement
属性
宽高(width height):没意义
控制面板(controls)
静音(muted)
自动播放(autoplay):自动播放要配合静音才能实现,但是没意义
媒体源(src)
预载模式(preload)
循环(loop)
(三)使用Audio类名创建
// 可以使用 Audio 类名来创建 audio 标签// let audio = new Audio()// audio.src = './audio/a4.mp3'// audio.play()
(四)数据源标签(source)
audio和video都可用
source 标签若有多个,那么浏览器会从上至下加载直到某一个被加载成功为止
<audio controls><!-- 数据源标签 --><source src="./audio/a44.mp3"><source src="./audio/b44.mp3"><source src="./audio/c4.mp3"></audio>
(五)自定义控制器
<div><button class="play">播放</button><button class="pause">暂停</button>当前时间:<span class="current-time"></span>总时间:<span class="total-time"></span><input class="inp" /><button class="go-to">跳转到此时间</button><button class="v-up">音量+</button><button class="v-down">音量-</button><button class="muted">静音</button></div>
let video = document.querySelector('video')let playBtn = document.querySelector('.play')let pauseBtn = document.querySelector('.pause')let totalTime = document.querySelector('.total-time')let currentTime = document.querySelector('.current-time')let inp = document.querySelector('.inp')let goToBtn = document.querySelector('.go-to')let vUpBtn = document.querySelector('.v-up')let vDownBtn = document.querySelector('.v-down')let mutedBtn = document.querySelector('.muted')let timer
// 播放playBtn.addEventListener('click', () => {video.play()// 显示总时长// textContent 标签体的文本内容// duration 代表媒体时长,单位: 秒totalTime.textContent = video.durationcurrentTime.textContent = video.currentTimeclearInterval(timer)timer = setInterval(() => {// currentTime 代表当前播放的时间currentTime.textContent = video.currentTime}, 1000)})// 暂停pauseBtn.addEventListener('click', () => {video.pause()})// 跳转进度goToBtn.addEventListener('click', () => {let currentTime = Number(inp.value)// 直接赋值 video 的 currentTime 就可以跳转进度video.currentTime = currentTime})// 音量+vUpBtn.addEventListener('click', () => {// volume 是一个 0~1 的数字 用于控制音量video.volume = video.volume + 0.1 > 1 ? 1 : video.volume + 0.1})// 音量-vDownBtn.addEventListener('click', () => {// volume 是一个 0~1 的数字 用于控制音量video.volume = video.volume - 0.1 < 0 ? 0 : video.volume - 0.1})// 静音mutedBtn.addEventListener('click', () => {video.muted = !video.muted})
(六)滑块
<input type="range" min="0" max="100" step="20" value="0"><span class="range-value">0</span>
let inputRange = document.querySelector('input[type=range]')let rangeValue = document.querySelector('.range-value')inputRange.addEventListener('input', () => {rangeValue.textContent = inputRange.value})
(七)图片标签(picture)
<picture><!-- source 标签中有多个待选项时,使用srcset规定资源路径 --><!-- media 设置媒体查询 --><!-- 媒体查询的顺序由大到小 --><source srcset="./img/1.png" media="(min-width: 800px)"><source srcset="./img/2.png" media="(min-width: 600px)"><img width="500" src="./img/desktop.png"></picture>
【前端】移动互联动画相关推荐
- 前端实现lottie动画
前端实现lottie动画 ul通过AE生成的json文件 ,前端通过lottie实现动画简单快捷 <div class="box"></div> 引入 &l ...
- html如何实现过渡效果,前端如何实现动画过渡效果
简介 动画这个概念非常宽泛,涉及各个领域,这里我们把范围缩小到前端网页应用层面上,不用讲游戏领域的Animate,一切从最简单的开始. 目前大部分网页应用都是基于框架开发的,比如Vue,React等, ...
- 魔幻粒子、火焰动画、纯前端实现魔幻粒子、纯前端实现火焰动画
魔幻粒子.火焰动画.纯前端实现魔幻粒子.纯前端实现火焰动画 火焰动画,这次我们给大家带来另外一款基于HTML5 Canvas的火焰动画,你可以在Canvas画板上用鼠标点击拖动,便会形成雾状的火焰效果 ...
- 前端实现ppt动画播放(H5+C3+JS+JQ)
大家都应该用过ppt(Microsoft PowerPoint 2010)来做过一些可课件或者动画效果吧,其实,在ppt里面的动画在网页上也可以实现的,并且会更加炫酷.可以自己找个动画ppt来动动手实 ...
- 前端进度条动画(自定义颜色)
前端进度条动画(自定义 代码如下(示例): <template><view class="flex-cen"><view class="pr ...
- 前端笔记:动画介绍与CSS动画说明
文章目录 目的 动画介绍 CSS动画 JavaScript动画 Canvas动画 SVG动画 CSS动画 CSS Transition CSS Animation timing-function CS ...
- 小猿圈自学web前端之CSS3动画练习案例:用CSS3做个钟表
前段时间发的五子棋的游戏很多小伙伴都私聊让再做个,今天小猿圈web前端讲师为大家分享的是CSS3动画练习案例:用CSS3做个钟表,想玩的小伙伴记得自己运行一下呦. 自学CSS3属性之后,我们来用一个小 ...
- 前端逐帧动画性能探究和比较
什么是逐帧动画? 首先看一下维基百科中的定义: 定格动画,又名逐帧动画,是一种动画技术,其原理即将每帧不同的图像连续播放,从而产生动画效果. 简单的来说就是: 以一定的速度切换几张连续图像,让它动起来 ...
- 前端加载动画/加载等待动画
在加载前端的数据的时候,很多时候不能用进度条来衡量不定数据量.此时加载动画就有用武之地了.可以在数据请求时显示加载动画,等动画加载完成再隐藏加载动画,让前端更具交互友好性. 网上百度了很多关于这方面的 ...
最新文章
- pl sql如何调试oracle存储过程,PL/SQL Developer中调试oracle的存储过程
- [Contest20170910]string
- 35.页面置换算法有哪些?
- 视频直播 > 最佳实践 > 如何降低延时
- 做了十年的功能测试,下一步该晋升测试开发还是转行软件开发?
- surface simplification using quadratic error metrics
- 虽然保持了连续代码生产量但是仔细想想也没什么必要
- SecureCRT在linux与windows本地互传文件之SFTP
- sqlmap详细使用教程
- EVE上传Dynamips、IOL镜像
- 解决MyEclipse中导入项目的javascript文件中文乱码
- SuperMap iDesktopX安装 ---(保密机:龙芯CPU+银河麒麟系统)
- 【Javaweb】基础开发流程与介绍
- Day134-136.尚品汇:平台属性接口、SPU、跨域问题、配置持久化、MinIO 分布式文件存储系统
- NAT穿越(NAT-T)原理
- python怎么读excel_python怎么读写excel文件
- docker desktop 运行mysql
- 在10万以内的一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少?
- qq邮件引流需要注意什么?QQ邮件群发推广的技巧
- 【转帖】中国芯暗流涌动,龙芯/飞腾都在走什么样的路
热门文章
- 计算机每年学硕和专硕数量,重磅:2019年研究生招生数据报告,专硕报考人数超过学硕?...
- 智汇云校携手院校组织数千学生参加“2020华为中国大学生ICT大赛”
- java导出doc文档
- 腾讯投资“差评”遭舆论讨伐,或被迫退股!!
- poj 2683 Ohgas' Fortune 利率计算
- 上亿会员 为b站会员购众筹项目打下消费基础
- 手写简易版Vue源码之数据响应化的实现
- sharding-jdbc系列之常见问题(十四)
- 杂记二 · 永远不服输
- Python 三大利器:迭代器、生成器、装饰器