关于移动端页面强制竖屏

  最近工作中写了一个移动端的页面,本来是没什么的,但是有一个要求感觉很奇怪,从前也没有遇到过,就是我写的这个页面需要放在一个APP中,但是这个APP是横屏的,打开这个页面的webview也是横屏的(最新版的APP打开的时候是竖屏的webview),本来我们是用的rem布局,横屏的状态下也是没有什么问题的,但是甲方希望在横屏打开的时候强制这个页面竖屏显示。所以就有了下面一系列的操作了。

首先是判断横屏的状态,使用的一下的代码:

 1         function orient() {
 2             if(window.orientation == 90 || window.orientation == -90) {//横屏
 3                 //ipad、iphone竖屏;Andriod横屏
 4                 //$("body").attr("class", "landscape");
 5                 //orientation = 'landscape';
 6                 //alert("ipad、iphone竖屏;Andriod横屏");
 7                 $("p").text("横屏");
 8                 return false;
 9             } else if(window.orientation == 0 || window.orientation == 180) {//竖屏
10                 //ipad、iphone横屏;Andriod竖屏
11 //                $("body").attr("class", "portrait");
12 //                orientation = 'portrait';
13                 //alert("ipad、iphone横屏;Andriod竖屏");
14                 $("p").text("竖屏");
15                 return false;
16             }
17         }
18         //页面加载时调用
19         $(function() {
20             orient();
21         });
22         //用户变化屏幕方向时调用
23         $(window).on('orientationchange', function(e) {
24             
25             orient();
26             
27         });

这个就是在监测手机的方向。但是,因为打开的这个APP的时候就是横屏打开的,多以这个是没办法监测到的,而且这个还有一个前提就是手机必须打开了自动旋转才是可以的。所以上面的方法被抛弃了。

  既然智能的办法被抛弃了,那就用最贱的办法,就是监测屏幕的宽度和高度。当高大于宽的时候,我们默认手机是竖屏的状态,当宽大于高的时候,我们认为是横屏的状态。(当然了这个也是有局限的,但是考虑到新的APP中已经把横竖屏的问题解决了,这里就姑且这么做了)。当竖屏的状态我们是不需要做什么的。但是在横屏的状态下,我们就要把页面转动90度了。废话不多说,直接看代码:

 

 1 // 利用 CSS3 旋转 对根容器逆时针旋转 90 度 强制用户进行竖屏显示
 2 var detectOrient = function() {
 3     var width = document.documentElement.clientWidth,
 4         height = document.documentElement.clientHeight,
 5         //$wrapper = document.getElementsByTagName("body")[0],
 6         $wrapper = document.getElementById("vue"),
 7         style = "";
 8     if(width <= height) { // 横屏
 9 //        style  = "width:"   width   "px;"; // 注意旋转后的宽高切换
10 //        style  = "height:"   height   "px;";
11 //        style  = "-webkit-transform: rotate(0); transform: rotate(0);";
12 //        style  = "-webkit-transform-origin: 0 0;";
13 //        style  = "transform-origin: 0 0;";
14         style  = "font-size:"   (width * 100 / 1125)   "px";
15         var html_doc = document.getElementsByTagName("html")[0];
16         html_doc.style.cssText = "font-size:"   (width * 100 / 1125)   "px";
17     } else { // 竖屏
18         style  = "width:"   height   "px;";
19         style  = "min-height:"   width   "px;";
20         style  = "-webkit-transform: rotate(-90deg); transform: rotate(-90deg);";
21         // 注意旋转中点的处理
22         style  = "-webkit-transform-origin: "   height / 2   "px "   (height / 2)   "px;";
23         style  = "transform-origin: "   height / 2   "px "   (height / 2)   "px;";
24         //style  = "font-size:"   height * 100 / 1125   "px;";
25         //$("html").css({"font-size":(height * 100 / 1125),"overflow-y":"hidden"});
26         var html_doc = document.getElementsByTagName("html")[0];
27         html_doc.style.cssText = "font-size:"   height * 100 / 1125   "px;"   "overflow-y:" "hidden;" "height:" height "px;";
28         style  = "overflow-y: hidden;";
29         add_tab();
30         $wrapper.style.cssText = style;
31     }
32     
33     
34 }
35 window.onresize = detectOrient;
36 detectOrient();
37 
38 function add_tab(){
39     var clone_tab = $("footer").clone();
40     $("footer").remove();
41     clone_tab.css({"transform":"rotate(-90deg)","transform-origin":"top right"})
42     $("body").append(clone_tab);
43     clone_tab.css({"position":"fixed","right":"1.77rem","bottom":"4rem","left":"auto","top":"0","width":"11.25rem","height":"1.77rem"})
44 }

 

相信这段代码对于前端人员来说不是很难,但是有一点需要注意的有三点。

  第一点:

