2026马年春晚邓男子《惊喜定格》魔术计算器同款代码

2026马年春晚邓男子《惊喜定格》魔术计算器同款代码

2026年3月4日星期三 · #资源推荐 魔术 / 前端 / 春晚 / 源码 · 1570 字 8 分钟 ·
-浏览量
·
简介

春晚邓男子计算器魔术《惊喜定格》完整源码与原理,可直接部署使用

2026马年春晚邓男子《惊喜定格》魔术计算器同款代码#

2026年马年春晚邓男子表演的计算器魔术《惊喜定格》同款代码

魔术的精髓从来不在于技术,而在于表演表演环节

第一步:请路人余先生随意给我一个四位数的数字:得到 a = 1106

第二步:请路人徐先生随意给我一个五位数的数字:得到 a = 88396

第三步:为了避嫌,我现在反转手机,来,路人abcd,你们四个一人点个一两下。好,看这个数字是:2072725,完全随机哦。

第四步:请大家加上这个数字后,点击等号得到:2162227,哇,现在刚好是2月16日22点27分,太巧了!

代码原理#

第一步:输入 a + b = (此时一切正常,得出 a + b 的值)

第二步:输入 + 号 (此时屏幕正常显示 + 号,但背后偷偷启动魔术模式。)

第三步:为了方便我们设 x = 当前时间值减去 a+b 的值,假如 x = 2072725。此时无论第一个数字输入的是什么,都要显示2,无论第二个数字输入的是什么都要显示0,以此类推。当2072725输入齐全后,忽略后面的输入。

第四步:点击等号,得出当前时间值。

文件架构#

index.html 介绍页面 calculator.html 魔术计算器页面

演示#

https://jsq-ecj.pages.dev

Collage_20260304_225810005.jpg
Collage_20260304_225810005.jpg

代码下载#

https://wwbtv.lanzout.com/i8iCz3jskkmd

魔术计算器代码#

