横竖屏检测orientation resize matchMedia

简介: 最近有人提需求,产品要适配横竖屏,这就令人头秃了呀。这在家办公也不让闲着点。虽然说需求提出来了,但是我们身为一个前端er,还是要有自己的想法呀,我们要统计一波数据看看到底有多少人在横屏使用我们的产品。demo测试地址

方案一:orientation


window.addEventListener("orientationchange", function(event) {
    // 等于0或者180竖屏
    // 等于90或者-90度横屏
    _this.eventValue = event.orientation || 
        (screen.orientation && screen.orientation.angle)
}, false);


  1. 通过 orientationchange 事件来监听横竖屏的变化


  1. 通过 orientation 来获取当前屏幕的方向角度


  1. 兼容性比较差,https://www.caniuse.com/#sear...


方案二:resize判断宽高



基于上个方案的兼容性,那么我们搞个兼容性好一点的。


window.addEventListener("resize", function(event) {
    _this.innerWidth = window.innerWidth
    _this.innerHeight = window.innerHeight
}, false);


  1. 通过 resize 事件来监听浏览器的宽高变化


  1. 通过比对宽高来判断当前横竖屏状态。


  1. 因为是移动端,所以键盘弹出的时候也会干扰。


  1. 兼容性当然是棒棒的。


方案三:matchMedia 媒体查询



matchMedia 是什么?


matchMedia() 可以解析任何一个 CSS @media 的特性,如 min-height, min-width, orientation 等。


matchMedia() 返回一个新的 MediaQueryList 对象,表示指定的媒体查询字符串解析后的结果。


MediaQueryList 对象有以下两个属性:

  • media:当前查询的内容,也就是你传入的内容。
  • matches:检测查询结果,如果匹配,则值为 true,否则为 false


如何使用


var mediaQueryList = window
    .matchMedia("screen and (orientation: portrait)");
if(window.mediaQueryList && mediaQueryList.addListener){
    mediaQueryList.addListener(function(){
        _this.matchMediaAddEvent = 
            mediaQueryList.matches?'竖屏':'横屏'
    })
}


方案四:媒体查询



看到这个方案你是不是满头问号。这个方案和上个不一样吗?

哈哈,这个方案是我在网上看到的,有可能是那个人不知道 matchMedia 这个 API


或者是 API 有兼容性问题,他自己搞了一个 hack 方法。

原理也是依赖css的媒体查询。只不过他通过定时比对样式来判断当前状态。

相关文章
|
5月前
|
安全 Unix Linux
Docker中授权普通用户使用docker命令以及解决无权限访问/var/run/docker.sock错误。
通过上述步骤,可以有效解决普通用户无法使用Docker命令的问题,同时处理 `/var/run/docker.sock`权限错误。这样的设置不仅方便用户使用Docker提供的各项服务,同时还能保护系统的安全性。在进行此类配置更改时,请确保理解每一步骤的作用及潜在的安全风险,尤其是在修改文件权限时。在实际的操作中,始终应该努力保持系统的最低必要权限,避免过度放宽权限,这是保障系统安全的一个重要方针。
1490 75
|
SQL 人工智能 Cloud Native
数据库技术全攻略:基础、应用与未来趋势
一、引言 在当今数据驱动的时代,数据库技术成为了企业和个人不可或缺的工具
|
供应链 监控 调度
ERP系统中的销售订单管理与订单跟踪解析
【7月更文挑战第25天】 ERP系统中的销售订单管理与订单跟踪解析
1394 2
|
JavaScript 中间件 应用服务中间件
使用云服务器搭建微信公众号后台服务
使用云服务器搭建微信公众号后台服务
解决ERROR in Conflict: Multiple assets emit different content to the same filename index.html 的问题
解决ERROR in Conflict: Multiple assets emit different content to the same filename index.html 的问题
1687 0
|
机器学习/深度学习 TensorFlow 语音技术
Convolutional Neural Network,简称 CNN
卷积神经网络(Convolutional Neural Network,简称 CNN)是一种深度学习模型,主要用于图像识别、物体检测、语音识别等任务。CNN 通过局部感知、权值共享和下采样等操作,能够有效地提取图像特征,从而实现对图像的分类和识别。
713 4
|
Java 关系型数据库 数据库连接
探索Java中的MyBatis Plus注解 @DbType:灵活处理数据库类型
在数据库操作中,不同的数据库系统可能具有不同的数据类型,如MySQL、Oracle、SQL Server等,这就需要我们在操作中处理不同的数据库类型。MyBatis Plus作为一款强大的ORM框架,提供了注解 `@DbType`,使得开发者能够更加灵活地处理数据库类型,从而在多数据库支持下轻松切换。本文将详细介绍 `@DbType` 注解的用法及其在持久层开发中的应用。
2308 1
|
Ubuntu Linux Windows
ubuntu16.04安装MATLAB R2017b步骤详解(附完整文件包)
ubuntu16.04安装MATLAB R2017b步骤详解(附完整文件包)
996 0
ubuntu16.04安装MATLAB R2017b步骤详解(附完整文件包)
|
机器学习/深度学习 自然语言处理 算法
EasyCV开源|开箱即用的视觉自监督+Transformer算法库
EasyCV背后的算法框架如何设计?开发者可以怎么使用?未来有哪些规划?今天一起来深入了解。
EasyCV开源|开箱即用的视觉自监督+Transformer算法库
|
前端开发 Java 物联网
GIAC-2022sh 学习笔记 | WebAssembly在前端中的应用与展望
GIAC-2022sh 学习笔记 | WebAssembly在前端中的应用与展望
543 0
GIAC-2022sh 学习笔记 | WebAssembly在前端中的应用与展望