方向改变后的javascript最大视口高度Android和iOS

2024-06-03

目标:

查找设备的最大视口高度,包括设备的空间address bar这样我们就可以动态调整 min-body 的大小并将内容向上推。

问题:

移动浏览器处理方向状态的方式不同,方向变化时更新 DOM 属性的方式也不同。

使用 JavaScript 检测浏览器中 Android 手机的旋转 https://stackoverflow.com/questions/1649086/detect-rotation-of-android-phone-in-the-browser-with-javascript

使用安卓手机,screen.width or screen.height也会随着设备旋转而更新。

|==============================================================================|
|     Device     | Events Fired      | orientation | innerWidth | screen.width |
|==============================================================================|
| iPad 2         | resize            | 0           | 1024       | 768          |
| (to landscape) | orientationchange | 90          | 1024       | 768          |
|----------------+-------------------+-------------+------------+--------------|
| iPad 2         | resize            | 90          | 768        | 768          |
| (to portrait)  | orientationchange | 0           | 768        | 768          |
|----------------+-------------------+-------------+------------+--------------|
| iPhone 4       | resize            | 0           | 480        | 320          |
| (to landscape) | orientationchange | 90          | 480        | 320          |
|----------------+-------------------+-------------+------------+--------------|
| iPhone 4       | resize            | 90          | 320        | 320          |
| (to portrait)  | orientationchange | 0           | 320        | 320          |
|----------------+-------------------+-------------+------------+--------------|
| Droid phone    | orientationchange | 90          | 320        | 320          |
| (to landscape) | resize            | 90          | 569        | 569          |
|----------------+-------------------+-------------+------------+--------------|
| Droid phone    | orientationchange | 0           | 569        | 569          |
| (to portrait)  | resize            | 0           | 320        | 320          |

因此,很明显,要找到最大视口高度,无论方向如何,使用单个函数返回设备的最大高度在一系列设备上永远不会保持不变。

我发现的其他问题并不能让这两者发挥得很好:

  • The window.devicePixelRatio属性可能返回不一致的高度 当除以window.outerHeight.
  • Delay window.setTimeout(function() {}, time)需要用于为 DOM 元素提供在方向更改后更新的机会。
  • window.outerHeight未更新 iOS 设备的方向更改。使用screen.availHeight作为后备,包括底部导航栏作为总高度。
  • Using a #header, #content, #footer结构迫使您动态地重新计算#content{min-height}推动#footer下降时body是动态更新的。

一个办法:

首先我们看一下DIV结构:

<style>
#header,#content,#footer{width:100%;}
</style>

<body>
<div id="header"></div>
<div id="content"></div>
<div id="footer"></div>
</body>

我们希望防止设备自行扩展:

<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />

我们需要帮助才能返回最大视口高度并隐藏 iOS 的地址栏:

<script src="iOS.js" type="text/javascript"></script>

http://iosjs.com/ http://iosjs.com/

然后检测设备是否支持方向更改并使用调整大小作为后备:

var iOS = (navigator.userAgent.match(/(iPad|iPhone|iPod)/i) ? true : false);
var android = (navigator.userAgent.match(/Android/i) ? true : false);
var supportsOrientationChange = "onorientationchange" in window;
var orientationEvent = supportsOrientationChange ? "orientationchange" : "resize"; 

野兽的腹部:

function updateOrientation()
{
    var orientation = (window.orientation);

    if(android)
    {
        window.setTimeout(function() {
            window.scrollTo(0,0);
            var size = window.outerHeight/window.devicePixelRatio;
            $('body').css('min-height', size + 'px');
            var headerHeight = $('#header').height();
            var footerHeight = $('#footer').height();
            var contentHeight = size - (headerHeight+footerHeight);
            $('#content').css('min-height', contentHeight + 'px');
            window.scrollTo(0,1);
        }, 200);
    }

    if(iOS)
    {
        window.setTimeout(function(){
            window.scrollTo(0,0);
            var size = iOS_getViewportSize();
            var headerHeight = $('#header').height();
            var footerHeight = $('#footer').height();
            var contentHeight = size.height - (headerHeight+footerHeight);
            $('#content').css('min-height', contentHeight + 'px');
            window.scrollTo(0,1);
        }, 0);
    }
}