最开始的时候我是为了方便直接旋转的整个的html,这个是时候会有一个问题,就是页面中的fixed定位的元素,定位就不管用了(代码中的<footer>就是作为tab切换放在底部的);这里附上张鑫旭大神的文章,这个就需要我们更改了,既然旋转父元素,子元素就不管用了,那我们就不要旋转父元素了,直接旋转他的兄弟元素就可以了。我这里是旋转的一个叫做#vue的元素,因为我的页面中的其他的内容全部是在这个div当中的。所以我就旋转了这个元素。然后这个时候定位是可以用的,但是样式不对,所以在我的add_tab这个函数中就是在调整这个元素的大小和样式,让他能正常的显示在屏幕的右侧,也就是竖屏的状态下,屏幕的底端。

  第二点:

第二点需要注意的是,应为我用的是rem布局,多以我会更改html的font-size,但是这个时候就要小心了,当我们旋转过来之后,宽变成了高,高变成了宽,所以我们需要用height来计算根目录的字体大小。

  第三点:

第三点就是在程序中注明的,需要我们注意旋转的中心,默认的旋转中心是在所选元素的中心点。多以我们要改变旋转的中心点。旋转之后还要把html的overflow-y:hidden。否则就会出现多余的滚动。

  这样的话,基本上就把整个页面旋转过来了,并且把底部的fixed定位的元素再次定位成功了。比较幸运的是我们用的弹窗是用的layui的弹窗,再把这个弹窗旋转90度就可以了。

ps:最后发现一点问题是没办法解决的,就是当页面够长的时候,也就是有滚动条的时候,弹窗出来以后,滑动后面的遮罩层的话,后面的页面会向上滑动。这个本来是可以解决的,我上面的这个文章就是利用fixed定位解决的,但是因为旋转了,这个失效了,所以就没有好的办法了。附上我上个文章的链接。在竖屏状态下是没问题的。

 


更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

敏捷开发绩效管理之四:为团队设立外部绩效目标(目标管理,外向型绩效)...

这是敏捷开发绩效管理的第四篇。&#xff08;之一&#xff0c;之二&#xff0c;之三&#xff0c;之四&#xff0c;之五&#xff0c;之六&#xff0c;之七&#xff09;最近在看德鲁克的书&#xff0c;发现其中很明确地写着“企业的绩效只存在于外部&#xff0c;而企业内部只有成…

面向对象程序设计-C++ Default constructor Copy constructor Destructor Operator Overloading【第九次上课笔记】...

先上笔记内容吧&#xff1a; 这次上课的内容有关 构造函数析构函数运算符重载return * this内容很细&#xff0c;大家好好回顾笔记再照应程序复习吧 :) #include <iostream>using namespace std;class Integer { public:int i;int geti () const {return this->i;}vo…

阅读react-redux源码 - 一

阅读react-redux源码 - 零阅读react-redux源码 - 一阅读react-redux源码(二) - createConnect、match函数的实现 阅读react-redux源码零中准备了一些react、redux和react-redux的基础知识。从使用的例子中可以看出来顶层的代码中需要用一个来自react-redux的Provider组件提供r…

【K8S in Action】服务:让客户端发现pod 并与之通信(2)

