diff --git a/blog.config.js b/blog.config.js index eca17335c00..caa996ec781 100644 --- a/blog.config.js +++ b/blog.config.js @@ -245,6 +245,13 @@ const BLOG = { '251, 243, 140' ], + // 鼠标跟随特效 + MOUSE_FOLLOW: process.env.NEXT_PUBLIC_MOUSE_FOLLOW || true, // 开关 + // 这两个只有在鼠标跟随特效开启时才生效 + // 鼠标类型 1:路劲散点 2:下降散点 3:上升散点 4:边缘向鼠标移动散点 5:跟踪转圈散点 6:路径线条 7:聚集散点 8:聚集网格 9:移动网格 10:上升粒子 11:转圈随机颜色粒子 12:圆锥放射跟随蓝色粒子 + MOUSE_FOLLOW_EFFECT_TYPE: 11, // 1-12 + MOUSE_FOLLOW_EFFECT_COLOR: '#ef672a', // 鼠标点击特效颜色 #xxxxxx 或者 rgba(r,g,b,a) + // 樱花飘落特效 SAKURA: process.env.NEXT_PUBLIC_SAKURA || false, // 开关 // 漂浮线段特效 @@ -340,7 +347,7 @@ const BLOG = { process.env.NEXT_PUBLIC_COMMENT_TWIKOO_COUNT_ENABLE || true, // 博客列表是否显示评论数 COMMENT_TWIKOO_CDN_URL: process.env.NEXT_PUBLIC_COMMENT_TWIKOO_CDN_URL || - 'https://cdn.staticfile.org/twikoo/1.6.17/twikoo.min.js', // twikoo客户端cdn + 'https://cdn.staticfile.net/twikoo/1.6.17/twikoo.min.js', // twikoo客户端cdn // utterance COMMENT_UTTERRANCES_REPO: diff --git a/components/ExternalPlugins.js b/components/ExternalPlugins.js index b77f960d297..cecfae0e8a8 100644 --- a/components/ExternalPlugins.js +++ b/components/ExternalPlugins.js @@ -23,6 +23,9 @@ const ThemeSwitch = dynamic(() => import('@/components/ThemeSwitch'), { const Fireworks = dynamic(() => import('@/components/Fireworks'), { ssr: false }) +const MouseFollow = dynamic(() => import('@/components/MouseFollow'), { + ssr: false +}) const Nest = dynamic(() => import('@/components/Nest'), { ssr: false }) const FlutteringRibbon = dynamic( () => import('@/components/FlutteringRibbon'), @@ -119,6 +122,7 @@ const ExternalPlugin = props => { const CLARITY_ID = siteConfig('CLARITY_ID') const IMG_SHADOW = siteConfig('IMG_SHADOW') const ANIMATE_CSS_URL = siteConfig('ANIMATE_CSS_URL') + const MOUSE_FOLLOW = siteConfig('MOUSE_FOLLOW') // 自定义样式css和js引入 if (isBrowser) { @@ -172,7 +176,7 @@ const ExternalPlugin = props => { <> {/* 全局样式嵌入 */} - + {MOUSE_FOLLOW && } {THEME_SWITCH && } {DEBUG && } {ANALYTICS_ACKEE_TRACKER && } diff --git a/components/MouseFollow.js b/components/MouseFollow.js new file mode 100644 index 00000000000..28bacc3dd72 --- /dev/null +++ b/components/MouseFollow.js @@ -0,0 +1,27 @@ +import { useEffect } from 'react' +// import anime from 'animejs' +import { siteConfig } from '@/lib/config' +import { loadExternalResource } from '@/lib/utils' + +/** + * 鼠标跟随特效 + * @returns + */ +const MOUSE_FOLLOW = () => { + const type = siteConfig('MOUSE_FOLLOW_EFFECT_TYPE') + const color = siteConfig('MOUSE_FOLLOW_EFFECT_COLOR') + + useEffect(() => { + loadExternalResource('/js/mouse-follow.js', 'js').then(url => { + if (window.createMouseCanvas) { + window.createMouseCanvas()({ + type, + color + }) + } + }) + }, []) + + return <> +} +export default MOUSE_FOLLOW diff --git a/public/js/mouse-follow.js b/public/js/mouse-follow.js new file mode 100644 index 00000000000..dd53b9fdfea --- /dev/null +++ b/public/js/mouse-follow.js @@ -0,0 +1,714 @@ +/* eslint-disable */ + +/** + * 创建鼠标特效 + * @param options + */ +function createMouseCanvas() { + // 创建一个类 + const _createClass = (function () { + function n(t, e) { + for (let i = 0; i < e.length; i++) { + const n = e[i] + ;(n.enumerable = n.enumerable || !1), + (n.configurable = !0), + 'value' in n && (n.writable = !0), + Object.defineProperty(t, n.key, n) + } + } + return function (t, e, i) { + return e && n(t.prototype, e), i && n(t, i), t + } + })() + + // 抛出一个类型错误(TypeError),指出类(或构造函数)不能被直接调用为函数,而应该使用 new 关键字来创建实例。 + function _classCallCheck(t, e) { + if (!(t instanceof e)) + throw new TypeError('Cannot call a class as a function') + } + + // 模拟 jquery 中的 offset 函数 + function getOffset(element) { + const rect = element.getBoundingClientRect() + return { + top: rect.top + window.pageYOffset, + left: rect.left + window.pageXOffset + } + } + + // 模拟 jquery 中的 extend 函数 + function deepExtend(out) { + out = out || {} + for (let i = 1; i < arguments.length; i++) { + const obj = arguments[i] + if (!obj) continue + for (const key in obj) { + if (obj.hasOwnProperty(key)) { + if ( + typeof obj[key] === 'object' && + obj[key] !== null && + !Array.isArray(obj[key]) + ) { + // 如果属性值是对象但不是数组,递归合并 + out[key] = deepExtend(out[key], obj[key]) + } else { + // 直接覆盖属性值 + out[key] = obj[key] + } + } + } + } + return out + } + + const e = + (_createClass(t, [ + { + key: 'init', + value: function (t) { + // 这一段代码的目的是确保浏览器支持 requestAnimationFrame 和 cancelAnimationFrame 这两个函数 + !(function () { + for ( + var a = 0, t = ['webkit', 'moz'], e = 0; + e < t.length && !window.requestAnimationFrame; + ++e + ) + (window.requestAnimationFrame = + window[t[e] + 'RequestAnimationFrame']), + (window.cancelAnimationFrame = + window[t[e] + 'CancelAnimationFrame'] || + window[t[e] + 'CancelRequestAnimationFrame']) + window.requestAnimationFrame || + (window.requestAnimationFrame = function (t, e) { + const i = new Date().getTime() + const n = Math.max(0, 16.7 - (i - a)) + const o = window.setTimeout(function () { + t(i + n) + }, n) + return (a = i + n), o + }), + window.cancelAnimationFrame || + (window.cancelAnimationFrame = function (t) { + clearTimeout(t) + }) + })() + + // t 是要合并的对象 + if (t) { + this.defaults = deepExtend(this.defaults, t) + } + + // 创建一个新的 canvas 元素 + const canvas = document.createElement('canvas') + + // 设置 canvas 的 id 和样式 + canvas.id = 'vixcityCanvas' + canvas.style.position = 'fixed' + canvas.style.left = '0px' + canvas.style.top = '0px' + canvas.style.zIndex = '2147483647' + canvas.style.pointerEvents = 'none' + + // 将 canvas 添加到 body 元素中 + document.body.appendChild(canvas) + + // 判断类型,并调用相应的绘画函数 + const i = this.defaults.type + i >= 1 && + i < 11 && + this.mouseType1(this.defaults.type, this.defaults.color), + i == 11 && this.mouseType2(), + i == 12 && this.mouseType3() + } + }, + { + key: 'mouseType1', + value: function (type, color) { + let n + let o + let a + let h + const canvasDom = document.getElementById('vixcityCanvas') + // 获取 2D 渲染上下文 + const ctx = canvasDom.getContext('2d') + const l = [] + const c = { + n: 100, + c: 222, + bc: '#fff', + r: 0.9, + o: 0.05, + a: 1, + s: 20 + } + let d = 0 + let f = 0 + let u = 0 + let y = 0 + let w = 0 + let p = 0 + let v = 0 + g() + var getColor + let x = 360 * Math.random() + var getColor = color || 'hsl(' + x + ',100%,80%)' + window.addEventListener('resize', function () { + g() + }) + function g() { + ;(n = window.innerWidth), + (o = window.innerHeight), + (canvasDom.width = n), + (canvasDom.height = o), + (a = n / 2), + (h = o / 2) + } + window.addEventListener('mousemove', function (t) { + ;(a = t.pageX - getOffset(canvasDom).left), + (h = t.pageY - getOffset(canvasDom).top), + type == 4 && + (Math.random() <= 0.5 + ? ((d = Math.random() <= 0.5 ? -10 : n + 10), + (f = Math.random() * o)) + : ((f = Math.random() <= 0.5 ? -10 : o + 10), + (d = Math.random() * n)), + (u = 8 * (Math.random() - 0.5)), + (y = 8 * (Math.random() - 0.5))), + type == 1 || type == 2 || type == 3 + ? l.push({ x: a, y: h, r: c.r, o: 1, v: 0 }) + : type == 4 + ? l.push({ + x: a, + y: h, + r: c.r, + o: 1, + v: 0, + wx: d, + wy: f, + vx2: u, + vy2: y + }) + : type == 6 && + l.push({ + x: a + 30 * (Math.random() - 0.5), + y: h + 30 * (Math.random() - 0.5), + o: 1, + wx: a, + wy: h + }) + }), + (function t() { + if (type == 1) { + ctx.clearRect(0, 0, n, o) + for (var e = 0; e < l.length; e++) + (ctx.globalAlpha = l[e].o), + (ctx.fillStyle = getColor), + ctx.beginPath(), + ctx.arc(l[e].x, l[e].y, l[e].r, 0, 2 * Math.PI), + ctx.closePath(), + ctx.fill(), + (l[e].r += c.r), + (l[e].o -= c.o), + l[e].o <= 0 && (l.splice(e, 1), e--) + } else if (type == 2) + for (ctx.clearRect(0, 0, n, o), e = 0; e < l.length; e++) + (ctx.globalAlpha = l[e].o), + (ctx.fillStyle = getColor), + ctx.beginPath(), + (l[e].r = 10), + (ctx.shadowBlur = 20), + (ctx.shadowColor = getColor), + ctx.arc(l[e].x, l[e].y, l[e].r, 0, 2 * Math.PI), + ctx.closePath(), + ctx.fill(), + (ctx.shadowBlur = 0), + (l[e].o -= c.o), + (l[e].v += c.a), + (l[e].y += l[e].v), + (l[e].y >= o + l[e].r || l[e].o <= 0) && + (l.splice(e, 1), e--) + else if (type == 3) + for ( + w += 5, ctx.clearRect(0, 0, n, o), e = 0; + e < l.length; + e++ + ) + (ctx.globalAlpha = l[e].o), + (ctx.fillStyle = getColor), + ctx.beginPath(), + (ctx.shadowBlur = 20), + (ctx.shadowColor = getColor), + (l[e].r = 20 * (1 - l[e].y / o)), + ctx.arc(l[e].x, l[e].y, l[e].r, 0, 2 * Math.PI), + ctx.closePath(), + ctx.fill(), + (ctx.shadowBlur = 0), + (l[e].o = l[e].y / o), + (l[e].v += c.a), + (l[e].y -= c.s), + (l[e].x += 10 * Math.cos((l[e].y + w) / 100)), + (l[e].y <= 0 - l[e].r || l[e].o <= 0) && + (l.splice(e, 1), e--) + else if (type == 4) + for (ctx.clearRect(0, 0, n, o), e = 0; e < l.length; e++) + (ctx.globalAlpha = l[e].o), + (ctx.fillStyle = getColor), + ctx.beginPath(), + (ctx.shadowBlur = 20), + (ctx.shadowColor = getColor), + (l[e].vx2 += (a - l[e].wx) / 1e3), + (l[e].vy2 += (h - l[e].wy) / 1e3), + (l[e].wx += l[e].vx2), + (l[e].wy += l[e].vy2), + (l[e].o -= c.o / 2), + (l[e].r = 10), + ctx.arc(l[e].wx, l[e].wy, l[e].r, 0, 2 * Math.PI), + ctx.closePath(), + ctx.fill(), + (ctx.shadowBlur = 0), + l[e].o <= 0 && (l.splice(e, 1), e--) + else if (type == 5) + c.c || (m = 'hsl(' + (x += 0.1) + ',100%,80%)'), + ctx.clearRect(0, 0, n, o), + (p += 10), + (ctx.globalAlpha = 1), + (ctx.fillStyle = getColor), + (ctx.shadowBlur = 20), + (ctx.shadowColor = getColor), + ctx.beginPath(), + ctx.arc( + a + 50 * Math.cos((p * Math.PI) / 180), + h + 50 * Math.sin((p * Math.PI) / 180), + 10, + 0, + 2 * Math.PI + ), + ctx.closePath(), + ctx.fill(), + ctx.beginPath(), + ctx.arc( + a + 50 * Math.cos(((p + 180) * Math.PI) / 180), + h + 50 * Math.sin(((p + 180) * Math.PI) / 180), + 10, + 0, + 2 * Math.PI + ), + ctx.closePath(), + ctx.fill(), + ctx.beginPath(), + ctx.arc( + a + 50 * Math.cos(((p + 90) * Math.PI) / 180), + h + 50 * Math.sin(((p + 90) * Math.PI) / 180), + 10, + 0, + 2 * Math.PI + ), + ctx.closePath(), + ctx.fill(), + ctx.beginPath(), + ctx.arc( + a + 50 * Math.cos(((p + 270) * Math.PI) / 180), + h + 50 * Math.sin(((p + 270) * Math.PI) / 180), + 10, + 0, + 2 * Math.PI + ), + ctx.closePath(), + ctx.fill(), + (ctx.shadowBlur = 0) + else if (type == 6) + for (ctx.clearRect(0, 0, n, o), e = 0; e < l.length; e++) + (ctx.globalAlpha = l[e].o), + (ctx.strokeStyle = getColor), + ctx.beginPath(), + (ctx.lineWidth = 2), + ctx.moveTo(l[e].x, l[e].y), + ctx.lineTo( + (l[e].wx + l[e].x) / 2 + 20 * Math.random(), + (l[e].wy + l[e].y) / 2 + 20 * Math.random() + ), + ctx.lineTo(l[e].wx, l[e].wy), + ctx.closePath(), + ctx.stroke(), + (l[e].o -= c.o), + l[e].o <= 0 && (l.splice(e, 1), e--) + else if (type == 7) + for ( + ctx.clearRect(0, 0, n, o), + l.length < 2 * c.n && + ((v = 2 * Math.random() * Math.PI), + l.push({ + x: a + 100 * (Math.random() - 0.5) * Math.cos(v), + y: h + 100 * (Math.random() - 0.5) * Math.cos(v), + o: 1, + h: v + })), + e = 0; + e < l.length; + e++ + ) + (ctx.globalAlpha = l[e].o), + (ctx.fillStyle = getColor), + ctx.beginPath(), + (l[e].x += (a - l[e].x) / 10), + (l[e].y += (h - l[e].y) / 10), + ctx.arc(l[e].x, l[e].y, 1, 0, 2 * Math.PI), + ctx.closePath(), + ctx.fill(), + (l[e].o -= c.o), + l[e].o <= 0 && + ((l[e].h = 2 * Math.random() * Math.PI), + (l[e].x = + a + 100 * (Math.random() - 0.5) * Math.cos(l[e].h)), + (l[e].y = + h + 100 * (Math.random() - 0.5) * Math.sin(l[e].h)), + (l[e].o = 1)) + else if (type == 8) + for ( + ctx.clearRect(0, 0, n, o), + ctx.fillStyle = getColor, + a % 4 == 0 + ? (a += 1) + : a % 4 == 2 + ? --a + : a % 4 == 3 && (a -= 2), + h % 4 == 0 + ? (h += 1) + : h % 4 == 2 + ? --h + : h % 4 == 3 && (h -= 2), + e = a - 60; + e < a + 60; + e += 4 + ) + for (let i = h - 60; i < h + 60; i += 4) + Math.sqrt(Math.pow(a - e, 2) + Math.pow(h - i, 2)) <= 60 && + ((ctx.globalAlpha = + 1 - + Math.sqrt(Math.pow(a - e, 2) + Math.pow(h - i, 2)) / + 60), + Math.random() < 0.2 && ctx.fillRect(e, i, 3, 3)) + else if (type == 9) + for ( + ctx.clearRect(0, 0, n, o), + ctx.fillStyle = getColor, + a % 4 == 0 + ? (a += 1) + : a % 4 == 2 + ? --a + : a % 4 == 3 && (a -= 2), + h % 4 == 0 + ? (h += 1) + : h % 4 == 2 + ? --h + : h % 4 == 3 && (h -= 2), + l.length < c.n && + l.push({ x: a, y: h, xv: 0, yv: 0, o: 1 }), + e = 0; + e < l.length; + e++ + ) + l[e].xv == 0 && l[e].yv == 0 + ? Math.random() < 0.5 + ? Math.random() < 0.5 + ? (l[e].xv = 3) + : (l[e].xv = -3) + : Math.random() < 0.5 + ? (l[e].yv = 3) + : (l[e].yv = -3) + : l[e].xv == 0 + ? Math.random() < 0.66 && + ((l[e].yv = 0), + Math.random() < 0.5 ? (l[e].xv = 3) : (l[e].xv = -3)) + : l[e].yv == 0 && + Math.random() < 0.66 && + ((l[e].xv = 0), + Math.random() < 0.5 ? (l[e].yv = 3) : (l[e].yv = -3)), + (l[e].o -= c.o / 2), + (ctx.globalAlpha = l[e].o), + (l[e].x += l[e].xv), + (l[e].y += l[e].yv), + ctx.fillRect(l[e].x, l[e].y, 3, 3), + l[e].o <= 0 && (l.splice(e, 1), e--) + else if (type == 10) + for ( + ctx.clearRect(0, 0, n, o), + ctx.fillStyle = getColor, + l.push({ x: a, y: h, xv: 2, yv: 1, o: 1 }), + e = 0; + e < l.length; + e++ + ) + (l[e].o -= c.o / 10), + (ctx.globalAlpha = l[e].o), + (l[e].x += 4 * (Math.random() - 0.5)), + --l[e].y, + ctx.fillRect(l[e].x, l[e].y, 2, 2), + l[e].o <= 0 && (l.splice(e, 1), e--) + window.requestAnimationFrame(t) + })() + } + }, + { + key: 'mouseType2', + value: function () { + let t + let o + let a + let h = window.innerWidth + let s = window.innerHeight + const i = 70 + let r = 1 + const l = 1 + const c = 1.5 + const n = 25 + let d = 0.5 * h + let f = 0.5 * s + let u = !1 + function e(t) { + ;(d = t.clientX - 0.5 * (window.innerWidth - h)), + (f = t.clientY - 0.5 * (window.innerHeight - s)) + } + function y(t) { + u = !0 + } + function w(t) { + u = !1 + } + function p(t) { + t.touches.length == 1 && + (t.preventDefault(), + (d = t.touches[0].pageX - 0.5 * (window.innerWidth - h)), + (f = t.touches[0].pageY - 0.5 * (window.innerHeight - s))) + } + function v(t) { + t.touches.length == 1 && + (t.preventDefault(), + (d = t.touches[0].pageX - 0.5 * (window.innerWidth - h)), + (f = t.touches[0].pageY - 0.5 * (window.innerHeight - s))) + } + function m() { + ;(h = window.innerWidth), + (s = window.innerHeight), + (t.width = h), + (t.height = s) + } + function x() { + u ? (r += 0.02 * (c - r)) : (r -= 0.02 * (r - l)), + (r = Math.min(r, c)), + o.clearRect(0, 0, o.canvas.width, o.canvas.height) + for (let t = 0, e = a.length; t < e; t++) { + const i = a[t] + const n = { x: i.position.x, y: i.position.y } + ;(i.offset.x += i.speed), + (i.offset.y += i.speed), + (i.shift.x += (d - i.shift.x) * i.speed), + (i.shift.y += (f - i.shift.y) * i.speed), + (i.position.x = + i.shift.x + Math.cos(t + i.offset.x) * (i.orbit * r)), + (i.position.y = + i.shift.y + Math.sin(t + i.offset.y) * (i.orbit * r)), + (i.position.x = Math.max(Math.min(i.position.x, h), 0)), + (i.position.y = Math.max(Math.min(i.position.y, s), 0)), + (i.size += 0.01 * (i.targetSize - i.size)), + Math.round(i.size) == Math.round(i.targetSize) && + (i.targetSize = 1 + 2 * Math.random()), + o.beginPath(), + (o.fillStyle = i.fillColor), + (o.strokeStyle = i.fillColor), + (o.lineWidth = i.size), + o.moveTo(n.x, n.y), + o.lineTo(i.position.x, i.position.y), + o.stroke(), + o.arc( + i.position.x, + i.position.y, + i.size / 2, + 0, + 2 * Math.PI, + !0 + ), + o.fill() + } + window.requestAnimationFrame(x) + } + ;(t = document.getElementById('vixcityCanvas')) && + t.getContext && + ((o = t.getContext('2d')), + window.addEventListener('mousemove', e, !1), + window.addEventListener('mousedown', y, !1), + window.addEventListener('mouseup', w, !1), + document.addEventListener('touchstart', p, !1), + document.addEventListener('touchmove', v, !1), + window.addEventListener('resize', m, !1), + (function () { + a = [] + for (let t = 0; t < n; t++) { + const e = { + size: 1, + position: { x: d, y: f }, + offset: { x: 0, y: 0 }, + shift: { x: d, y: f }, + speed: 0.01 + 0.04 * Math.random(), + targetSize: 1, + fillColor: + '#' + + ((9453632 * Math.random() + 11184810) | 0).toString(16), + orbit: 0.5 * i + 0.5 * i * Math.random() + } + a.push(e) + } + })(), + m(), + x()) + } + }, + { + key: 'mouseType3', + value: function () { + // 获取窗口的高度 + const windowHeight = + window.innerHeight || + document.documentElement.clientHeight || + document.body.clientHeight + + // 创建一个新的 div 元素 + const vixcityDiv = document.createElement('div') + + // 设置 div 的 id 和样式 + vixcityDiv.id = 'vixcityDiv' + vixcityDiv.style.position = 'fixed' + vixcityDiv.style.width = '100%' + vixcityDiv.style.height = windowHeight + 'px' + vixcityDiv.style.left = '0px' + vixcityDiv.style.top = '0px' + vixcityDiv.style.zIndex = '2147483647' + vixcityDiv.style.pointerEvents = 'none' + + // 将 div 添加到 body 元素中 + document.body.appendChild(vixcityDiv), + new ((function () { + function i(t) { + return document.getElementById(t) + } + function t(t, e) { + ;(this.config = e || {}), + (this.obj = i(t)), + (n = this.config.speed || 4), + (o = this.config.animR || 1), + (a = { + x: 0.5 * i(t).offsetWidth, + y: 0.5 * i(t).offsetHeight + }), + this.setXY(), + this.start() + } + let n + let o + let a + const r = [] + let l = 0 + t.prototype = { + setXY: function () { + let t, e + this.obj, + (t = 'mousemove'), + (e = function (t) { + ;(t = t || window.event), + (a.x = t.clientX), + (a.y = t.clientY) + }), + window.addEventListener + ? window.addEventListener(t, e, !1) + : window.attachEvent('on' + t, function () { + e.call(window) + }) + }, + start: function () { + Math.PI + let t + let e + const i = this.config.fn + r[l++] = t = new c(null, 0, 0) + for (let n = 0; n < 360; n += 20) + for (let o = t, a = 10; a < 35; a += 1) { + const h = i(n, a).x + const s = i(n, a).y + ;(r[l++] = e = new c(o, h, s)), (o = e) + } + setInterval(function () { + for (let t = 0; t < l; t++) r[t].run() + }, 16) + } + } + var c = function (t, e, i) { + const n = document.createElement('span') + ;(this.css = n.style), + (this.css.backgroundColor = '#2D8CF0'), + (this.css.width = '2px'), + (this.css.height = '2px'), + (this.css.position = 'absolute'), + (this.css.left = '-1000px'), + (this.css.zIndex = 1e3 - l), + document.getElementById('vixcityDiv').appendChild(n), + (this.ddx = 0), + (this.ddy = 0), + (this.PX = 0), + (this.PY = 0), + (this.x = 0), + (this.y = 0), + (this.x0 = 0), + (this.y0 = 0), + (this.cx = e), + (this.cy = i), + (this.parent = t) + } + return ( + (c.prototype.run = function () { + this.parent + ? ((this.x0 = this.parent.x), (this.y0 = this.parent.y)) + : ((this.x0 = a.x), (this.y0 = a.y)), + (this.x = this.PX += + (this.ddx += + (this.x0 - this.PX - this.ddx + this.cx) / o) / n), + (this.y = this.PY += + (this.ddy += + (this.y0 - this.PY - this.ddy + this.cy) / o) / n), + (this.css.left = Math.round(this.x) + 'px'), + (this.css.top = Math.round(this.y) + 'px') + }), + t + ) + })())('vixcityDiv', { + speed: 4, + animR: 2, + fn: function (t, e) { + return { + x: (e / 4) * Math.cos(t), + y: (e / 4) * Math.sin(t) + } + } + }) + } + }, + { + key: 'cnblogs', + get: function () { + return { canvase: '#vixcityCanvas' } + } + } + ]), + t) + + // 赋值 给一个默认值 + function t() { + _classCallCheck(this, t), + (this.defaults = { type: 1, color: !1 }), + (this.version = '0.0.1') + } + + return function drawGoodCanvas(options) { + new e().init(options) + } +} +window.createMouseCanvas = createMouseCanvas