添加页面加载和方向事件的事件侦听器:

if(iOS)
{
    iOS_addEventListener(window, "load", iOS_handleWindowLoad);
    iOS_addEventListener(window, "orientationchange", iOS_handleOrientationChange);
    iOS_addEventListener(window, "resize", iOS_handleReize);
}
addEventListener("load", function() 
{
    updateOrientation();
}, false);
addEventListener(orientationEvent, function() {
    updateOrientation();
}, false);

证据就在布丁中:

iPhone 4 和 4s 纵向和横向


Android 纵向和横向


这里的目标是缩小这个解决方案或使其变得更好。


这是一个简单的解决方案,它将在加载和窗口大小调整时将浏览器的宽度和高度附加到文档正文。

jQuery.event.add(window, "load", resize);
jQuery.event.add(window, "resize", resize);

  function resize() 
    {
      var h = jQuery(window).height();
      var w = jQuery(window).width();
      jQuery("body").css({"width": w, "height": h});
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

方向改变后的javascript最大视口高度Android和iOS 的相关文章

  • GKLocalPlayer 身份验证不起作用,但 isAuthenticated 返回 YES(游戏中心沙盒)

    我正在努力将回合制比赛集成到我的游戏中 几天前 我开始从 GameKit API 收到奇怪的错误 指出本地玩家未经过身份验证 尽管他已通过身份验证 当我启动应用程序时 authenticateHandler被调用 显示视图控制器 输入密码后
  • 使用 ADB 更改 Android 壁纸?

    我想知道是否可以使用我的笔记本电脑从 ADB 更改 Android 壁纸 我不知道是否存在任何命令 或者我是否需要将图片复制到文件夹或编辑文本文件 如果可以的话 我需要通过 ADB 解决这个问题 谢谢大家 您只需要启动正确的壁纸设置意图 由
  • JS 导入模块并在页面加载时运行

    我想使用 html onload 事件和从另一个 generateObject js 文件导入的 console log 文本来调用我的函数 main 但是当我导入函数时 onload 事件停止工作并且函数 main 不再使用 html 生
  • 在 React 中渲染来自 Firebase 的数据

    请帮助我渲染从 Firebase 实时数据库检索的数据 我成功从 Firebase 中以数组形式检索数据 下一步是显示数据 问题就从这里开始了 我想要显示的数据应该存储在 模块 状态 首先 它被设置为一个空数组 然后检索数据 通过 Coum
  • 在 Jetpack compose 中使用 ModalDrawer 从右向左打开导航抽屉

    我一直在尝试在 Jetpack compose 中实现导航抽屉 以下代码显示了一种简单的方法 Composable fun ModalDrawerSample val drawerState rememberDrawerState Draw
  • Google+ 风格的平铺照片库

    有没有人见过一个 javascript 库 它会生成一个照片库 类似于 Google 和现在的 Facebook 组织照片的方式 其中一些照片被裁剪 但所有照片都无缝地填充了一个空间 像这样的东西 我正在四处挖掘并发现了这个 虽然有点不同
  • NicEdit 数据不在 POST 中

    我确信我在这里错过了一些非常简单的东西 我已经搜索过 但似乎找不到答案 用这个简单的形式 我如何将 NicEdit 框中的内容发送到我的 HTTP POST 我得到的只是原始文本区域值而不是编辑后的版本 h2 Test Page h2
  • 函数“FBSDK_NOT_DESIGNATED_INITIALIZER”的隐式声明在 C99 中无效预期“)”

    我正在使用适用于 iOS 4 6 0 的 Facebook SDK 今天将 cocoapods 更新到 0 38 2 后遇到了上述错误 我不确定这个错误与 cocoapods 有什么关系 Error screenshot 我遇到过同样的问题
  • 在添加 ApiController 属性之前,ASP.NET Core 3.1 无法处理 Axios 请求

    我有以下问题 每当我向 Api 端点发送内容时 ASP NET Core 3 1 就无法处理该请求 但是 当我添加ApiController属性它工作得很好 我的代码是正确的 但只有当我添加此属性时才有效 怎么会这样呢 作为参考 这是我的代
  • 如何使用Javascript统计通过ajax返回的
  • 的数量?
  • 我有一个 ajax 代码 它将列表项返回为 li one li li Two li 每次都会返回不同数量的 li 的 我想查一下数量 li li 它返回 如何使用 JavaScript 检查它 给你 returnedHTML find li
  • chrome 扩展脚本在某些页面上加载两次甚至更多

    这是我的background js 文件 chrome tabs onUpdated addListener function tabId info tab var sites new Array site2 site1 var url t
  • 将 cookie 存储在共享首选项中

    我一直在绞尽脑汁地试图弄清楚这一点 我正在制作一个 HttpsURLConnection 并使用 java net cookiemanager 来管理我的 cookie 据我所知 无法使用 android webkit cookiemana
  • 如何在 Android Q 上将照片广播到图库

    我使用这些代码拍照并将照片广播到画廊 它有效 我发现我的广播功能使用MediaStore Images ImageColumns DATA and Intent ACTION MEDIA SCANNER SCAN FILE 并且这些已被弃用
  • 如何获取viewPager选中的Tab?

    我使用 lib viewpagerindicator 创建了一个 viewpager 该活动扩展了 FragmentActivity 因此我在获取选择哪个选项卡时遇到问题 我的适配器由下面的代码给出 class GoogleMusicAda
  • object_setClass()而不是分配isa指针的性能

    我注意到在 XCode 4 6 的最新更新中 我收到了关于以下几行的警告JSONKit m 具体来说 设置对象类的行 dictionary gt isa JKDictionaryClass 这些被标记为已弃用 并注明首选方法是使用objec
  • 如何将包含所有嵌套数据的Firebase文档移动到其他集合?

    我想将特定文档及其所有嵌套集合从一个集合移动到另一个集合 是否可以 db collection codes doc specificDoc setLocation db collection archive 或者类似的东西 Firestor
  • AngularJS:如何通过 websocket 发送文件?

    我是 websocket 的新手 我被分配了一个现有的工作聊天模块 目前该模块仅向其他用户发送消息 我被要求集成用户可以互相发送 附件 的功能 供参考 我发现了这个链接 https stackoverflow com questions 1
  • Bootstrap轮播不滑动

    我一直在尝试使用 Bootstrap Carousel 并在一定程度上取得了成功 我也可以单击并更改图像 但我有一个问题 只是不滑动而已 我哪里做错了 html div class carousel slide ol class carou
  • 当用户从android后台删除应用程序时如何检测事件?

    当用户从后台删除我的应用程序时 我需要重置通知 所以我需要一个从后台删除应用程序的事件 请帮帮我 建议表示赞赏 谢谢 亲切的问候 官方安卓文档 Activity onDestroy 您的活动被销毁之前收到的最后一个电话 发生这种情况的原因可
  • html 中的图像按钮

    我正在尝试获取一个带有图像的按钮 我见过类似下面的东西 但它们不会为您提供普通按钮所具有的按钮按下 释放效果

