Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >js 和 css动画

js 和 css动画

原创
作者头像
mySoul
发布于 2018-08-10 17:43:20
发布于 2018-08-10 17:43:20
8.8K0
举报
文章被收录于专栏:mySoulmySoul

js和css动画

使用setTimeout()或者setInterval()使用这两个函数定时调用一段代码。这是其原理。

目的,重复修改内联样式,达到动画的效果 通过不断的修改达到动画的目的。

通过在相同的时间内构造出一帧帧的内容,然后让其在函数的作用下不断的改变css的值,达到动画的效果

下面将会是用js写css动画

js写css动画

下面是一个函数 将e转化为相对定位的元素,使得其可以左右移动

第一个参数为元素对象或者元素的id

如果第二个参数是函数,以e为参数,它将在动画结束时调用

第三个参数指定e移动的距离,默认为5像素

第四个参数指定移动多久,默认500毫秒

代码语言:txt
AI代码解释
复制
// 将e转化为相对定位的元素,使得其可以左右移动
// 第一个参数为元素对象或者元素的id
// 如果第二个参数是函数,以e为参数,它将在动画结束时调用
// 第三个参数指定e移动的距离,默认为5像素
// 第四个参数指定移动多久,默认500毫秒
function shake(e, oncomplete, distance, time) {
	// 句柄函数
	if (typeof e === "string") e = document.getElemnentById(e);	// 如果传入的是对象的id则获取对象的id,如果传入的为元素(元素为对象)则直接跳过这一句
	if (!time) time = 500;	// 如果time是空值,则直接使用默认值
	if (!distance) distance = 5;	// 如果未指定移动的距离,则默认为5像素

	var originalStyle = e.style.cssText;	// 获取元素e的css样式
	e.style.position = "relative";	// 设置为相对定位
	var start = (new Date()).getTime();	// 设置动画开始的时间,获取一个格林威治时间
	animate();	// 动画开始

	// 函数检查消耗时间,并更新e的位置
	// 如果动画完成,它将e还原为原始状态
	// 否则,将会更新e的位置,安排其自身重新运行
	function animate() {
		var now = (new Date()).getTime();	// 获取现在的时间
		var elapsed = now-start;	// 从开始以来消耗了多长时间
		var fraction = elapsed / time;	// 为总时间的几分之几

		if (fraction < 1) {	// 如果动画未完成
			// 作为动画完成比例的函数,计算e的x位置
			// 使用正弦函数将完成比例乘以4pi
			// 所以,它将来回往返两次
			var x = distance * Math.sin(fraction * 4 * Math.PI);	 // 使用正弦函数实现每秒四帧
			e.style.left = x + "px";

			// 在25毫秒后或在总时间的最后尝试再次运行函数
			// 目的是为了产生每秒40帧动画
			setTimeout(animate, Math.min(25, time-elapsed));	// 使用天花板函数再次调用,再次移动
		}
		else {	// 否则动画完成
			e.style.cssText = originalStyle; // 恢复原始样式
			if (oncomplete) oncomplete(e);	// 产生一个回调函数
		}
	}
}

// 以毫秒级的时间将e从完全不透明淡出到完全透明
// 在调用函数时假设e是完全不透明的
// oncomplete 是一个可选函数,以e为参数,它将在动画结束的时调用
// 如果不指定time,默认为500毫秒
function fadeOut(e, oncomplete, time) {
	if (typeof e === "string") e = document.getElementById(e);
	if (!time) time = 500;

	// 使用Math.sqrt作为一个缓动函数创建动画
	// 非线性函数,一开始淡出的较快,然后逐步的缓慢
	var ease = Math.sqrt;

	var start = (new Date()).getTime();	// 动画开始的时间
	animate();	// 动画开始

	function animate() {
		var elapsed = (new Date()).getTime()-start;	// 消耗的时间
		var fraction = elapsed/time;	// 总时间的几分之几

		if (fraction < 1) {	// 如果动画未完成
			var opacity = 1 - ease(fraction);	// 计算不透明度  即 完成一次变换,开方
			e.style.opacity = String(opacity);	// 设置透明度
			setTimeout(animate, // 进行下一帧
				Math.min(25, time-elapsed));	// 在25毫秒之后或者在总时间的最后再次调用
		}else {
			e.style.opacity = "0";	// 使得e完全透明
			if (oncomplete) oncomplete(e);	// 在结束的时候回调
		}
	}
}

查询计算出的样式

代码语言:txt
AI代码解释
复制
getComputedStyle(e)

275个样式。。。O__O "…

脚本化css类

除了能脚本化内联样式,同样的也能脚本化css的类

移除,添加类

代码语言:txt
AI代码解释
复制
e.className = "attention";  // 添加类
e.className = "";   // 移除类

显示类列表

classList

只读属性,返回元素类属性的实时集合。

代码语言:txt
AI代码解释
复制
e.classList()

脚本化样式表

开启和关闭样式表