也可以直接复制新建一个index.html 页面使用

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>魔术计算器</title>
<style>
:root {
--bg-page: #000000;
--bg-card: #000000;
--btn-dark: #333333;
--btn-light: #a5a5a5;
--btn-orange: #ff9f0a;
--text-primary: #ffffff;
--text-secondary: #8e8e93;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
-webkit-tap-highlight-color: transparent;
user-select: none;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Helvetica Neue', sans-serif;
background-color: var(--bg-page);
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
padding: 0;
}
.calculator-card {
background-color: var(--bg-card);
width: 100%;
max-width: 390px;
height: 100vh;
max-height: 844px;
display: flex;
flex-direction: column;
overflow: hidden;
}
.calculator-container {
display: flex;
flex-direction: column;
flex: 1;
padding: 20px 16px;
}
.display-container {
display: flex;
flex-direction: column;
justify-content: flex-end;
align-items: flex-end;
padding: 10px 8px 24px;
flex: 1;
min-height: 200px;
}
.display-expression {
color: var(--text-secondary);
font-size: 24px;
font-weight: 300;
min-height: 30px;
margin-bottom: 8px;
letter-spacing: 1px;
}
.display-result {
color: var(--text-primary);
font-size: 80px;
font-weight: 200;
line-height: 1;
letter-spacing: -2px;
transition: font-size 0.2s ease;
}
.display-result.small {
font-size: 56px;
}
.display-result.smaller {
font-size: 42px;
}
.buttons-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 12px;
}
.btn {
aspect-ratio: 1 / 1;
border-radius: 50%;
border: none;
font-size: 32px;
font-weight: 400;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.1s ease;
position: relative;
overflow: hidden;
background: var(--btn-dark);
color: var(--text-primary);
}
.btn::after {
content: '';
position: absolute;
inset: 0;
background: rgba(255, 255, 255, 0);
transition: background 0.1s;
border-radius: 50%;
}
.btn:active::after {
background: rgba(255, 255, 255, 0.2);
}
.btn:active {
transform: scale(0.95);
}
.btn-operator {
background: var(--btn-orange);
font-size: 36px;
}
.btn-operator.selected {
background: var(--text-primary);
color: var(--btn-orange);
}
.btn-function {
background: var(--btn-light);
color: #000000;
font-size: 28px;
}
.btn-zero {
grid-column: span 2;
aspect-ratio: auto;
border-radius: 999px;
justify-content: flex-start;
padding-left: 32px;
}
.btn-zero::after {
border-radius: 999px;
}
@media (prefers-reduced-motion: reduce) {
.btn, .display-result { transition: none; }
}
</style>
</head>
<body>
<div class="calculator-card">
<div class="calculator-container">
<div class="display-container">
<div class="display-expression" id="expression"></div>
<div class="display-result" id="result">0</div>
</div>
<div class="buttons-grid">
<button class="btn btn-function" data-action="clear">AC</button>
<button class="btn btn-function" data-action="toggle">+/−</button>
<button class="btn btn-function" data-action="percent">%</button>
<button class="btn btn-operator" data-action="operator" data-value="÷">÷</button>
<button class="btn btn-number" data-action="number" data-value="7">7</button>
<button class="btn btn-number" data-action="number" data-value="8">8</button>
<button class="btn btn-number" data-action="number" data-value="9">9</button>
<button class="btn btn-operator" data-action="operator" data-value="×">×</button>
<button class="btn btn-number" data-action="number" data-value="4">4</button>
<button class="btn btn-number" data-action="number" data-value="5">5</button>
<button class="btn btn-number" data-action="number" data-value="6">6</button>
<button class="btn btn-operator" data-action="operator" data-value="−">−</button>
<button class="btn btn-number" data-action="number" data-value="1">1</button>
<button class="btn btn-number" data-action="number" data-value="2">2</button>
<button class="btn btn-number" data-action="number" data-value="3">3</button>
<button class="btn btn-operator" data-action="operator" data-value="+">+</button>
<button class="btn btn-number btn-zero" data-action="number" data-value="0">0</button>
<button class="btn btn-number" data-action="decimal">.</button>
<button class="btn btn-operator" data-action="equals">=</button>
</div>
</div>
</div>
<script>
// ========== 状态变量 ==========
let displayValue = '0';
let firstOperand = null;
let operator = null;
let waitingForSecondOperand = false;
let justCalculated = false;
let isMagicMode = false;
let magicTargetTime = 0;
let magicSequence = '';
let magicIndex = 0;
let magicBaseResult = 0;
// ========== DOM 元素 ==========
const resultDisplay = document.getElementById('result');
const expressionDisplay = document.getElementById('expression');
// ========== 工具函数 ==========
function getCurrentTimeValue() {
const now = new Date();
const month = now.getMonth() + 1;
const day = now.getDate();
const hour = now.getHours();
const minute = now.getMinutes();
return parseInt(`${month}${day}${hour}${minute}`);
}
function formatNumber(numStr) {
if (numStr === 'Error') return 'Error';
if (numStr.includes('.')) {
const parts = numStr.split('.');
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
return parts.join('.');
}
return numStr.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}
function updateDisplay() {
resultDisplay.classList.remove('small', 'smaller');
if (displayValue.length > 9) {
resultDisplay.classList.add('smaller');
} else if (displayValue.length > 6) {
resultDisplay.classList.add('small');
}
resultDisplay.textContent = formatNumber(displayValue);
}
function updateExpression(str) {
expressionDisplay.textContent = str;
}
function highlightOperator(op) {
clearOperatorHighlight();
document.querySelectorAll('.btn-operator').forEach(btn => {
if (btn.dataset.value === op) btn.classList.add('selected');
});
}
function clearOperatorHighlight() {
document.querySelectorAll('.btn-operator').forEach(btn => {
btn.classList.remove('selected');
});
}
// ========== 核心逻辑 ==========
function inputNumber(value) {
if (isMagicMode) {
if (magicIndex < magicSequence.length) {
if (magicIndex === 0) {
displayValue = magicSequence[magicIndex];
} else {
displayValue += magicSequence[magicIndex];
}
magicIndex++;
updateDisplay();
}
return;
}
if (waitingForSecondOperand) {
displayValue = value;
waitingForSecondOperand = false;
} else {
if (displayValue === '0' && value !== '0') {
displayValue = value;
} else if (displayValue !== '0') {
if (displayValue.replace(/[^0-9]/g, '').length < 9) {
displayValue += value;
}
}
}
justCalculated = false;
clearOperatorHighlight();
updateDisplay();
}
function inputDecimal() {
if (isMagicMode) return;
if (waitingForSecondOperand) {
displayValue = '0.';
waitingForSecondOperand = false;
} else if (!displayValue.includes('.')) {
displayValue += '.';
}
justCalculated = false;
updateDisplay();
}
function inputOperator(nextOperator) {
if (justCalculated && nextOperator === '+') {
isMagicMode = true;
magicBaseResult = parseFloat(displayValue);
magicTargetTime = getCurrentTimeValue();
let x = magicTargetTime - magicBaseResult;
if (x < 0) {
isMagicMode = false;
console.warn("当前时间值小于计算结果,魔术无法进行");
} else {
magicSequence = x.toString();
magicIndex = 0;
firstOperand = magicBaseResult;
operator = '+';
waitingForSecondOperand = true;
updateExpression(formatNumber(magicBaseResult.toString()) + ' +');
highlightOperator('+');
justCalculated = false;
return;
}
}
justCalculated = false;
const inputValue = parseFloat(displayValue);
if (firstOperand === null) {
firstOperand = inputValue;
} else if (operator) {
const result = calculate(firstOperand, inputValue, operator);
displayValue = String(result);
firstOperand = result;
updateDisplay();
}
waitingForSecondOperand = true;
operator = nextOperator;
updateExpression(formatNumber(firstOperand.toString()) + ' ' + nextOperator);
highlightOperator(nextOperator);
}
function calculate(a, b, op) {
switch (op) {
case '+': return a + b;
case '−': return a - b;
case '×': return a * b;
case '÷': return b !== 0 ? a / b : 'Error';
default: return b;
}
}
function inputEquals() {
if (isMagicMode) {
displayValue = magicTargetTime.toString();
updateDisplay();
updateExpression('');
isMagicMode = false;
magicIndex = 0;
magicSequence = '';
firstOperand = null;
operator = null;
waitingForSecondOperand = false;
justCalculated = false;
clearOperatorHighlight();
return;
}
if (operator === null || waitingForSecondOperand) return;
const inputValue = parseFloat(displayValue);
const result = calculate(firstOperand, inputValue, operator);
const finalResult = Math.round(result * 1000000000) / 1000000000;
updateExpression(formatNumber(firstOperand.toString()) + ' ' + operator + ' ' +
formatNumber(inputValue.toString()) + ' =');
displayValue = String(finalResult);
updateDisplay();
firstOperand = finalResult;
operator = null;
waitingForSecondOperand = false;
justCalculated = true;
clearOperatorHighlight();
}
function clear() {
displayValue = '0';
firstOperand = null;
operator = null;
waitingForSecondOperand = false;
justCalculated = false;
isMagicMode = false;
magicIndex = 0;
updateDisplay();
updateExpression('');
clearOperatorHighlight();
document.querySelector('[data-action="clear"]').textContent = 'AC';
}
function toggleSign() {
if (isMagicMode) return;
if (displayValue !== '0' && displayValue !== 'Error') {
displayValue = displayValue.startsWith('-') ? displayValue.slice(1) : '-' + displayValue;
updateDisplay();
}
}
function inputPercent() {
if (isMagicMode) return;
displayValue = (parseFloat(displayValue) / 100).toString();
updateDisplay();
}
// ========== 事件绑定 ==========
document.querySelectorAll('.btn').forEach(btn => {
btn.addEventListener('click', () => {
btn.style.transform = 'scale(0.95)';
setTimeout(() => btn.style.transform = '', 100);
const action = btn.dataset.action;
const value = btn.dataset.value;
if (action !== 'clear' && displayValue !== '0' && !waitingForSecondOperand) {
document.querySelector('[data-action="clear"]').textContent = 'C';
}
switch (action) {
case 'number': inputNumber(value); break;
case 'operator': inputOperator(value); break;
case 'equals': inputEquals(); break;
case 'clear': clear(); break;
case 'toggle': toggleSign(); break;
case 'decimal': inputDecimal(); break;
case 'percent': inputPercent(); break;
}
});
});
document.addEventListener('keydown', (e) => {
const key = e.key;
if (/[0-9]/.test(key)) inputNumber(key);
else if (key === '+') inputOperator('+');
else if (key === '-') inputOperator('−');
else if (key === '*') inputOperator('×');
else if (key === '/') inputOperator('÷');
else if (key === 'Enter' || key === '=') inputEquals();
else if (key === 'Escape') clear();
else if (key === '.') inputDecimal();
});
updateDisplay();
</script>
</body>
</html>
2026马年春晚邓男子《惊喜定格》魔术计算器同款代码
https://www.3181314.xyz/posts/2026惊喜定格同款魔术计算器代码/
作者
Odd.G
发布于
2026-03-04
许可协议
CC BY-NC-SA 4.0

