用Image/fetch显式加载资源并实时更新进度条,CSS用transform:scaleX()实现硬件加速动画,全屏用100dvh兼容移动端,资源就绪后调用initGame()而非跳转页面,并引导首次触摸解锁音频。

怎么用纯 HTML/CSS/JS 实现一个带进度条的启动页
不能只靠 <img alt="HTML怎么做游戏启动页_html游戏启动loading页面【附代码】" > 和 setTimeout 模拟加载——真实游戏启动页需要反映资源实际加载状态。核心是监听资源加载完成,再驱动 UI 变化。
常见错误是把「视觉 loading 动画」和「真实资源加载」混为一谈:比如用 setInterval 硬推进度到 100%,但资源其实还没 ready,一进游戏就报 Failed to load texture.png。
- 必须用
Image对象或fetch()显式加载关键资源(如主图、音效、JSON 配置) - 每成功加载一个,手动更新进度值,再调用
updateProgress(value)刷新 DOM - 所有资源加载完毕前,保持
body隐藏或加pointer-events: none防止误点 - 建议把资源列表写成数组,避免硬编码顺序;失败时记录
console.warn('missing:', url)而不是静默跳过
为什么 CSS 动画进度条比 JS 改 width 更可靠
用 style.width = '65%' 在低性能设备上可能卡顿、跳变,尤其在 iOS Safari 下重绘不及时。CSS 的 transform: scaleX() + transition 是硬件加速的,更顺滑。
示例结构:
立即学习“前端免费学习笔记(深入)”;
<div class="loading-bar"> <div class="loading-fill"></div> </div>
CSS 关键部分:
.loading-fill {
transform-origin: left center;
transition: transform 300ms ease-out;
}
/* JS 中只需改这一行 */
document.querySelector('.loading-fill').style.transform = 'scaleX(0.72)';- 别用
width+overflow: hidden,缩放更稳定 - 加
will-change: transform提前提示浏览器优化 - 过渡时间设成 300–400ms,太快显得毛躁,太慢拖节奏
如何让启动页撑满全屏又不触发滚动条
常见问题是加了 height: 100vh 后,iOS Safari 因地址栏缩放导致实际可视区变化,出现空白或滚动条。根本解法是用 min-height: 100dvh(dynamic viewport height)。
-
dvh是现代标准,Chrome 105+、Safari 16.4+、Firefox 110+ 均支持;旧版 fallback 用100vh - 必须同时设
html, body { margin: 0; padding: 0; height: 100%; },否则100dvh失效 - 禁止在启动页内任何元素设
height: 100%或flex: 1,容易引发嵌套计算偏差 - 背景图用
background-size: cover+background-position: center,避免拉伸变形
资源加载完成后怎么安全跳转到游戏主逻辑
不是简单地 document.body.innerHTML = '' 或 location.href = 'game.html'。真实场景中,游戏代码往往依赖已加载的全局对象(如 window.RES 图片池、window.AUDIO_CTX 音频上下文)。
- 加载完立刻执行
initGame()函数,而不是跳新页面——单页结构更可控 - 确保
initGame()在 DOM 加载完成且所有资源就绪后才调用,可用Promise.all(loadPromises)统一守门 - 移除启动页 DOM 前,先清空定时器、取消未完成的
fetch,防止内存泄漏 - 如果游戏用 Canvas,务必等
canvas.width/height设置完毕、ctx.imageSmoothingEnabled = false配置好再开始渲染帧
最易被忽略的一点:移动端首次触摸事件(touchstart)才能解锁音频播放,所以启动页结束前最好引导用户轻点一下屏幕,否则进游戏点按钮没声音。



