style和link元素的CSSStyleSheet对象定义了一个在js中可以设置和查询的disabled属性。

关于disabled属性,该属性在HTML中不属于规范的一部分,在HTML中不存在,但是,在DOM中存在该属性。在标签中无法设置该属性,但是可以在脚本中设置该属性

如果值为true,样式表关闭,否则样式表打开

代码语言:txt
AI代码解释
复制
e.disabled = true;

这样样式表即可关闭。

类似的通过以下方式也可

代码语言:txt
AI代码解释
复制
document.styleSheets[0].disabled;

查询,插入与删除样式表规则

CSSStyleSheet对象同样也定义了用来查询,插入和删除样式表规则的api

查询所有样式表内容
代码语言:txt
AI代码解释
复制
var firstRule = document.styleSheets[0].cssRules[0];

document.styleSheets0 一个只读属性,返回一个该文档的链接或嵌入的样式表

该样式只读,不可进行插入和删除

其中selectorText为css选择器

cssText 为css的文本样式

添加和删除规则

insertRule()和deleteRule()这两种方法,达到添加和删除规则

还有一个addRule()方法

insertRule()方法

insertRule()和deleteRule()这两种方法,达到添加和删除规则

代码语言:txt
AI代码解释
复制
ss.insertRule(".name {color:blue}", 0);

在ss样式表中,在第0条cssRules中添加一条css规则。使得类为name的字体变蓝

如果添加的索引已经存在则不会覆盖,所有的索引加1,然后进行插入

deleteRule()方法

删除样式规则

删除上一条插入的样式

代码语言:txt
AI代码解释
复制
ss.deleteRule(0);

删除第0条规则,样式继续保持从0开始

创建新的样式表

这个不难,直接插入一个新的style元素通过innerHTML的方式将其插入新的css内容,或者直接插入link标签,设置添加一个html的属性使用的是 Element.setAttritube()方法,将rel的值设置为stylesheet 然后在用同样的方法添加src属性

纯粹的dom 和 bom的操作,不涉及任何样式表的内容

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用 JS 来动态操作 css ,你知道几种方法?
JavaScript 可以说是交互之王,它作为脚本语言加上许多 Web Api 进一步扩展了它的特性集,更加丰富界面交互的可操作性。这类 API 的例子包括WebGL API、Canvas API、DOM API,还有一组不太为人所知的 CSS API。
前端小智@大迁世界
2022/06/15
2K0
使用 JS 来动态操作 css ,你知道几种方法?
JavaScript DOM操作表格及样式
一.操作表格 <table>标签是HTML中结构最为复杂的一个,可以通过DOM来创建生成它(比较麻烦),或者HTML DOM来操作它。 //需要操作的table <table border="1" width="300"> <caption>人员表</caption> <thead> <tr> <th>姓名</th> <th>性别</th> <th>年龄</th> </tr> </thead> <tbody> <tr> <td>汤高</td> <td>男</td> <td>20</td> </tr> <tr
汤高
2018/01/11
3.7K0
JS它DOM
DOM:document object model。文档对象模型。它主要由许多节点。而基于JS对象的一切视角,DOM核心是节点对象和操作方法的属性。从下面三方面来介绍DOM。
全栈程序员站长
2022/07/06
3.3K0
JS它DOM
【CSS】398- 原生JS实现DOM爆炸效果
此次分享是一次自我组件开发的总结,还是有很多不足之处,望各位大大多提宝贵意见,互相学习交流。
pingan8787
2019/11/05
3.5K0
简单说 通过JS控制CSS的各种方式(上)
版权声明:本文为博主原创文章,欢迎转载,转载请注明出处。 https://blog.csdn.net/FE_dev/article/details/77888446
FEWY
2019/05/26
4.9K1
Vue-transition组件的Css动画+过渡(1)入门,笔记总结 “建议收藏”
这里说一下transition: property duration timing-function delay; 一共有四个参数可选;
玖柒的小窝
2021/09/29
1.5K0
JS设置CSS样式的几种方式
如果属性有'-'号,就写成驼峰的形式(如textAlign)  如果想保留 - 号,就中括号的形式  element.style['text-align'] = '100px';
书童小二
2018/09/03
9.8K0
原生JS设置CSS样式的几种方式
如果属性有'-'号,就写成驼峰的形式(如textAlign)  如果想保留 - 号,就中括号的形式  element.style['text-align'] = '100px';
德顺
2019/11/13
23.9K0
原生JS设置CSS样式的几种方式
js动画和css动画_js文件怎么引入html
在做页面中,多数情况下都会遇到页面上做动画效果,我们大部分做动画的时候都是使用框架来做(比如jquery),这里我介绍下如何让通过原生的js来实现像框架一样的动画效果!
全栈程序员站长
2022/11/04
22.6K0
05-老马jQuery教程-动画
根据文章内容总结摘要。
老马
2017/12/27
2.1K0
第73天:jQuery基本动画总结
var btn = document.getElementById(“bt n”);
半指温柔乐
2018/09/11
3.4K0
05-老马jQuery教程-动画
根据文章内容总结摘要。
老马
2018/01/05
2.1K0
Web高性能动画及渲染原理(1)CSS动画和JS动画
Web动画的本质是元素状态改变造成的样式变更,CSS动画和JS动画的区别并不是由语言来决定的,而是由两者的特点和适用场景来判断的。CSS动画简洁高效,提升交互体验而编写的代码可以轻松地和主要业务逻辑之间实现隔离,开发中建议优先使用;而当你需要更丰富的缓动函数,多对象关联动画或是需要在动画执行的特定时间点关联一些其他的业务逻辑等需要细节控制的场景中,JS动画就会显得更加清晰且易维护,两者从来都不是非黑即白的选项。
大史不说话
2019/10/16
7.7K0
Web高性能动画及渲染原理(1)CSS动画和JS动画
JavaScript 动态加载脚本和样式
3大点: 1.元素位置 2.动态脚本 3.动态样式 一.元素位置 getBoundingClientRect()。这个方法返回一个矩形对象,包含四个属性:left、top、right和bottom。分别表示元素各边与页面上边和左边的距离。 var box = document.getElementById('box');//获取元素 alert(box.getBoundingClientRect().top);//元素上边距离页面上边的距离 alert(box.getBoundingClientRect()
汤高
2018/01/11
1.4K0
【CSS进阶】原生JS getComputedStyle等方法解析
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美。 其结构明晰,高内聚、低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷、渐进增强)优雅的处理能力以及 Ajax 等方面周到而强大的定制功能无不令人惊叹。 另外,阅读源码让我接触到了大量底层的知识。对原生JS 、框架设计、代码优化有了全新的认识,接下来将会写一系列关于 jQuery 解析的文章。 我在 github 上关于 jQuery 源码的全文注解,感兴趣的可以围观一下。jQuer
Sb_Coco
2018/05/28
1.6K0
js animate动画基础
    js运动是我们学习js必不可少的研究部分,首先我们要知道js的运动其实仅仅是不断改变元素的某个属性值而已,比如不断改变一个绝对定位div的left值,那么你看到的效果就是这个div不断的向右边运动,那么运动的原理就是这样。