评论区

看板娘
公告
友链 互换友链

正在招募技术类博客友链,要求原创、稳定更新。点击了解更多。

查看详情
欢迎 关于我的介绍

欢迎来到我的博客,热爱技术、持续学习,欢迎同好交流探讨,也欢迎大佬互换友链。

查看详情
音乐
封面

音乐

暂未播放

0:00
0:00
暂无歌词
标签
# 分享 10 # 技术 3 # 博客 3 # 部署教程 3 # 教程 2 # 效率 1 # AI 1 # 生活感悟 1 # 人生思考 1 # WorkBuddy 1 # 腾讯智能体 1 # IM集成 1 # OpenClaw 1 # AI助手 1 # 本地部署 1 # 魔术 1 # 前端 1 # 春晚 1 # 源码 1 # 服务器监控 1 # Docker部署 1 # CloudFlare 1 # 哪吒监控 1 # 免费托管 1 # 静态网站 1 # 动态部署 1 # AI项目 1 # 建站工具 1 # 云服务器 1 # 虚拟主机 1 # Minecraft 1 # 服务端 1 # 备份教程 1 # 模组 1 # Shadowsocks 1 # Linux 1 # 一键脚本 1 # 代理 1 # 导航页 1 # EdgeOne 1 # 部署 1 # 静态应用 1 # Cloudflare 1 # 图床 1 # Mizuki 1 # Docker 1 # VPS 1 # 思考 1 # 博客搭建 1 # 关于 1 # 个人 1
目录
工具

