mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
444 字
1 分钟
2026马年春晚邓男子《惊喜定格》魔术计算器同款代码

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

代码下载#

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.20210701.xyz/posts/2026惊喜定格同款魔术计算器代码/
作者
奇怪先生
发布于
2026-03-04
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时