QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 415|回复: 0

[HTML/CSS/JS] 移动端页面强制竖屏的方法

[复制链接]

等级头衔

积分成就    金币 : 2841
   泡泡 : 1516
   精华 : 6
   在线时间 : 1294 小时
   最后登录 : 2024-11-21

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2023-5-23 20:32:37 | 显示全部楼层 |阅读模式
有经验的你肯定知道,当用户竖屏打开时,提示说你要把手机转过来是在是件很傻×的事情。这时如果用户没开启手机里的横屏模式,还要逼用户去开启。这时候用户早就不耐烦了。这篇文章主要介绍了关于移动端页面强制竖屏的方法,感兴趣的小伙伴们可以参考一下。( _  a4 [, d. j' \3 ~9 p$ x# g: Y: }6 O
首先是判断横屏的状态,使用的一下的代码:! B- n! M4 t' G( a2 r
  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的时候就是横屏打开的,所以这个是没办法监测到的,而且这个还有一个前提就是手机必须打开了自动旋转才是可以的。所以上面的方法被抛弃了。5 h; C, q+ l1 T/ j# G
既然智能的办法被抛弃了,那就用最贱的办法,就是监测屏幕的宽度和高度。当高大于宽的时候,我们默认手机是竖屏的状态,当宽大于高的时候,我们认为是横屏的状态。(当然了这个也是有局限的,但是考虑到新的APP中已经把横竖屏的问题解决了,这里就姑且这么做了)。当竖屏的状态我们是不需要做什么的。但是在横屏的状态下,我们就要把页面转动90度了。废话不多说,直接看代码:
1 c7 T. A. S# ^* O
  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. function add_tab(){
  38.      var clone_tab = $("footer").clone();
  39.      $("footer").remove();
  40.      clone_tab.css({"transform":"rotate(-90deg)","transform-origin":"top right"})
  41.      $("body").append(clone_tab);
  42.      clone_tab.css({"position":"fixed","right":"1.77rem","bottom":"4rem","left":"auto","top":"0","width":"11.25rem","height":"1.77rem"})
  43. }
相信这段代码对于前端人员来说不是很难,但是有一点需要注意的有三点。
+ e& |  f; ?+ v8 @第一点:" I$ D1 M. q* T/ j8 p1 h9 m  {
最开始的时候我是为了方便直接旋转的整个的html,这个是时候会有一个问题,就是页面中的fixed定位的元素,定位就不管用了(代码中的<footer>就是作为tab切换放在底部的);这个就需要我们更改了,既然旋转父元素,子元素就不管用了,那我们就不要旋转父元素了,直接旋转他的兄弟元素就可以了。我这里是旋转的一个叫做#vue的元素,因为我的页面中的其他的内容全部是在这个div当中的。所以我就旋转了这个元素。然后这个时候定位是可以用的,但是样式不对,所以在我的add_tab这个函数中就是在调整这个元素的大小和样式,让他能正常的显示在屏幕的右侧,也就是竖屏的状态下,屏幕的底端。
' K' x* D, M" _7 E2 j9 K) l第二点:! \& q# L; Q' Y" _! X1 l: H
第二点需要注意的是,应为我用的是rem布局,多以我会更改html的font-size,但是这个时候就要小心了,当我们旋转过来之后,宽变成了高,高变成了宽,所以我们需要用height来计算根目录的字体大小。6 B5 q8 L! m; D% ]/ {
第三点:
' ]4 t. s, @6 D  @8 W5 F) V: P第三点就是在程序中注明的,需要我们注意旋转的中心,默认的旋转中心是在所选元素的中心点。多以我们要改变旋转的中心点。旋转之后还要把html的overflow-y:hidden。否则就会出现多余的滚动。
3 w8 @2 g) C2 N8 O8 i; \- v) ]这样的话,基本上就把整个页面旋转过来了,并且把底部的fixed定位的元素再次定位成功了。比较幸运的是我们用的弹窗是用的layui的弹窗,再把这个弹窗旋转90度就可以了。
. Y6 y! W* M; \1 N; lps:最后发现一点问题是没办法解决的,就是当页面够长的时候,也就是有滚动条的时候,弹窗出来以后,滑动后面的遮罩层的话,后面的页面会向上滑动。这个本来是可以解决的,我上面的这个文章就是利用fixed定位解决的,但是因为旋转了,这个失效了,所以就没有好的办法了。在竖屏状态下是没问题的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号|渝公网安备50010502503914号 )

GMT+8, 2024-11-21 23:42

Powered by paopaomj X3.5 © 2016-2025 sitemap

快速回复 返回顶部 返回列表