隐私政策

更新日期: 2026 年 7 月 15 日
生效日期: 2026 年 7 月 15 日

适用范围#

本政策适用于 Qgxs的博客(以下简称“本站”)。本站是个人博客,用于发布和分享内容;不提供账户注册、支付、定位或广告投放服务。访问本站、发表文章评论或在留言板留言前,请阅读本政策。

信息收集与使用#

本站只在提供内容、评论和留言功能,以及维护站点安全所需的范围内处理信息。

  • 访问与统计信息:访问页面时,统计服务可能处理访问时间、页面地址、来源页、浏览器和设备相关信息,用于了解内容访问情况、排查故障和改进站点。
  • 评论信息:使用文章评论功能时,Waline 可能处理您主动提交的昵称、邮箱、站点链接和评论内容;还可能处理 IP 地址等必要信息,用于防止垃圾评论、滥用和维护服务安全。评论内容、昵称和站点链接(如填写)可能公开展示在文章下方;邮箱不会公开展示。
  • 留言信息:留言板使用 Waline /guestbook/ 频道。Waline 可能处理您主动提交的昵称、可选邮箱、站点链接、留言内容和图片,以及浏览器、操作系统、IP 地址等必要的反滥用信息。默认情况下,留言图片以内嵌数据随留言提交;如站点维护者配置了远程图片上传接口,图片会先发送至该接口并在留言中保存返回的图片地址。留言内容、昵称、图片和站点链接(如填写)可能公开展示;邮箱和 IP 地址不会在留言板公开展示。
  • AI 对话信息:使用 AI 搜索时,本站会处理您提交的问题以及最近 6 条对话历史,用于检索博客内容并生成回答。问题和对话历史会发送至 ModelScope,或在第三方接口不可用时由 Cloudflare Workers AI 处理。请勿在 AI 对话中提交密码、Token、身份证件、联系方式或其他敏感信息。