随机推荐

  • 如何更改ComboBox所选项目的前景色?

    是否可以更改所选 不在下拉列表中 项目的外观 combobox ForeColor 仅更改下拉列表中所有项目的文本颜色 Edit 变体如下 我们的是 public static void CBoxDrawItem object sender
  • 如何强制网络浏览器不缓存图像

    背景 我正在为两个公益网站编写并使用一个非常简单的基于 CGI Perl 的内容管理工具 它为网站管理员提供了事件的 HTML 表单 他们可以在其中填写字段 日期 地点 标题 描述 链接等 并保存 在该表格上 我允许管理员上传与该活动相关的
  • 将图像缩略图上传到服务器,而不上传整个图像

    据我所知 我在这里问的是不可能的 但我想无论如何我都会问 以防我遗漏了什么 假设您想让用户上传 JPG 图像 并且这些图像被缩放为较小的图标 并且原始图像始终被丢弃并且不再需要 有没有什么方法可以在大多数现代浏览器中普遍使用 让用户选择硬盘
  • 如何在React-Native中选择ListView的一项?

    我是 React Native 的新手 我想使用 ListView 选择一项 当我第一次按下 item 时 ListView renderRow 被调用 但终究不起作用 我该如何修复这个错误 我的问题出在哪里 我写了一个演示here htt
  • 当 sys.path 不同时,dill python 模块是否处理导入模块?

    我正在评估莳萝 我想知道这种情况是否得到处理 我有一个案例 我在 python 进程中成功导入了一个模块 我可以使用 dill 进行序列化 然后在具有不包含该模块的不同 sys path 的不同进程中加载 该模块吗 现在我导入失败 但也许我
  • 测试主体中抛出代码为 0xc0000005 的 SEH 异常

    我正在使用 GoogleTest 为以下课程编写测试 但收到上述错误 class Base Other Functions CSig objSig 50 CSig 类如下 class CSig constructor destructor
  • 如何使用 ember.js 进行类似过滤

    我在 ember pre 1 0 中有一个简单的 ArrayController 发现如果过滤器找到给定属性的完全匹配 我可以削减列表 但我似乎找不到的是如何使用过滤器进行 like 查询 如果我搜索包含用户的数组 下面的内容将起作用 fi
  • 在流量管理器和 Web 应用程序上配置自定义域

    我推荐了这个微软文档 但它很令人困惑 https learn microsoft com en us azure app service web sites traffic manager custom domain name https
  • 以编程方式快速呈现视图控制器

    您好 我正在尝试将以下目标 C 代码转换为 swift 以便在单击按钮时从一个视图控制器导航到另一个视图控制器 任何帮助将非常感激 这是摘自苹果的编程指南 void add id sender Create the root view co
  • SVN 不会缓存凭据

    我正在使用命令行 svn 客户端 版本 1 6 12 来自 Ubuntu 存储库 但我似乎无法让它缓存我的用户凭据 我正在尝试访问 https svn 存储库 类似于https subversion FAKE com PROJECT htt
  • Mac OS Sandbox:从助手启动主应用程序

    我在沙箱中创建了一个应用程序 它使用助手在登录时启动 如所示here http blog timschroeder net 2012 07 03 the launch at login sandbox project 它工作正常 但以下消息
  • hg 语法的作用是什么:提交 A 是否可以从提交 B“到达”

    我的存储库的历史非常复杂 我经常发现自己想知道过去的某个提交是否 在 或 可从 某个修订 通常是我的头脑之一 到达 我该怎么做呢 您可以使用转速集语法 http selenic com hg help revsets 假设您想询问修订版 4
  • OS X 对 /usr/local/lib 的权限被拒绝

    我正在寻找有关权限问题的任何建议 直觉 线索 答案 自从我切换到新的 Macbook Pro 以来 这个问题一直困扰着我 这就是困境 某些程序在安装期间复制 usr local lib 下的库 并且在运行这些程序时出现崩溃 我认为这与此文件
  • 如何捕获 Ctrl + Alt + RShftKey

    For some time I m trying to catch Ctrl Alt Right Shift Key under common VBNET key handler Here are my tests If e Control
  • git 漂亮格式占位符之间的空格

    因为某些原因 这个原因 https stackoverflow com questions 53034425 git log pretty format windows strange behavior 我可能需要运行这样的 git 命令
  • 如何使用抽屉布局左侧移动主要内容

    刚刚检查了如何使用 DrawerLayout 制作菜单here http www androidhive info 2013 11 android sliding menu using navigation drawer 但左侧菜单正在移动
  • React 重新渲染数组,而 item key 没有改变

    列表的非常基本的代码示例 class List extends React Component render const listComponent this props numbers map number gt
  • UITouch移动速度检测

    我正在尝试检测触摸移动的速度 但并不总能得到我期望的结果 补充 速度峰值太多 任何人都可以发现我是否在做一些时髦的事情或建议更好的方法吗 void touchesBegan NSSet touches withEvent UIEvent e
  • MUI 组件上的渐变边框

    我没能找到相当于border image source css 我的目标是在按钮组件上渲染边框渐变 这是添加渐变边框的方法button成分 V5 const options shouldForwardProp prop gt prop gr
  • 方向改变后的javascript最大视口高度Android和iOS

    目标 查找设备的最大视口高度 包括设备的空间address bar这样我们就可以动态调整 min body 的大小并将内容向上推 问题 移动浏览器处理方向状态的方式不同 方向变化时更新 DOM 属性的方式也不同 使用 JavaScript