一 通过Ingress暴露服务 Ingress (名词&#xff09; 一一进入或进入的行为&#xff1b;进入的权利&#xff1b;进入的手段或地点&#xff1b;入口。一个重要的原因是每个 LoadBalancer 服务都需要自己的负载均衡器&#xff0c; 以及 独有的公有 IP 地址&#xff0c; 而 Ingres…

事件绑定on与hover事件

今天项目中UI设计了一个鼠标划入和划出的效果&#xff0c;本来这个小效果是非常简单的&#xff01;可是在实际的生产环境中就出现了一点点问题&#xff01;因为在实际的环境中&#xff0c;数据全部是用ajax异步加载进去的&#xff0c;这样就造成了hover方法不能用了。先看一下原…

Java EE + MongoDb与Apache TomEE和Jongo Starter项目

知道MongoDB和Java EE &#xff0c;但是您不知道如何将两者集成在一起&#xff1f; 您是否阅读了很多有关该主题的内容&#xff0c;但没有找到适合该目的的解决方案&#xff1f; 这个入门项目适合您&#xff1a; 您将学习如何以一种时尚的方式使用MongoDB和Java EE &#xff0…

hdu 3831

神题&#xff0c;经典dp 关键是状态的表示。 f[i][j][k] 原串后i个字符&#xff0c;与目标后j个字符做匹配&#xff0c;在这之前最近一次发生的后缀操作为“置k”&#xff0c;k52时表示不置后缀 转载于:https://www.cnblogs.com/zhaozhe/archive/2011/08/26/2154684.html

1017 A除以B (20 分)

本题要求计算 /&#xff0c;其中 A 是不超过 1000 位的正整数&#xff0c;B 是 1 位正整数。你需要输出商数 Q 和余数 R&#xff0c;使得 ABQR 成立。 输入格式&#xff1a; 输入在一行中依次给出 A 和 B&#xff0c;中间以 1 空格分隔。 输出格式&#xff1a; 在一行中依次输出…

阅读react-redux源码(二) - createConnect、match函数的实现

阅读react-redux源码 - 零阅读react-redux源码 - 一阅读react-redux源码(二) - createConnect、match函数的实现 上一节看了Provider组件的实现&#xff0c;主要做的事情就是通过Context透传了来自redux的store和监听store变化的事件对象Subscription的实例。 本节会深入到co…

一个罐子统治一切:Apache TomEE + Shrinkwrap == JavaEE引导

警告&#xff1a;我不是Spring Boot的专家。 我发现很多事情对此非常有趣&#xff0c;并且当然可以真正改善您的日常工作。 而且&#xff0c;我对Spring Boot没有任何反对&#xff0c;也没有开发或使用它的人。 但是我认为社区高估了该产品。 一年前&#xff0c;我开始收到很多…

iview-admin框架运行步骤

第一步&#xff1a; 前往github下载整个iview-admin框架的全部源码 github地址&#xff1a; https://github.com/iview/iview-admin 第二步&#xff1a; 点击Clone or download绿色按钮。下载整个压缩包 第三步&#xff1a; 解压至D盘&#xff0c;在根目录中按 1、前往github下…

阅读react-redux源码(三) - mapStateToPropsFactories、mapDispatchToPropsFactories和mergePropsFactories

阅读react-redux源码 - 零阅读react-redux源码 - 一阅读react-redux源码(二) - createConnect、match函数的实现阅读react-redux源码(三) - mapStateToPropsFactories、mapDispatchToPropsFactories和mergePropsFactories mapStateToPropsFactories import { wrapMapToPropsC…

Xcode 升级后,常常遇到的遇到的警告、错误,解决方法(转)

从sdk3.2.5升级到sdk 7.1中间废弃了很多的方法&#xff0c;还有一些逻辑关系更加严谨了。1&#xff0c;警告&#xff1a;“xoxoxoxo” is deprecated解决办法&#xff1a;查看xoxoxoxo的这个方法的文档&#xff0c;替换掉这个方法即可。2&#xff0c;警告&#xff1a;Declarat…

.net 垃圾回收学习[How To: Use CLR Profiler][翻译学习]【2】

http://msdn.microsoft.com/zh-cn/library/ms979205 注意&#xff1a;内容可能已经过期了。 注意&#xff1a;CLR Profiler最新版本&#xff1a;http://www.microsoft.com/download/en/details.aspx?id16273 Identifying Common Garbage Collection Issues 可以使用CLR Profil…

JavaOne 2014:会议与合同利益冲突

杜克街咖啡馆&#xff0c;工程师可以在街上进行走廊交谈 。 与签约不兼容 我的第11届JavaOne会议&#xff08;2004年至2014年为11 10 1&#xff09;非常出色。 值得参加此活动并结识社区中所有参与的人。 现在&#xff0c;这里是绅士的&#xff0c;但 。 除了经济上的明显优…

JQuery(三)-- AJAX的深入理解以及JQuery的使用

HTTP HTTP http: 超文本传输协议。特点&#xff1a; 简单、快速、灵活、无状态、无连接 URL&#xff1a; 统一资源定位符。 组成&#xff1a;协议名://主机IP&#xff1a;端口号/项目资源地址&#xff1f;传递参数的键值对#锚点 ①ip地址在同一个网段是唯一的。如果是在公…

阅读react-redux源码(四) - connectAdvanced、wrapWithConnect、ConnectFunction和checkForUpdates

阅读react-redux源码 - 零阅读react-redux源码 - 一阅读react-redux源码(二) - createConnect、match函数的实现阅读react-redux源码(三) - mapStateToPropsFactories、mapDispatchToPropsFactories和mergePropsFactories阅读react-redux源码(四) - connectAdvanced、wrapWithC…

(转)模拟鼠标/键盘

鼠标操作类 using System;namespace Edobnet.Net.Lib{/// <summary>/// Mouse 的摘要说明。/// </summary>public class Mouse{public Mouse(){//// TODO: 在此处添加构造函数逻辑//}internal const byte SM_MOUSEPRESENT 19;internal const byte SM_CMOUSEBUTTON…

c++ 返回 char*

一段在C里经常犯错误的代码 一个类&#xff1a; class C{public:C(){}~C(){}public:string a;string funa(){string tmp "1234";return tmp;}};外部调用类C并使用其成员&#xff1a; C classc;char *test1 classc.a.c_str();printf("%s\n", test1);上述正…

JSF的工作方式和调试方式–可以使用polyglot吗?

JSF不是我们通常认为的那样。 这也是一个调试起来可能有些棘手的框架&#xff0c;尤其是在初次遇到时。 在这篇文章中&#xff0c;让我们继续探讨为什么会出现这种情况&#xff0c;并提供一些JSF调试技术。 我们将讨论以下主题&#xff1a; JSF不是我们经常想到的 JSF调试的难…