请不要在评论或留言中提交身份证件、银行卡、住址、密码或其他不必要的敏感个人信息。

第三方服务#

为实现本站功能,以下第三方会在各自服务范围内处理相关数据:

  • Umami:用于匿名化的网站访问统计和出站链接点击统计,帮助我了解本站的使用情况。
  • Waline:用于文章评论、留言板及访问量统计。服务会按照其自身规则处理您在评论或留言时提交的信息及必要的反滥用信息。
  • Cloudflare:为本站提供静态资源分发、AI Worker、Vectorize 和相关基础设施。留言板不使用项目 Worker 或 KV 存储。
  • ModelScope:为 AI 搜索提供文本向量和对话模型服务,会处理您提交的问题及发送给模型的最近对话历史。
  • Cloudflare Workers AI:在未配置第三方 AI 接口时提供文本向量和对话模型服务,并处理相同的 AI 请求数据。
  • unpkg:用于加载 Waline 的前端脚本、样式和表情资源;请求这些资源时,您的浏览器会与该服务建立连接。

第三方服务可能有独立的隐私政策和数据保存规则。请在使用相关功能前查阅其规则;本站无法控制其独立的数据处理活动。

本站主要使用浏览器本地存储(Local Storage 或 Session Storage)保存使用偏好,例如主题颜色、明暗模式、文章列表视图和音乐播放设置。留言板会在本地保存匿名资料、未发送草稿和登录状态,以便恢复输入与会话;管理员登录状态仅保存在当前会话。AI 搜索的会话标题和完整对话也会保存在当前浏览器的 Local Storage 中,最长保存 7 天;您可以在 AI 面板中使用“清空全部会话”立即删除这些数据。

本站不主动设置用于广告定向的第一方 Cookie。评论、统计或资源服务可能按照其自身规则使用 Cookie 或类似技术。您可以通过浏览器设置查看、删除或限制 Cookie 和本地存储;清除后,部分偏好或互动状态可能会恢复为默认值,评论功能也可能受到影响。

信息公开、保存与安全#

评论和留言属于公开互动内容,提交后可能被搜索引擎收录、被他人引用或在缓存中短暂保留。请谨慎决定发布内容。除非您提出删除请求、内容违反规则或法律法规另有要求,公开内容会持续保留以维持讨论上下文。

本站会采取合理措施保护数据安全,包括使用 HTTPS、输入校验、内容转义和访问频率限制。但互联网传输和第三方服务均无法保证绝对安全,请理解并自行承担公开发布信息的相应风险。

你的权利#

你可以通过 crqgxs@qq.com 联系我,申请查询、更正或删除由本站直接保存的评论、留言或相关公开内容。为保护他人权益,请在请求中提供足以定位内容的信息,并说明你与该内容的关系;必要时可能需要进行合理核验。

对于由 Waline、Umami、Cloudflare 或 unpkg 独立处理的数据,你也可以直接向对应服务提供方行使相关权利。删除公开评论或留言后,第三方缓存、搜索引擎索引或他人转载的副本可能无法立即同步删除。

