你是否遇到过这样的情况:用户正在你的网页上看视频教程,或者用你的工具做演示,屏幕却突然暗了、甚至锁屏了?这不仅打断体验,还可能让人烦躁。好在,现代浏览器提供了一个实用的功能:Wake Lock api。它能让开发者用 JavaScript 告诉设备:“这个页面很重要,请保持屏幕亮着!”
简单说,这个 API 就是阻止屏幕自动变暗或锁屏的开关。它特别适合需要用户持续关注屏幕的场景:
看视频或直播: 用户专心看球赛直播或电影,不希望屏幕熄灭。
演示或阅读: 做幻灯片展示、阅读长篇文章或电子书时。
导航或健身: 使用网页版导航应用,或者跟着健身教程运动。
实时数据监控: 显示股票行情、服务器状态等需要持续刷新的信息。
游戏: 一些基于浏览器的游戏需要用户持续操作或观看。
在你急着用之前,有几件事必须知道:
HTTPS 是必须的: 这个 API 只对通过 HTTPS 安全连接加载的网页有效。本地开发环境 (http://localhost) 通常也可以使用。
浏览器支持度: 主流浏览器的新版本基本都支持了,但旧版本不行。具体支持情况如下(截至 2024 年中):
核心步骤是:请求一个“屏幕唤醒锁”,需要时释放它,并处理好页面状态变化。下面是详细做法:
你需要使用 navigator.wakeLock.request('screen') 这个方法。它会返回一个 Promise(异步操作结果),所以我们通常用 async/await 或 .then/.catch 来处理。
let screenLock = null; // 用于保存唤醒锁对象
async function requestWakeLock() {
try {
// 1. 检查浏览器是否支持 Wake Lock API
if ('wakeLock' in navigator) {
// 2. 请求屏幕唤醒锁
screenLock = await navigator.wakeLock.request('screen');
console.log('屏幕唤醒锁已激活!屏幕不会自动熄灭了。');
// 3. 监听释放事件(可选,了解锁何时失效)
screenLock.addEventListener('release', () => {
console.log('屏幕唤醒锁已被释放');
});
} else {
console.warn('抱歉,你的浏览器不支持屏幕唤醒锁功能。');
// 这里可以给用户一个提示,比如显示一个消息或备用方案(如提醒用户手动设置设备常亮)
}
} catch (err) {
// 4. 处理请求失败
console.error('获取屏幕唤醒锁失败:', err);
// 失败原因可能是:电量过低、省电模式开启、用户拒绝权限(部分设备可能需要)、标签页不可见等。
}
}
// 在需要保持屏幕常亮时调用这个函数,例如播放视频按钮点击后
requestWakeLock();
关键点解释:
try...catch 很重要: 请求可能会因为各种原因失败(设备电量低、开了省电模式、标签页被切到后台等)。用 try...catch 能捕获错误,避免程序崩溃,也方便调试或提示用户。
权限: Wake Lock API 通常不需要用户明确点击授权(不像摄像头麦克风)。但系统可能会基于电量、省电模式或标签页可见性自动拒绝请求,这本质上是设备层面的权限控制。
保存 screenLock 对象: 你需要把这个对象存起来(如 screenLock 变量),后面释放锁时要用到它。
当你的应用不再需要屏幕常亮时(比如视频暂停或播放结束),应该主动释放锁,节省设备电量。这很关键!
function releaseWakeLock() {
if (screenLock !== null && screenLock.released === false) {
screenLock.release()
.then(() => {
screenLock = null;
console.log('屏幕唤醒锁已手动释放');
});
}
}
// 在需要让屏幕可以自动熄灭时调用这个函数,例如暂停视频
releaseWakeLock();
浏览器有个重要规则:当用户切换标签页、最小化浏览器窗口或锁屏时,当前页面的唤醒锁会被自动释放。 这是为了省电。当用户再次切回这个页面时,屏幕又会恢复自动熄灭。
如果你希望用户一回来,屏幕又自动保持常亮(比如看视频时切出去查个消息再回来),你需要监听页面的可见性变化事件 (visibilitychange),并在页面重新可见时重新请求唤醒锁。
// 监听页面可见性变化
document.addEventListener('visibilitychange', async () => {
// 当页面重新变得可见(用户切换回标签页)且我们之前持有锁(或需要锁)时
if (document.visibilityState === 'visible' && screenLock === null) {
await requestWakeLock(); // 再次调用我们之前写的请求锁函数
}
// 注意:当页面隐藏时,锁会被浏览器自动释放,我们不需要手动释放,但可以把 screenLock 设为 null 标记一下(在 release 事件或这里处理)
});
假设一个简单的视频播放页面:
const videoPlayer = document.getElementById('myVideo');
let screenLock = null;
async function requestWakeLock() {
try {
if ('wakeLock' in navigator) {
screenLock = await navigator.wakeLock.request('screen');
console.log('屏幕常亮开启');
}
} catch (err) {
console.error('保持屏幕常亮失败:', err);
alert('无法保持屏幕常亮:' + err.message); // 简单提示用户
}
}
function releaseWakeLock() {
if (screenLock !== null) {
screenLock.release().then(() => {
screenLock = null;
console.log('屏幕常亮已关闭');
});
}
}
// 播放视频时请求锁
videoPlayer.addEventListener('play', requestWakeLock);
// 暂停或结束视频时释放锁
videoPlayer.addEventListener('pause', releaseWakeLock);
videoPlayer.addEventListener('ended', releaseWakeLock);
// 处理用户切换标签页后返回的情况
document.addEventListener('visibilitychange', async () => {
if (document.visibilityState === 'visible' && !videoPlayer.paused && screenLock === null) {
// 页面可见、视频在播放中、且当前没有锁,就重新请求
await requestWakeLock();
}
});
检查兼容性: 使用前先判断 'wakeLock' in navigator。
务必用 HTTPS: 本地开发可用 localhost。
始终处理错误 (try...catch): 请求可能因电量、省电模式或页面不可见而失败。
及时释放锁 (release()): 不需要时主动释放,省电是美德。
处理页面可见性 (visibilitychange): 用户切回页面时,如果需要,记得重新请求锁。
用户告知: 对于需要长时间常亮的应用(如导航),考虑告知用户设备可能耗电稍快。
优雅降级: 对于不支持的浏览器,可以提示用户“请确保设备未设置自动锁屏”作为备用方案。
使用 JavaScript 的 Wake Lock API 可以显著提升用户在特定网页上的体验,避免不必要的屏幕熄灭干扰。遵循上面的指南和代码示例,你就能轻松实现这个功能。记住,合理使用,及时释放,善待用户设备的电量!
这篇文章介绍了JS和jquery获取各种屏幕的宽度和高度的代码,有需要的朋友可以参考一下:网页可见区域宽: document.body.clientWidth,网页可见区域高: document.body.clientHeight
假设目标元素:#element,该元素相对于文档顶部的偏移距离,获取该元素的高度.那应该如何确定元素在可见区域内呢?假设当元素的上边框刚好出现在浏览器的底部时(零界点)
家有时候有需求在屏幕方向改变的时候重新执行某个渲染函数,以获取方向改变后的实际宽高,但是首次加载的执行函数要在其他地方执行,这时候可以加一个flag的状态值,默认为false
有些时候我们玩手机更喜欢使用手势滑动带来的用户操作体验。Vue touch directive是一个用于移动设备操作指令的轻量级的VUE组件。使用它可以轻松实现屏幕触控、滑动触发事件,提高用户体验
这在家办公也不让闲着点。虽然说需求提出来了,但是我们身为一个前端er,还是要有自己的想法呀,我们要统计一波数据看看到底有多少人在横屏使用我们的产品。
在开发中可能有遇到过屏幕录制的需求,无论是教学、演示还是游戏录制,都需要通过屏幕录制来记录和分享内容。一般在App内H5页基于客户端能力实现的较多,现在浏览器中的 MediaRecorder 也提供了这种能力
getBoundingClientRect会受到transform的影响。比如你的元素设置了transform:scale(2), 那么getBoundingClientRect返回的width会是元素实际宽度的2倍,top等位置信息也会因为元素尺寸变化而发生变化.
在前一阶段的工作中,突然接到了这个需求:手写签批的页面在移动端竖屏时强制页面横屏展示进行签字,一开始我觉着只要将页面使用 CSS3 的 transform 进行 rotate 一下就可以了
JavaScript 中的一些新功能非常值得期待,唤醒锁定 API 就是其中之一。它允许我们与主机系统进行交互,可以帮助开发人员使用 JavaScript 指示操作系统保持屏幕唤醒状态!
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!