Toggle navigation
在线编辑器
在线代码
文本比较
jQuery下载
前端库
在线手册
登录/注册
下载代码
html
css
js
分享到微信朋友圈
X
html
blobby
css
body { overflow: hidden; min-height: 100vh; filter: url(#goo); cursor: none; } .blobby-bit { width: 160px; height: auto; display: block; position: absolute; top: 0; left: 0; } .blobby-bg { height: 240px; width: 240px; border-radius: 50%; background: #fbbb95; }
JavaScript
console.clear(); const DAMPING_COEFF = 0.4; const SPRING_CONSTANT = 0.075; const globalState = { mouseX: 0, mouseY: 0, updates: [] }; document.addEventListener("mousemove", event => { globalState.mouseX = event.pageX; globalState.mouseY = event.pageY; }); document.addEventListener("touchstart", event => { globalState.mouseX = event.pageX; globalState.mouseY = event.pageY; }); const createSpring = ({ getTargetX, getTargetY, draw }) => { const state = { posX: 0, posY: 0, velX: 0, velY: 0 }; return { // consumed by other springs when // chaining stuff together getX: () => state.posX, getY: () => state.posY, update: () => { state.posX += state.velX; state.posY += state.velY; const potentialX = state.posX - getTargetX(); const potentialY = state.posY - getTargetY(); state.velX += calcVelocity(potentialX, state.velX); state.velY += calcVelocity(potentialY, state.velY); draw(state); } }; }; const calcVelocity = (potential, currentVelocity) => { return potential * -1 * SPRING_CONSTANT - DAMPING_COEFF * currentVelocity; }; const translateString = (x, y) => { return `translate3d(${x}px, ${y}px, 0)`; }; const composeSprings = ({ seedX, seedY, registerSpring, drawFunctions }) => { return drawFunctions.reduce((springs, drawFn) => { const prevSpring = springs[springs.length - 1]; const newSpring = createSpring({ getTargetX: prevSpring ? prevSpring.getX : seedX, getTargetY: prevSpring ? prevSpring.getY : seedY, draw: drawFn }); registerSpring(newSpring); return [...springs, newSpring]; }, []); }; const drawFns = [ ...document.querySelectorAll('.blobby-bit') ].map(el => { const halfX = el.getBoundingClientRect().width / 2; const halfY = el.getBoundingClientRect().height / 2; return state => { el.style.transform = translateString(state.posX - halfX, state.posY - halfY) }; }); composeSprings({ seedX: () => globalState.mouseX, seedY: () => globalState.mouseY, registerSpring: spring => globalState.updates.push(spring.update), drawFunctions: drawFns, }); (function loop() { globalState.updates.forEach(fn => fn()); requestAnimationFrame(loop); })();
粒子
时间
文字
hover
canvas
3d
游戏
音乐
火焰
水波
轮播图
鼠标跟随
动画
css
加载动画
导航
菜单
按钮
滑块
tab
弹出层
统计图
svg
×
Close
在线代码下载提示
开通在线代码永久免费下载,需支付20jQ币
开通后,在线代码模块中所有代码可终身免费下!
您已开通在线代码永久免费下载,关闭提示框后,点下载代码可直接下载!
您已经开通过在线代码永久免费下载
对不起,您的jQ币不足!可通过发布资源 或
直接充值获取jQ币
取消
开通下载
<!doctype html> <html> <head> <meta charset="utf-8"> <title>svg人脸跟随-jq22.com</title> <script src="https://www.jq22.com/jquery/jquery-1.10.2.js"></script> <style>
</style> </head> <body>
<script>
</script>
</body> </html>
2012-2021 jQuery插件库版权所有
jquery插件
|
jq22工具库
|
网页技术
|
广告合作
|
在线反馈
|
版权声明
沪ICP备13043785号-1
浙公网安备 33041102000314号