### CSS Media Queries
通过媒体查询的方式我们根据横竖屏来适配不同的样式
1.内联样式
```css
@media screen and (orientation:portrait) {
//竖屏
}
@media screen and (orientation:landscape) {
//横屏
}
```
<!--more-->
2.外联样式
```css
<!-- 竖屏 -->
<link rel="stylesheet" media="all and (orientation:portrait)" href="..." />
<!-- 横屏 -->
<link rel="stylesheet" media="all and (orientation:landscape)" href="..." />
```
### window.matchMedia()
除此之外,[CSS Object Model(CSSOM)Views](https://www.w3.org/TR/cssom-view-1/#dom-window-matchmedia) 规范增加了对 JavaScript 操作 CSS Media Queries 的原生支持,它在 window 对象下增加了 matchMedia() 方法,让我们能够通过脚本的方式来实现媒体查询。
window.matchMedia() 方法接受一个 Media Queries 语句的字符串作为参数,返回一个 MediaQueryList 对象。该对象有 media 和 matches 两个属性:
* media:返回所查询的 Media Queries 语句字符串
* matches:返回一个布尔值,表示当前环境是否匹配查询语句
同时,它还包含了两个方法,用来监听事件:
* addListener(callback):绑定回调 callback 函数
* removeListener(callback):注销回调 callback 函数
那么,通过 window.matchMedia() 的方法,我们可以这样判断横竖屏:
```js
var mql = window.matchMedia("(orientation: portrait)");
function onMatchMeidaChange(mql){
if(mql.matches) {
// 竖屏
}else {
// 横屏
}
}
onMatchMeidaChange(mql);
mql.addListener(onMatchMeidaChange);
```
### window.innerHeight/window.innerWidth
在 CSS Media Queries 中,Orientation 属性有两个值:
* portrait,指的是当 height 大于等于 width 的情况
* landscape,指的是当 height 小于 width 的情况
所以,还有一种最为常见的方法是通过比较页面的宽高,当页面的高大于等于宽时则认为是竖屏,反之则为横屏。
```js
function detectOrient(){
if(window.innerHeight >= window.innerWidth) {
// 竖屏
}else {
// 横屏
}
}
detectOrient();
window.addEventListener('resize',detectOrient);
```
### window.orientation
在 iOS 平台以及大部分 Android 手机都有支持 `window.orientation` 这个属性,它返回一个与默认屏幕方向偏离的角度值:
* 0:代表此时是默认屏幕方向
* 90:代表顺时针偏离默认屏幕方向90度
* -90:代表逆时针偏离默认屏幕方向90度
* 180:代表偏离默认屏幕方向180度
```js
switch(window.orientation) {
case 0:
displayStr += "Portrait";
break;
case -90:
displayStr += "Landscape (right, screen turned clockwise)";
break;
case 90:
displayStr += "Landscape (left, screen turned counterclockwise)";
break;
case 180:
displayStr += "Portrait (upside-down portrait)";
break;
}
```
![例图](https://misc.aotu.io/Tingglelaoo/iPhone-orientation.png)
在实际应用中,对于 iPhone 和大部分 Android 是没有180度的手机竖屏翻转的情况的,但是 iPad 是存在的。所以,简化下代码,我们可以绑定orientationchange事件来判断横竖屏:
```js
function detectOrient(){
if (Math.abs(window.orientation) === 90) {
// 横屏
} else {
// 竖屏
}
}
detectOrient();
window.addEventListener('orientationchange',detectOrient);
```
### 影响判断的问题
* window.orientation属性值不一致(IOS相同,Android不一定一致哦)
* 软键盘的弹出(Android情况下,软件盘的弹出会引起页面的收缩)
### 最佳实现方式
假如屏幕分辨率固定值为:screen.width 和 screen.height(需要注意,这里很重要的一点是:在移动端,屏幕翻转时,screen.width 和 screen.height 的值依然是不变的)
* 若获取 当前页面的宽(document.documentElement.clientWidth),等于屏幕分辨率的宽(screen.width),则可认定当前属于竖屏。
* 若获取 当前页面的宽(document.documentElement.clientWidth),等于屏幕分辨率的高(screen.height),则可认定当前属于横屏。
```js
function detectOrient() {
var storage = localStorage;
var data = storage.getItem('J-recordOrientX');
var w = document.documentElement.clientWidth,
h = document.documentElement.clientHeight;
var _Width = 0,
_Height = 0;
if(!data) {
_Width = window.screen.width;
_Height = window.screen.height;
storage.setItem('J-recordOrientX',_Width + ',' + _Height);
}else {
var str = data.split(',');
_Width = str[0];
_Height = str[1];
}
if(w == _Width) {
// 竖屏
return;
}
if(w == _Height){
// 横屏
return;
}
}
detectOrient();
window.addEventListener('resize',detectOrient);
```
### 参考
- [凹凸实验室](https://aotu.io/notes/2017/01/31/detect-orientation/)
- [W3](https://www.w3.org/TR/screen-orientation/)
<p class="over">Over!</p>
- 前端
- C1-Javascript
- H5图片分块和断点续传
- JavascriptPatterns[Stoyanstefanov]
- macotask和microtask
- 前端代码生成器
- 跨域
- 页面回到顶部滚动按钮实现
- C2-CSS
- 浏览器的一些单位
- 盒模型
- 移动端判断横竖屏
- C3-框架
- ReactNative
- 开发环境搭建(安卓篇)
- Vue
- vue+pdfjs使用
- vue+typescript使用实践
- vue+webpack3.x集成typescript
- Vue源码3
- vue源码分析1
- vue源码分析2
- vue笔记
- C4-工具
- git
- Gitlab-CICD
- mock规则
- vscode-settings
- webpack自定义命令,切换代理地址
- 正则表达式
- 深入浅出webpack
- C5-Node
- express
- express源码阅读
- nightmare使用指南
- 爬虫1.0
- C6-微信
- 微信
- C7-Canvas
- 基础API
- 前端随笔笔记
- 后端
- C1-Java
- shiro
- C2-Linux
- ffmpeg
- ITerm
- Linux
- MongoDB安装
- MySql安装
- Ngnix反向代理
- 常见错误
- 备忘
- mac
- 备忘-Work
- 备忘Link
- 服务器资源
- 教程
- Hexo个人博客搭建笔录
- 文档
- CSS编码规范
- 前端编码规范
- 随笔
- 整理
- 正则
- 链接收藏
- 面试
- CodeWars题库
- CodeWars题库(二)
- Java社招面试题
- Java面试
- Web面试
- 前端笔试题
- 笔试题