如何实现类似YouTube的可适配屏幕尺寸与主题的预加载器
YouTube风格自适应预加载器实现说明
这类预加载器叫做骨架屏(Skeleton Screen,也叫内容占位加载器),不需要使用图片实现,绝大多数场景下都可以通过纯HTML+CSS实现,仅需极少量JS做动态适配即可。
核心自适应能力实现逻辑
- 屏幕尺寸适配:骨架屏的布局和尺寸完全使用响应式CSS规则实现,比如用百分比、vw/rem等相对单位定义占位块的宽高,配合媒体查询适配不同屏幕断点下的布局,完全可以做到和实际页面内容结构的自适应逻辑对齐。
- 深浅主题自动适配:可以通过CSS的
prefers-color-scheme媒体查询自动匹配系统主题,也可以配合站点的主题切换JS逻辑修改CSS变量值,就能实时切换骨架屏的背景色、动效色,不需要做多套图片资源。
可直接复用的实现示例
你已有的预加载器隐藏逻辑不需要修改,只需新增骨架屏的HTML结构和CSS样式即可:
HTML结构(放入你的#preloader容器内)
<div id="preloader"> <!-- 顶部导航占位 --> <div class="skeleton-nav"></div> <!-- 视频内容区占位 --> <div class="skeleton-video"></div> <!-- 下方信息区占位 --> <div class="skeleton-info"> <div class="skeleton-line short"></div> <div class="skeleton-line"></div> <div class="skeleton-line half"></div> </div> </div>
CSS样式(包含响应式和主题适配逻辑)
/* 基础变量定义 */ :root { --skeleton-bg: #f2f2f2; --skeleton-shine: #e6e6e6; } /* 深色主题适配 */ @media (prefers-color-scheme: dark) { :root { --skeleton-bg: #282828; --skeleton-shine: #383838; } } #preloader { position: fixed; top: 0; left: 0; width: 100%; height: 100vh; background: #fff; z-index: 9999; overflow: hidden; padding: 20px; box-sizing: border-box; } /* 深色模式下预加载器背景适配 */ @media (prefers-color-scheme: dark) { #preloader { background: #0f0f0f; } } /* 骨架块通用样式 + 闪动动效 */ .skeleton-nav, .skeleton-video, .skeleton-line { background: linear-gradient(90deg, var(--skeleton-bg) 25%, var(--skeleton-shine) 50%, var(--skeleton-bg) 75%); background-size: 200% 100%; animation: skeleton-shine 1.5s infinite linear; border-radius: 4px; margin-bottom: 16px; } @keyframes skeleton-shine { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } /* 响应式尺寸定义 */ .skeleton-nav { height: 40px; width: 100%; } .skeleton-video { aspect-ratio: 16/9; width: 100%; max-width: 1200px; margin: 20px auto; } .skeleton-line { height: 16px; width: 100%; } .skeleton-line.short { width: 60%; } .skeleton-line.half { width: 40%; } /* 小屏幕适配 */ @media (max-width: 768px) { .skeleton-video { margin: 12px 0; } .skeleton-line { height: 14px; } }
如果你的站点有手动切换主题的功能,只需要在主题切换的JS逻辑里同步修改:root下的--skeleton-bg和--skeleton-shine两个变量值即可实现预加载器主题同步切换。
内容的提问来源于stack exchange,提问作者Amal nandan
相关产品推荐
相关产品推荐