不愿意做鱼的小鲸鱼
2022/08/23
6.9K0
js animate动画基础
「Web Animation API 专题」纯手工撸一个图片随机移动的动画
当我们谈及网页动画时,自然联想到的是 CSS3 动画、JS 动画、SVG 动画 等技术以及 jQuery.animate() 等动画封装库,根据实际动画内容设计去选择不同的实现方式,然而,每个现行的动画技术都存在一定的缺点,如 CSS3动画必须通过JS去获取动态改变的值,一个动画效果分散在css文件和js文件里不好维护,setInterval 的时间往往是不精确的而且还会卡顿,引入额外的动画封装库也并非对性能敏感的业务适用。
前端达人
2019/07/31
1.8K0
「Web Animation API 专题」纯手工撸一个图片随机移动的动画
Angular2 之 Animations
Angular2的动画系统赋予了制作各种动画效果的能力,致力于构建出与原生CSS动画性能相同的动画。 Angular2的动画主要是和@Component结合在了一起。 animations元数据属性在定义@Component装饰。就像template元数据属性!这样就可以让动画逻辑与其应用代码紧紧集成在一起,这让动画可以更容易的出发与控制。 使用要点 Angular2的动画是使用<u>模型驱动</u>的方式在两个状态之间进行转换,是由状态和状态之间的转场效果所定义的。 动画被定义在@Compone
贺贺V5
2018/08/21
2K0
Angular2 之 Animations
「Web Animation API 专题」用原生JS制作一个图片随机移动的动画
当我们谈及网页动画时,自然联想到的是 CSS3 动画、JS 动画、SVG 动画 等技术以及 jQuery.animate() 等动画封装库,根据实际动画内容设计去选择不同的实现方式,然而,每个现行的动画技术都存在一定的缺点,如 CSS3动画必须通过JS去获取动态改变的值,一个动画效果分散在css文件和js文件里不好维护,setInterval 的时间往往是不精确的而且还会卡顿,引入额外的动画封装库也并非对性能敏感的业务适用。
前端达人
2019/08/02
4K0
「Web Animation API 专题」用原生JS制作一个图片随机移动的动画
分享 | 前端性能优化(CSS动画篇)
最近拜读了一下html5rocks上几位大神写的一篇关于CSS3动画性能优化的文章,学到了很多,在这里记录一下,其中的知识都是来源于这俩篇文章,我只是截取了其中比较关注的内容出来,原文地址High Performance Animations及Accelerated Rendering in Chrome
疯狂的技术宅
2019/03/28
2K0
推荐阅读
相关推荐
使用 JS 来动态操作 css ,你知道几种方法?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档