返回赛题列表
DOM 空间重力场
挑战鼠标拖拽(或调整设备方向)倾斜整个网页,所有 DOM 元素受"重力"偏转挤压、堆叠,重力过大时甚至掉出屏幕。
规则说明▼
模型需要生成一个单文件 HTML(内联 CSS + JS,可以使用 CDN 引入物理库)。
页面初始状态是一个普通的网页内容(标题 / 段落 / 图片占位 / 按钮 / 表单 / 卡片若干),看起来就是一个正常排版的展示页。
然后通过用户的鼠标拖拽(桌面端)或设备方向感应 DeviceOrientation API(移动端)来"倾斜"页面——倾斜后整个页面里的 DOM 元素会受到一个与倾斜方向一致的重力作用。
Phase 1 给出较为简洁的概念描述;Phase 2 给出详细的物理参数、视觉细节和边界场景。
Prompt▼
phase1:▼
做一个单文件 HTML 作品:**DOM 空间重力场(DOM Gravity Field)**。
页面正常排版几段文字、几个按钮、几张卡片。但加入一个特殊机制:**用户用鼠标拖拽页面背景就能倾斜整个网页**(在移动设备上则用陀螺仪 / DeviceOrientation 检测倾斜)。
倾斜的瞬间,页面里所有的 DOM 元素都会受到对应方向的"**重力**"——它们会偏转、滑动、向"低处"挤压堆叠。如果倾斜得足够厉害,那些没有被钉死的元素甚至会"**掉出屏幕**"。
把"打破文档流"做成一个真的能玩的物理玩具。
可以使用外部 CDN 资源(动效库、物理库均可),但是禁止使用外部图片。
直接输出完整可运行的单文件 HTML。
phase2:▼
做一个单文件 HTML 作品:**DOM 空间重力场(DOM Gravity Field)**。
页面初始状态是一个**普通的网页内容**——一份"正常的"信息页(如产品介绍页 / 个人简介 / 文章页),包含至少:
- 1 个大标题
- 2-3 段正文段落
- 4-6 个互不相关的卡片 / 按钮 / 标签
- 1 个表单输入框
- 几个图标 / emoji 装饰
整体看起来就像一个"普通的网页",访问页面的瞬间用户应该认为这只是一份排版页。
要求如下:
````
### 倾斜操作
- **桌面端**:用户在页面背景按住鼠标拖拽,可以让整个页面"倾斜"(类似把一块板子提起一个角)
- 拖拽方向 = 重力方向
- 拖得越远 = 重力越大
- 松开后页面缓慢回到水平
- **移动端**:自动接入 `DeviceOrientationEvent`(需要适当处理 iOS 13+ 的权限请求)。设备前后左右倾斜对应不同的重力方向
### 物理效果
- 元素受重力作用会**沿斜面滑动 / 堆叠**——类似一堆水果掉在倾斜的桌面上
- 元素之间应当有**碰撞**——不能直接互相穿透
- 元素掉到屏幕边缘后会被"边框"挡住或**掉出屏幕**(由你设计)
- 不同元素可以有不同的"质量"——按钮重一些、标签轻一些;标题可以"钉"在原位不参与物理(这给页面留一个锚点)
- 重力消失(用户松开 / 设备回正)后,元素会**缓慢回到原始排版位置**(带过渡动画)
### 视觉与交互细节
- 倾斜过程中页面整体的视觉应该有**视差立体感**——可以用 `transform: rotateX/Y/Z` 让页面真的倾斜,元素受到的"重力"是相对于页面斜面的
- 物理效果的阻尼 / 弹性 / 摩擦力都要调到"看起来真"——元素不应该飘飘忽忽,也不应该硬邦邦
- 推荐使用 **Matter.js**(CDN 引入)做 2D 物理模拟,把每个 DOM 元素映射成 Matter body
- 物理结束后元素的位置 / 旋转过渡到"原始位置"要平滑,不要瞬切
### 技术约束
- 输出一个完整可运行的单文件 HTML,所有的 CSS 和 JS 内联
- 可以使用 CDN 引入物理库(例如 Matter.js)和动效库
- 禁止使用外部图片
- 简体中文界面
- 同时适配桌面和移动端,两端的"倾斜"方式不同但效果一致
````