Vue如何实现手机横屏效果

css横竖屏

有时候一些页面希望在手机上可以实现横屏的效果,比如播放页面,这样我们创建如下的css

css 复制代码
.mobile-landscape-container {
  @media screen and (orientation: portrait) {
    position: absolute;
    width: 100vh;
    height: 100vw;
    top: 0;
    left: 100vw;
    -webkit-transform: rotate(90deg);
    -moz-transform: rotate(90deg);
    -ms-transform: rotate(90deg);
    transform: rotate(90deg);
    transform-origin: 0% 0%;
  }

  @media screen and (orientation: landscape) {
    position: absolute;
    top: 0;
    left: 0;
    width: 100vw;
    height: 100vh;
  }
}

然后为该页面使用该css即可,这样在手机上浏览会发现页面处于横屏效果,而且即使开启了自动转屏,转屏后依然保持着横屏效果。

注意使用这个样式后,内部的组件就不能使用vw和vh了,因为这两个属性被颠倒了,如果继续使用会导致页面结构错误

但是有一个问题,就是如果将pc端浏览器缩小到高比宽大的情况下,页面同样会切换,效果不太好。所以可以判断是否是手机,只在移动端设置该样式。

有两种方式可以实现:

  • 通过vue的:class来判断是否是手机,然后再添加该样式即可。
  • 通过css的max-device-widthmax-device-height来判断。

css判断移动端

max-device-widthmax-device-heightmax-widthmax-height,它们不受窗口大小的影响,就是设备屏幕的宽高,是固定值。而pc端分辨率起点是800x600,目前移动端的浏览器分辨率都不会超过这个值。

注意移动端的屏幕分辨率和浏览器分辨率是不一样的,浏览器分辨率要小很多,因为目前手机的像素密度都大于1

所以我们可以通过max-device-widthmax-device-height来判断是否是手机端,比如:

css 复制代码
/*定义竖屏 css*/
@media screen and (orientation:portrait) and (max-device-width:600px) and (max-device-height:800px) {
 
}
/*定义横屏 css*/
@media screen and (orientation:landscape) and (max-device-width:800px) and (max-device-height:600px) {

这样我们为上面的样式加上max-device-widthmax-device-height就可以使它只在移动端生效,不影响pc端。

html5横屏

通过上面的方法实现强制横屏效果,但是注意手机其实还是竖屏的状态,这时候如果有输入交互,那么键盘还是竖屏的。。。所以这仅仅适用于没有键盘交互的页面,比如视频播放页面。

那么有没有什么办法可以让浏览器自己进入横屏状态(就像APP中那样),html5提供了一个API:

csharp 复制代码
window.screen.orientation.lock("landscape-primary");

但是注意这个api必须在全屏状态下才有效,也就是说需要在document.documentElement.requestFullscreen();screenfull.toggle()后执行lock函数。

同时因为全屏需要有用户交互,所以最佳的方式就是一个全屏按钮,点击的时候全屏再切换横屏即可。这样键盘也是横屏状态下的键盘了。

但是注意:

  • requestFullscreen在iOS上无效(screenfull也一样),所以screen.orientation.lock在iOS上也没有效果
  • 虽然requestFullscreen在微信内置浏览器中有效,但是screen.orientation.lock无效,也就是说能全屏但是无法横屏。
相关推荐
光影少年1 天前
react批量更新、同步/异步更新场景
前端·react.js·掘金·金石计划
光影少年2 天前
React 合成事件机制、和原生事件区别、事件冒泡阻止
前端·react.js·掘金·金石计划
秃头网友小李2 天前
前端难点:keep-alive 缓存什么?RouterView 的 key 为什么要带 scopeId?
前端·vue.js
徐小夕2 天前
JitWord 3.0 正式发布,高精度Word异构解析+复杂组件兼容,打造web端协同Word编辑器
前端·vue.js·算法
奋斗吧程序媛3 天前
补充一个小知识点:有关@click.native
前端·vue.js
英勇无比的消炎药3 天前
一行命令背后:TinyRobot CLI 如何重构 AI 对话接入的效率范式
vue.js·aigc
jay神3 天前
基于 FastAPI + Vue 的宠物领养管理系统
前端·vue.js·python·毕业设计·fastapi·宠物
一杯奶茶¥3 天前
水果销售网站 CRM客户信息管理系统 超市管理系 酒店管理系统 健身房管理系统 在线音乐网站 校园招聘系统
java·vue.js·spring boot·mysql·spring·java项目
英勇无比的消炎药3 天前
一站式搞定品牌风格:TinyRobot 主题定制从入门到精通
vue.js
光影少年3 天前
react 原理与进阶
前端·react.js·掘金·金石计划