很多人晚上明明说“我困了要睡了”,但身体却还在手机上疯狂滑动,时间一晃就是两小时。本篇文章就来聊聊,怎么通过前端技术手段,判断用户是否“真的睡着了”,并设计一个可以实时记录、反馈和干预的睡眠追踪页。核心思路是结合浏览器行为、交互操作和设备状态来模拟“睡眠感知”,最终形成一个完整的小工具页面。
传统的睡眠监测需要硬件设备,比如手环、传感器这些。但很多时候我们只是想知道:我到底几点真正“断电”的?有没有可能用纯软件的方法,基于浏览器,判断用户是否还在“刷”,然后结合睡前情绪、干预建议,形成一个“轻量级的数字睡眠助手”?
我们就试着从这个方向出发,构建一个叫“你真的睡着了吗?”的睡眠追踪页。
我们主要结合以下三个维度做判断:
用这些行为判断用户是不是已经放下手机,进入了非活跃状态。
我们用 Vue 3 + Composition API 来实现主要模块,前端即可实现,后续也可以拓展为 PWA 离线小工具。
<template>
<div>
<h2>你真的睡着了吗?</h2>
<textarea v-model="sleepNote" placeholder="睡前想说点啥..." rows="3"></textarea>
<div class="status">
<p>最近一次交互时间:{{ lastActiveTimeStr }}</p>
<p v-if="isSleeping">🛌 检测到你可能已经入睡</p>
<p v-else>😐 你还醒着呢</p>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue'
const sleepNote = ref('')
const lastActiveTime = ref(new Date())
const isSleeping = ref(false)
const IDLE_THRESHOLD_MINUTES = 5
const updateActivity = () => {
lastActiveTime.value = new Date()
isSleeping.value = false
}
const checkSleepStatus = () => {
const now = new Date()
const diffMs = now - lastActiveTime.value
if (diffMs > IDLE_THRESHOLD_MINUTES * 60 * 1000) {
isSleeping.value = true
}
}
const lastActiveTimeStr = computed(() =>
lastActiveTime.value.toLocaleTimeString()
)
onMounted(() => {
document.addEventListener('mousemove', updateActivity)
document.addEventListener('keydown', updateActivity)
document.addEventListener('touchstart', updateActivity)
window.addEventListener('focus', updateActivity)
setInterval(checkSleepStatus, 30000) // 每30秒检查一次
})
onUnmounted(() => {
document.removeEventListener('mousemove', updateActivity)
document.removeEventListener('keydown', updateActivity)
document.removeEventListener('touchstart', updateActivity)
window.removeEventListener('focus', updateActivity)
})
</script>
<style scoped>
.status {
margin-top: 1rem;
font-size: 1.1rem;
}
</style>
<div v-if="!isSleeping">
<p>睡前放松建议:</p>
<ul>
<li>关掉蓝光屏</li>
<li>听个轻音乐</li>
<li>避免再刷短视频</li>
</ul>
</div>
可以配合随机内容推荐或 API 接入冥想/音乐。
我们可以将交互日志记录到 localStorage
,次日展示如下数据:
这部分可以配合图表库(如 Chart.js)扩展,也可以用 canvas 简单渲染。
A: 我们可以增加“页面焦点变化”(window.blur / focus)和“音频播放状态检测”逻辑,例如监听 HTML5 audio/video 标签的 play
状态,辅助判断。
A: 完全可以,用 Vue + Capacitor 打包成 App;还可以通过 Screen Wake Lock API
判断用户是否主动保持唤醒。
A: 使用 localStorage
存储 lastActiveTime
和 isSleeping
的时间戳,当第二天打开页面时回读并展示。
这个项目其实是一个很贴近日常的小工具,用纯前端技术、结合用户行为,去“模拟判断”一个人的睡眠状态。没有复杂的生理信号采集器,也不需要设备授权,只靠交互+时间线+页面状态就能初步分析是否入睡。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。