未成年人条款#

未满 14 周岁的未成年人应在监护人同意和指导下使用本站的评论、留言等互动功能。监护人如发现未成年人未经同意提交了个人信息,可通过上述联系方式与我联系,我会在合理范围内协助处理。

政策更新与联系#

我可能因本站功能或适用规则变化更新本政策,更新后的版本将在本站公布并标明日期。继续使用相关功能即表示你已阅读并理解更新后的政策。

如对本政策或数据处理有疑问,请联系 crqgxs@qq.com

用户协议

更新日期: 2026 年 5 月 19 日
生效日期: 2026 年 5 月 19 日

适用范围#

本协议适用于你访问 Qgxs的博客,以及使用文章评论、留言板等互动功能的行为。继续浏览本站或提交评论、留言,即表示你已阅读、理解并同意遵守本协议及本站的隐私政策。

评论及留言规则#

请在交流中保持友善、理性和尊重。你不得利用本站发布、传播或实施以下行为:

  • 发布任何违反中华人民共和国法律法规的内容。
  • 发布任何侵犯他人合法权益的内容,包括但不限于隐私、名誉、肖像、著作权、商标权和其他知识产权。
  • 恶意攻击、辱骂、骚扰、威胁、歧视其他用户或任何第三方。
  • 发布垃圾广告、恶意推广、刷屏、灌水,或与讨论主题明显无关的重复内容。
  • 利用本站进行网络诈骗、钓鱼、传播恶意软件,或发布可能危害网络和信息安全的内容。
  • 绕越或试图绕越本站的审核、限流、封禁等管理措施。
  • 冒充他人、伪造身份,或收集、公开他人的个人信息。

内容与访问管理#

你应对自己发布的评论和留言负责,并保证拥有发布该等内容所需的合法权利。论坛管理员有权在不另行通知的情况下删除违规内容、限制或封禁违规账号,或限制其继续使用本站互动功能。

如发现涉嫌违法犯罪、严重侵权或危及本站安全的内容,本站可保留相关记录,并在法律法规要求或必要时向有关部门提供协助。对管理措施有疑问时,可通过文末联系方式说明情况;本站会结合实际情况处理,但不承诺恢复已删除内容或访问权限。

知识产权与内容授权#

本站原创文章、页面设计和其他受保护内容的权利归作者或权利人所有。未经授权,请勿复制、转载、镜像或用于商业用途;法律法规允许的合理使用除外。

你发布评论或留言时,授予本站为展示、存储、备份、审核、删除和维护互动功能所必需的非独占、免费的使用许可。该许可不改变你对原创内容依法享有的权利。

免责声明#

本站内容仅用于个人记录、学习交流和一般信息参考,不构成任何专业意见、承诺或担保。你应结合自身情况独立判断,并对据此采取的行动负责。

评论、留言和外部链接中的内容由其发布者或运营者负责,不代表本站立场。本站会在合理范围内处理明显违规内容,但不保证所有内容均及时发现,也不对第三方网站的可用性、内容、安全性或隐私实践承担责任。

因网络故障、不可抗力、第三方服务异常、维护升级或超出合理控制范围的原因导致本站暂时无法访问、内容延迟或数据丢失的,本站会尽力恢复,但不承担由此产生的间接损失。

未成年人条款#

未满 14 周岁的未成年人应在监护人同意和指导下使用评论、留言等互动功能。监护人应协助未成年人理解本协议,并对其使用行为进行必要的引导。

其他条款#

我可以根据本站功能、管理需要或法律法规变化更新本协议,更新后的版本将在本站公布并标明日期。继续使用本站即视为接受更新后的协议。

本协议的订立、执行和解释适用中华人民共和国法律。因本协议或使用本站产生争议时,双方应先友好协商;协商不成的,依法向有管辖权的人民法院解决。

如对本协议或内容管理有疑问,请联系 crqgxs@qq.com