网站首页 > 技术文章 正文
一、背景介绍
看这篇文章:《视差特效的原理和实现方法》的时候,看到有一个很棒的动效。但只是PC端的效果,所以我就想在移动端实现类似的,为后续开发新需求的用户体验(炫技)做好沉淀。
二、前置调研
话不多说,直接开敲。本来打算创建一个 div 元素来进行调试,但在使用浏览器模拟移动设备时,我迅速遇到了一个问题:移动设备上根本没有鼠标可用!
thinking...
而且,桌面端依赖监听鼠标移动事件,在移动端被转变为触摸相关的事件,导致原本通过监听鼠标坐标的交互方式变成了通过用户触摸屏幕的方式交互。这显然与我们的预期不符
PC 能监听鼠标移动
移动端只能监听点击
其中,鼠标坐标的作用是用来实时更新倾/斜移动程度的。而我需要一种不同的方式来实时捕获用户的动作位置信息,思考再三,最终决定在移动端使用陀螺仪API:DeviceOrientationEvent平替。
点击跳转:MDN地址
三、陀螺仪介绍
一般来说,放手机上的是三轴陀螺仪,即可测量围绕手机的三个主轴(X、Y、Z)的旋转速率。
三个指标 alpha beta gamma 表示的是相对于坐标轴,设备在某个给定轴上的旋转量:
- alpha:表示设备沿 Z 轴旋转的角度,范围为 0~360
- beta:表示设备在x轴上的旋转角度,范围为-180~180。它描述的是设备「由后向前」旋转的情况
- gamma:表示设备在y轴上的旋转角度,范围为-90~90。它描述的是设备「由左向右」旋转的情况
注意: 将手机水平放置,底部对着自己,此时安卓和苹果 alpha 初始值不同。
初始值
操作系统 | Alpha | Beta | Gamma |
Android | 90(右转90度趋向0,左转增加) | 0(面向用户转增加,背向转减小) | 0(右转增加,左转减小) |
iOS | 0(右转从360减小,左转增加) | 0(面向用户转增加,背向转减小) | 0(右转增加,左转减小) |
四、代码实现
根据掘金文章理解动效实现原理,总共分以下几步:
- 写一个背景图容器,用background-image声明背景图 url;
- 再于容器里写一个角色图,给图片一个浮动效果;
- 通过声明鼠标监听事件拿到指针的 X、Y 坐标
- 利用这两个值,改变: transform 属性,可以倾斜元素 backgroundPosition 属性,可以平移元素
- 让背景图和角色图倾斜、移动的程度不同,营造视差样式,实现类裸眼 3D 效果;
前置阶段就不重复实现了,照着原文代码示例敲就OK,我这里写一下我的实现方法。
- 主要声明了一个陀螺仪Class、一个平滑方法Class。
- 通过设置监听方法,实时获取陀螺仪指标变化,更新state值。
- 最终触发更新角色图和背景图 CSS 逻辑。
最终效果
其中第三段代码主要声明了一个陀螺仪Class、一个平滑方法Class。实现逻辑就是通过监听陀螺仪指标变化实时更新state值,触发更新角色图和背景图 CSS 逻辑。可以把代码 copy 到本地调试着玩玩:github.com/Trade-Offf/…
五、遇到问题
01 | 陀螺仪数据拿不到
现代浏览器对敏感数据的访问越来越多地实施了限制,设备方向和运动传感器(如陀螺仪)属于敏感信息,因为它们可以透露用户设备的物理动作和朝向,所以需要在HTTPS环境下才能正确返回数据。
定位一:环境不对
由于现代浏览器的安全要求,许多设备传感器 API(包括陀螺仪)只能在安全的上下文中使用,这通常意味着页面必须通过 HTTPS 提供服务。当使用 HTTP 访问网站时,浏览器会阻止对陀螺仪 API 的访问。
解法: 使用 ngrok 提供临时的 HTTPS 隧道:
ngrok 是一个服务,它允许你将本地服务器暴露到公共互联网上的一个安全隧道。这可以用来快速地将 HTTP 服务器转换为可通过 HTTPS 访问的服务。这个方法可以帮助你在开发阶段绕过 HTTPS 校验,允许你在手机上测试陀螺仪特性。
- 进 ngrok 官网,注册个账号,用免费服务;
- 安装 ngrok:brew install ngrok/ngrok/ngrok
- 配置你的 authtoken:ngrok config add-authtoken xxxx(你的token)
- 运行 ngrok 以将本地端口 3000 转发到公共 HTTPS 地址:ngrok http 3000
- ngrok 会提供一个 HTTPS URL,如下图红色块就是你手机要访问的内容
定位二:iOS13+ 权限拦截
- iOS13+,需要用户主动唤起的授权,用户手动同意之后才能拿到陀螺仪的值(页面加载结束后,非主动请求不会唤起授权弹窗)
- 我后续又测试了安卓机型,不用授权直接就有数据(令人感慨,自由与风险往往并存)
解法: 兼容各种环境与情况,需要鉴权就发起请求
function testSupportGyro() {
return new Promise(() => {
if (
typeof DeviceOrientationEvent !== "undefined" &&
typeof DeviceOrientationEvent.requestPermission === "function"
) {
// iOS 13+ 设备需鉴权
DeviceOrientationEvent.requestPermission()
.then((permissionState) => {
// 如果用户同意,就可以监听陀螺仪数据
if (permissionState === "granted") {
window.addEventListener(
"deviceorientation",
handleOrientationEvent
);
} else {
// 用户不同意,无法使用陀螺仪
console.error("设备不支持访问陀螺仪");
}
})
.catch((error) => {
console.error(error);
});
} else {
// 安卓机型不需鉴权,直接监听
window.addEventListener("deviceorientation", handleOrientationEvent);
}
});
}
作者:狂炫冰美式
链接:https://juejin.cn/post/7326985988768743461
猜你喜欢
- 2024-11-19 【课程:study888up】郭隆邦WebGL/Three.js前端高薪3D可视化
- 2024-11-19 「Web前端开发进阶篇」CSS3 2D/3D转化
- 2024-11-19 五星级可视化页面(10):3D鸟瞰地图,这是上帝的视角。
- 2024-11-19 3分钟使用CSS从2D转化为3D效果
- 2024-11-19 3d地球放在可视化大屏C位,谁敢说格局不够、档次不高
- 2024-11-19 B端登陆页不卷3D氛围图,都感觉拿不上台面了。
- 2024-11-19 threejs3d学习笔记6
- 2024-11-19 农业收获机前端机构3D图纸 STEP格式
- 2024-11-19 这种大屏可以基于WebGL在网页上渲染3D图形吗?前端大哥如何想
- 2024-11-19 前端CSS-3D交互,跟随鼠标3D旋转
你 发表评论:
欢迎- 07-10Oracle 与 Google Cloud 携手大幅扩展多云服务
- 07-10分享收藏的 oracle 11.2.0.4各平台的下载地址
- 07-10Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
- 07-10Oracle Database@Azure 推进到南美等新区域并增加了新服务
- 07-10Oracle宣布推出 Oracle Database@AWS 的有限预览版
- 07-10Oracle与Nextcloud合作,推出主权云上的安全协作平台
- 07-10NodeRED魔改版连接MsSql、PostgreSQL、MySQL、OracleDB存储无忧
- 07-10对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 601℃几个Oracle空值处理函数 oracle处理null值的函数
- 593℃Oracle分析函数之Lag和Lead()使用
- 581℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 578℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 573℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 566℃【数据统计分析】详解Oracle分组函数之CUBE
- 552℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 547℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- Oracle 与 Google Cloud 携手大幅扩展多云服务
- 分享收藏的 oracle 11.2.0.4各平台的下载地址
- Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
- Oracle Database@Azure 推进到南美等新区域并增加了新服务
- Oracle宣布推出 Oracle Database@AWS 的有限预览版
- Oracle与Nextcloud合作,推出主权云上的安全协作平台
- NodeRED魔改版连接MsSql、PostgreSQL、MySQL、OracleDB存储无忧
- 对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 解读丨《归档文件整理规则》— 电子文件元数据存储
- Data Guard跳归档恢复的实践(dataguard failover)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (57)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)