// ==UserScript==
// @name 鼠标点击特效666
// @namespace yeysou
// @license MIT
// @version 0.1.1
// @description 鼠标点击网页任意地方,出文字符号表情的特效,颜色随机
// @author yeysou
// @match *://*/*
// @grant none
// @icon data:image/png;base64,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
// @require https://code.jquery.com/jquery-3.6.0.min.js
// @require https://code.jquery.com/ui/1.12.1/jquery-ui.min.js
// ==/UserScript==
/* global $ */
function getRandomInt(min, max) {
// 确保参数为整数
min = Math.ceil(min);
max = Math.floor(max);
// 生成 [min, max] 之间的随机整数
return Math.floor(Math.random() * (max - min + 1)) + min;
}
(function() {
'use strict';
//缓慢消失
$.fn.scaleFadeOut = function(options) {
// 默认配置
const settings = $.extend({
scale: 2,// 放大倍数(2表示放大到原来的2倍)
duration: 800,// 动画持续时间(毫秒)
easing: 'swing' // 缓动函数
}, options);
const $element = $(this);
// 记录原始样式(用于动画结束后恢复,可选)
const originalTransform = $element.css('transform');
const originalOpacity = $element.css('opacity');
// 执行放大消失动画
$element.animate({
opacity: 0 // 透明度逐渐变为0
}, {
duration: settings.duration,
easing: settings.easing,
// 每帧更新缩放比例
step: function(now, fx) {
// 计算当前进度(0-1)
const progress = now === 0 ? 1 : (1 - now);
// 根据进度计算缩放比例(从1到设定的放大倍数)
const scaleValue = 1 + (settings.scale - 1) * (1 - progress);
// 应用缩放变换
$(this).css('transform', `scale(${scaleValue})`);
},
// 动画结束回调
complete: function() {
// 恢复原始样式(如果需要)
$(this).css({
transform: originalTransform,
opacity: originalOpacity
});
// 触发自定义回调
if (settings.complete) {
settings.complete.call(this);
}
}
});
// 支持链式调用
return this;
};
// 定义带弧度的跳跃效果jQuery方法
$.fn.arcBounce = function(options) {
// 默认配置
const settings = $.extend({
distance: 300, // 水平总距离
height: 150, // 跳跃高度
jumps: 3,// 跳跃次数
duration: 1000,// 单次跳跃持续时间(ms)
gravity: 0.8,// 重力系数(值越大下落越快)
damping: 0.7// 阻尼系数(每次跳跃衰减比例)
}, options);
const $element = $(this);
const originalPosition = $element.css('position');
const startLeft = parseInt($element.css('left') || 0);
const startTop = parseInt($element.css('top') || 0);
// 确保元素可以被定位
if (!['absolute', 'fixed', 'relative'].includes(originalPosition)) {
$element.css('position', 'relative');
}
// 执行多段弧形跳跃
let currentLeft = startLeft;
let currentJump = 0;
function performJump() {
if (currentJump >= settings.jumps) {
// 所有跳跃完成后的回调
if (settings.complete) {
settings.complete.call($element);
}
return;
}
// 计算当前跳跃的参数(随次数衰减)
const jumpDistance = settings.distance * Math.pow(settings.damping, currentJump);
const jumpHeight = settings.height * Math.pow(settings.damping, currentJump);
const jumpDuration = settings.duration * (1 - currentJump * 0.1); // 后续跳跃稍慢
const targetLeft = currentLeft - jumpDistance;
let startTime;
let progress = 0;
// 抛物线跳跃动画
function animate(timestamp) {
if (!startTime) startTime = timestamp;
const elapsed = timestamp - startTime;
progress = Math.min(elapsed / jumpDuration, 1);
// 计算水平位置(线性移动)
const newLeft = currentLeft - (jumpDistance * progress);
// 计算垂直位置(抛物线轨迹: y = -4h(x² - x),形成弧形)
// 加入重力效果,使下落更快
const arcProgress = -4 * jumpHeight * (progress * progress - progress);
const gravityEffect = Math.pow(progress - 0.5, 2) * settings.gravity * jumpHeight;
const newTop = startTop - (arcProgress - gravityEffect);
// 应用新位置
$element.css({
left: newLeft + 'px',
top: newTop + 'px',
// transform: 'rotate('+progress*360+'deg)'
});
// 继续动画或结束当前跳跃
if (progress < 1) {
requestAnimationFrame(animate);
} else {
currentLeft = targetLeft;
currentJump++;
// 稍微延迟后开始下一次跳跃,增强节奏感
setTimeout(performJump, 0);
}
}
requestAnimationFrame(animate);
}
// 开始第一段跳跃
performJump();
// 支持链式调用
return this;
};
// 跳动效果函数
function bounce($element) {
const originalPosition = $element.css('position');
const originalTop = $element.css('top');
const originalLeft = $element.css('left');
const bounceDamping = 0.8; // 弹跳阻尼(每次弹起高度衰减比例,0-1之间)
// 确保元素可以被定位
if (originalPosition !== 'absolute' && originalPosition !== 'fixed') {
$element.css('position', 'relative');
}
// 记录初始位置(用于计算相对移动)
const startTop = parseInt($element.css('top') || 0);
const startLeft = parseInt($element.css('left') || 0);
/*
.animate({ top: startTop,left:startLeft-500*(1-bounceDamping)}, 200, 'swing')//落地
.animate({ top: startTop - 150*bounceDamping**2,left:startLeft-500*(1-bounceDamping**2) }, 200, 'swing')//向上跳
.animate({ top: startTop,left:startLeft-500*(1-bounceDamping**2)}, 200, 'swing')//落地
.animate({ top: startTop - 150*bounceDamping**3,left:startLeft-500*(1-bounceDamping**3) }, 200, 'swing')//向上跳
.animate({ top: startTop,left:startLeft-500*(1-bounceDamping**3)}, 200, 'swing')//落地
.animate({ top: startTop - 150*bounceDamping**4,left:startLeft-500*(1-bounceDamping**4) }, 200, 'swing')//向上跳*/
// 1. 跳动效果(向上再落下)
// 2. 落地后旋转并向左移动
$element.animate({
//left: startLeft - 800,// 向左移动200px
left:startLeft - 500,
rotate: '-720deg'// 旋转360度
}, {
duration: 2000,
easing: 'swing',
step: function(now, fx) {
// 处理旋转动画(jQuery本身不支持rotate,需要手动设置transform)
if (fx.prop === 'rotate') {
var opa= $(this).css("opacity");
$(this).css('opacity', opa-0.005);
$(this).css('transform', `rotate(${now}deg)`);
}
},
complete: () => {
//$element.remove();
$element.scaleFadeOut({
scale: 10,// 放大到3倍
duration: 500,// 1秒内完成动画
complete: function() {
// 动画结束后可以隐藏或移除元素
$(this).remove();
// 如需重复使用,可在适当时候显示
// setTimeout(() => $(this).show(), 1000);
}
});
}
});
}
var a_idx = 0;
const 前颜色码库 = new Array('00', '11', '22', '1', '44', '55', '66', '77', '88', '99',
'aa', 'bb', 'cc', 'dd', 'ee', 'ff');
const 中颜色码库 = new Array('00', '11', '22', '33', '44', '55', '66', '77', '88', '99',
'aa', 'bb', 'cc', 'dd', 'ee', 'ff');
const 后颜色码库 = new Array('00', '11', '22', '33', '44', '55', '66', '77', '88', '99',
'aa', 'bb', 'cc', 'dd', 'ee', 'ff');
var 前颜色码 ;var 中颜色码;var 后颜色码;
var timerrrr = setInterval(function(){
前颜色码 = Math.floor(Math.random() * 前颜色码库.length);
中颜色码 = Math.floor(Math.random() * 中颜色码库.length);
后颜色码 = Math.floor(Math.random() * 后颜色码库.length);
},150)
$("body").click(function(e) {
var a = new Array("我","超","牛","逼");
var $i = $("<span/>").text(a[a_idx]);
a_idx = (a_idx + 1) % a.length;
var x = e.pageX,
y = e.pageY;
var size = getRandomInt(30,60);
$i.css({
"z-index": 99999999,
"top": y-size-10,
"left": x-size,
"font-size":size,
"position": "absolute",
"font-weight": "bold",
"color": "#" + 前颜色码库[前颜色码] + 中颜色码库[中颜色码] + 后颜色码库[后颜色码]
});
$("body").append($i);
var rt = getRandomInt(2,5);
var rl = getRandomInt(3,6);
//bounce($i)
// move($i)
$i.arcBounce({
distance: rl*50, // 水平距离
height: 50*rt, // 跳跃高度
jumps: 10,// 跳跃次数
duration: 300,// 单次跳跃时间
gravity: 1,// 重力系数
damping: 0.6,// 阻尼系数
complete: function() {
// 跳跃完成后的回调函数
bounce($i);
}
});
});
})();