“卡iPhone”并不是一个真正的“黑客”或“破解”工具,它本质上是一个利用了浏览器性能瓶颈和渲染机制的性能压力测试工具或趣味性网页,它通过在网页上创建大量复杂的、需要持续计算和渲染的元素,来耗尽设备的CPU和GPU资源,从而达到让设备“卡顿”、“卡死”或“发热”的效果。

(图片来源网络,侵删)
核心实现原理
这种网页的核心原理可以归结为以下几点:
- 大量DOM元素:在页面上创建成千上万个DOM元素(如
<div>、<span>、<img>等),浏览器需要为每个元素分配内存、计算样式、进行布局和渲染,元素越多,开销越大。 - 持续动画:使用
requestAnimationFrame或setInterval对大量元素进行复杂的CSS动画或JavaScript动画,这会持续触发浏览器的重绘和重排,给CPU和GPU带来巨大压力。 - 高频率JavaScript计算:在动画循环中执行复杂的JavaScript代码,例如大量的数学运算、对象创建和销毁等,持续占用JavaScript主线程。
- Canvas 绘图:在
<canvas>上绘制极其复杂的图形,例如分形、粒子系统等,这些都需要GPU进行实时渲染。 - 阻塞式操作:通过一些技巧(虽然不推荐)来阻止浏览器的优化,例如频繁地读取会触发重排的属性(如
offsetTop,offsetLeft)。
基础源码示例(多种实现方式)
下面我将提供几个从简单到复杂的源码示例,你可以直接复制到HTML文件中运行,观察效果。
示例1:最简单的“卡”——海量DOM元素
这是最直接的方法,通过创建成千上万个元素来压垮浏览器的渲染引擎。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">海量元素卡顿测试</title>
<style>
body { margin: 0; overflow: hidden; background: #000; }
.box {
position: absolute;
width: 5px;
height: 5px;
background: #f00;
}
</style>
</head>
<body>
<script>
const count = 50000; // 元素数量,可以调整
const body = document.body;
for (let i = 0; i < count; i++) {
const box = document.createElement('div');
box.className = 'box';
// 随机位置
box.style.left = Math.random() * window.innerWidth + 'px';
box.style.top = Math.random() * window.innerHeight + 'px';
body.appendChild(box);
}
</script>
</body>
</html>
原理:这个例子创建了5万个红色小方块,你的浏览器需要处理这5万个元素的定位和渲染,页面会立刻变得非常卡顿。

(图片来源网络,侵删)
示例2:动态动画卡顿——持续移动元素
在示例1的基础上,让这些元素动起来,效果会更强。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">动态元素卡顿测试</title>
<style>
body { margin: 0; overflow: hidden; background: #000; }
.box {
position: absolute;
width: 10px;
height: 10px;
background: #0ff;
}
</style>
</head>
<body>
<script>
const count = 2000; // 动态元素数量不需要太多
const body = document.body;
const boxes = [];
function createBoxes() {
for (let i = 0; i < count; i++) {
const box = document.createElement('div');
box.className = 'box';
box.style.left = Math.random() * window.innerWidth + 'px';
box.style.top = Math.random() * window.innerHeight + 'px';
body.appendChild(box);
boxes.push({
element: box,
x: Math.random() * window.innerWidth,
y: Math.random() * window.innerHeight,
vx: (Math.random() - 0.5) * 4, // x轴速度
vy: (Math.random() - 0.5) * 4 // y轴速度
});
}
}
function animate() {
boxes.forEach(b => {
b.x += b.vx;
b.y += b.vy;
// 边界反弹
if (b.x <= 0 || b.x >= window.innerWidth) b.vx *= -1;
if (b.y <= 0 || b.y >= window.innerHeight) b.vy *= -1;
b.element.style.left = b.x + 'px';
b.element.style.top = b.y + 'px';
});
requestAnimationFrame(animate);
}
createBoxes();
animate();
</script>
</body>
</html>
原理:这个例子创建了2000个会移动和反弹的小方块。requestAnimationFrame会在每一帧都更新所有方块的位置,并触发浏览器的重绘,持续消耗CPU资源。
示例3:终极卡顿——Canvas + 复杂计算
这是性能消耗最大的方式,结合了Canvas绘图和复杂的JavaScript计算。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">Canvas 复杂计算卡顿测试</title>
<style>
body { margin: 0; overflow: hidden; background: #000; }
canvas { display: block; }
</style>
</head>
<body>
<canvas id="myCanvas"></canvas>
<script>
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
// 设置Canvas尺寸为窗口大小
function resizeCanvas() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
}
resizeCanvas();
window.addEventListener('resize', resizeCanvas);
// 粒子类
class Particle {
constructor() {
this.x = Math.random() * canvas.width;
this.y = Math.random() * canvas.height;
this.size = Math.random() * 5 + 1;
this.speedX = Math.random() * 3 - 1.5;
this.speedY = Math.random() * 3 - 1.5;
}
update() {
this.x += this.speedX;
this.y += this.speedY;
if (this.x < 0 || this.x > canvas.width) this.speedX *= -1;
if (this.y < 0 || this.y > canvas.height) this.speedY *= -1;
}
draw() {
ctx.fillStyle = 'white';
ctx.beginPath();
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
ctx.fill();
}
}
// 创建大量粒子
const particlesArray = [];
const numberOfParticles = 5000; // 粒子数量
for (let i = 0; i < numberOfParticles; i++) {
particlesArray.push(new Particle());
}
// 动画循环
function animate() {
// 半透明黑色填充,实现拖尾效果
ctx.fillStyle = 'rgba(0, 0, 0, 0.05)';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// 更新和绘制每一个粒子
for (let i = 0; i < particlesArray.length; i++) {
particlesArray[i].update();
particlesArray[i].draw();
}
requestAnimationFrame(animate);
}
animate();
</script>
</body>
</html>
原理:

(图片来源网络,侵删)
- Canvas绘图:GPU需要处理5000个圆形的绘制。
- 复杂计算:每一帧都要更新5000个粒子的位置和速度,并进行边界检测。
- 拖尾效果:
ctx.fillStyle = 'rgba(0, 0, 0, 0.05)'和fillRect会产生一种半透明的覆盖层,让粒子移动时有轨迹,这本身也是一种持续的重绘操作。 - 这个例子对设备的GPU和CPU都是巨大的考验,是“卡iPhone”效果最显著的实现之一。
如何使用和部署
- 保存代码:将上面的任意一个示例代码复制到一个文本编辑器中。
- 保存为HTML文件:将文件另存为,
lag-test.html。 - 部署:
- 本地打开:直接用浏览器打开这个HTML文件即可。
- 在线部署:将
lag-test.html文件上传到任何支持静态文件托管的网站或服务上,- GitHub Pages (免费)
- Netlify (免费)
- Vercel (免费)
- 任何云存储服务(如阿里云OSS、腾讯云COS)并配置静态网站托管。
- 分享链接:部署后,你将得到一个公开的URL,将这个URL发送给想要“测试”的朋友,他们用手机或电脑浏览器打开后,页面就会开始卡顿。
免责声明与重要提示
- 仅供测试和娱乐:此代码严禁用于任何恶意攻击或破坏他人设备的行为,滥用可能导致设备过热、耗电加快,甚至在极端情况下导致应用或系统崩溃。
- 设备安全:长时间运行此类高负载脚本可能会导致设备CPU/GPU温度过高,有潜在风险,请勿在重要设备或数据未备份的设备上长时间运行。
- 浏览器会保护你:现代浏览器(如Safari, Chrome)有强大的进程管理和标签页隔离机制,如果一个标签页卡死,你通常可以关闭它而不会影响整个浏览器或其他标签页,iOS系统也会对后台进程进行严格的资源限制,所以它不太可能“永久”损坏你的设备,但会造成显著的性能下降和发热。
- 学习目的:理解这些原理有助于前端开发者写出高性能的网页,并学会如何避免写出这种“卡顿”的代码,真正的优化方向是减少不必要的重绘和重排,使用
will-change等属性提示浏览器,以及对于复杂动画优先使用transform和opacity。
希望这份详细的源码和解释对你有帮助!
