前端开发中,最让人头疼的就是产品经常会提出让人头疼的动画效果,或者奇怪的需求。相信大家在动画开发中用的最多的就是 animate.css,这个动画只是用与一些简单的场景,笔记一段文字抖动,一段文字进场和出场的效果,但是无法满足,如何让一行文字实现炫酷吊炸天
的动画。也无法实现动态实物的效果,比如一个真实感很强正在骑行的自行车,这个可让前端工程师绞尽脑汁。有人会说,我只需要 cv 就可以。熬 🤔 你确定你可以找到符合你的需要的案例么?这还真不如自己写一个来的快。那么问题来了,怎么优雅和高效的编写这样的动画呢?敲重点anime.js
就可以帮助我们完成各类复杂的动画。
anime.js 是个啥?
anime.js 是一款功能强大的 Javascript 动画库插件。anime.js 可以和 CSS3 属性,SVG,DOM 元素和 JS 对象一起工作,制作出各种高性能,平滑过渡的动画效果。官网原话
兼容性
兼容性感觉还可以
如何使用
- 安装 anime.js
npm install animejs
bower install animejs
- 使用方式 在页面中引入 anime.min.js 文件。
<script type="text/javascript" src="js/anime.min.js"></script>
- HTML 结构 以动画两个 div 元素为例,HTML 结构如下:
<article>
<div class="blue"></div>
<div class="green"></div>
</article>
- 初始化插件 通过 anime() 方法来构造一个对象实例,以 json 对象的方式传入需要的参数:
var myAnimation = anime({
targets: ['.blue', '.green'],
translateX: '13rem',
rotate: 180,
borderRadius: 8,
duration: 2000,
loop: true
});
实战演练一下哈 😜
X 动画效果
html
html
<button id="runaway-btn">Click Me 🤣</button>
css
css
* {
padding: 0;
margin: 0;
box-sizing: border-box;
user-select: none;
}
body {
background-color: rgb(31, 31, 31);
}
button {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
height: 4rem;
width: 10rem;
font-size: 1.5rem;
border-radius: 5px;
border: none;
box-shadow: 1px 1px 5px black;
background-color: white;
}
js
js
const button = document.getElementById('runaway-btn')
const animateMove = (element, prop, pixels) =>
anime({
targets: element,
[prop]: `${pixels}px`,
easing: 'easeOutCirc'
})
;['mouseover', 'click'].forEach(function (el) {
button.addEventListener(el, function (event) {
const top = getRandomNumber(window.innerHeight - this.offsetHeight)
const left = getRandomNumber(window.innerWidth - this.offsetWidth)
animateMove(this, 'left', left).play()
animateMove(this, 'top', top).play()
})
})
const getRandomNumber = (num) => {
return Math.floor(Math.random() * (num + 1))
}