首页 > 其他分享 >Vue实现手机横屏效果

Vue实现手机横屏效果

时间:2023-11-04 10:37:59浏览次数:56  
标签:Vue max screen height width 横屏 device 手机

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*/
@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:

window.screen.orientation.lock("landscape-primary");

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

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

注意:

  • requestFullscreen在iOS上无效(screenfull也一样),所以screen.orientation.lock在iOS上也没有效果
  • 虽然requestFullscreen在微信内置浏览器中有效,但是screen.orientation.lock无效,也就是说能全屏但是无法横屏。


标签:Vue,max,screen,height,width,横屏,device,手机
From: https://blog.51cto.com/u_14914383/8178054

相关文章

  • vue3路由转发报错Failed to resolve component: router-link
     //在学习vue3路由转发的时候,总是报路由的一些方法无法识别,undefined报错://App.vue:9[Vuewarn]:Failedtoresolvecomponent:router-link//vue路由跳转报错Cannotreadpropertiesofundefined(reading'push')原因:出在你挂载的位置这个路由的u......
  • vue select-option组件 普通下拉和远程下拉数据展示及回显
    前言:后台返回的数据格式有如下两种类型:1、json格式:codeTypeMap:{  "000":"身份证",  "001":"户口本"}2、数组格式:codeTypeMapList:[  {code:"000",name:"身份证"},  {code:"000",name:"户口本"}] 一、普......
  • Vue源码学习(十四):diff算法patch比对
    好家伙,本篇将会解释要以下效果的实现 1.目标我们要实现以下元素替换的效果gif: 以上例子的代码://创建vnodeletvm1=newVue({data:{name:'张三'}})letrender1=compileToFunction(`<a>{{name}}</a>`)letvnode1=render1.call(vm1)doc......
  • vue 上传照片插件
    Vue是一种流行的JavaScript框架,拥有轻量级、直观且易于学习的特点,并提供丰富的插件集合。其中,上传照片插件是Vue的常用插件之一。上传照片插件能够快速地将照片上传到服务器,支持多图上传、拍照上传和拖拽上传等功能。此外,插件还可以对上传过程进行自定义,如上传时的进度条显示、图......
  • 用vite创建vue3项目
    打算用vite创建vue3项目1.安装npminitvite-app<项目名称>cd<项目名称>npminstallnpmrundev##执行完以上命令,就意味着你的vue3.0项目已经用上了vite了提示  deprecated 改为:npminit@vitejs/app又提示deprecated  改为:npmcreatevite@latest2输......
  • Vue3Router路由传参
    import{useRouter}from'vue-router'//首先在setup中定义constrouter=useRouter()//字符串router.push('home')//对象router.push({path:'home'})//命名的路由router.push({name:'user',params:{userId:'123......
  • vue数据双向绑定的原理是什么?
    Vue.js是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。需要Observe的数据对象进行递归遍历,包括子属性对象的属性,都加上setter和getter,这样的话,给这个对象的某个......
  • Vue上传视频组件
    整合上传组件<el-form-itemlabel="上传视频"><el-upload:on-success="handleVodUploadSuccess":on-remove="handleVodRemove":before-remove="beforeVodRemove":on-exceed="h......
  • [vue-router] hash模式与history模式的区别
    单页面应用(SPA)单页面应用程序将所有的活动局限于一个Web页面中,在该Web页面初始化时加载相应的HTML、JavaScript和CSS。一旦页面加载完成,单页面应用不会因为用户的操作而进行页面的重新加载或跳转。取而代之的是利用JavaScript动态的变换HTML的内容,从而实现UI与用户的交互。由......
  • 手机直播源码,Android Shape设置背景
    手机直播源码,AndroidShape设置背景设置背景时,经常这样android:background=“@drawable/xxx”。如果是纯色图片,可以考虑用shape替代。shape相比图片,减少资源占用,缩减APK体积。<?xmlversion="1.0"encoding="utf-8"?><shape  xmlns:android="http://schemas.android.c......