- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我正在开发一个适合特定宽度和高度的网站(一个 885x610 的 div,边框为 1 像素,上边距为 3 像素)。我希望用户永远不必滚动或缩放来查看整个 div;它应该始终完全可见。由于设备的分辨率和宽高比各不相同,因此我想到了使用 JavaScript 动态设置“viewport”元标记的想法。这样,div 将始终具有相同的尺寸,不同的设备将不得不以不同的方式缩放,以便在其视口(viewport)中适应整个 div。我尝试了我的想法并得到了一些奇怪的结果。
以下代码适用于第一个页面加载(在 Android 4.4.0 上的 Chrome 32.0.1700.99 中测试),但当我刷新时,缩放级别会发生变化。此外,如果我注释掉 alert
,即使在第一页加载时它也不起作用。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0">
<script type="text/javascript">
function getViewportWidth() {
if (window.innerWidth) {
return window.innerWidth;
}
else if (document.body && document.body.offsetWidth) {
return document.body.offsetWidth;
}
else {
return 0;
}
}
function getViewportHeight() {
if (window.innerHeight) {
return window.innerHeight;
}
else if (document.body && document.body.offsetHeight) {
return document.body.offsetHeight;
}
else {
return 0;
}
}
if (/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)) {
var actual_width = getViewportWidth();
var actual_height = getViewportHeight();
var min_width = 887;
var min_height = 615;
var ratio = Math.min(actual_width / min_width, actual_height / min_height);
if (ratio < 1) {
document.querySelector('meta[name="viewport"]').setAttribute('content', 'initial-scale=' + ratio + ', maximum-scale=' + ratio + ', minimum-scale=' + ratio + ', user-scalable=yes, width=' + actual_width);
}
}
alert(document.querySelector('meta[name="viewport"]').getAttribute('content'));
</script>
<title>Test</title>
<style>
body {
margin: 0;
}
div {
margin: 3px auto 0;
width: 885px;
height: 610px;
border: 1px solid #f00;
background-color: #fdd;
}
</style>
</head>
<body>
<div>
This div is 885x610 (ratio is in between 4:3 and 16:10) with a 1px border and 3px top margin, making a total of 887x615.
</div>
</body>
</html>
我该怎么做才能使该网站缩放以适应宽度和高度?
最佳答案
获得一致的行为是可能的。但不幸的是,它非常复杂。我正在编写一个脚本,该脚本可以检测欺骗代理并相应地动态地将视口(viewport)重新缩放到桌面或其他欺骗代理。我还面临着 Android/Chrome 以及 iOS 模拟器的缩放问题......
要绕过它,您需要禁用缩放和/或设置视口(viewport)两次。在第一次通过时,最好在 <head>
中内联正如您现在所做的那样,您设置比例并暂时禁用用户缩放以防止缩放问题,对所有 3 个比例使用相同的固定值,例如:
document.querySelector('meta[name=viewport]').setAttribute('content', 'width='+width+',minimum-scale='+scale+',maximum-scale='+scale+',initial-scale='+scale);
然后要恢复缩放,请在 DOMContentLoaded
上再次设置视口(viewport),具有相同的比例,除了这次您设置正常的最小/最大比例值以恢复用户缩放:
document.querySelector('meta[name=viewport]').setAttribute('content', 'width='+width+',minimum-scale=0,maximum-scale=10');
在您的上下文中,因为布局是固定的并且大于视口(viewport),initial-scale='+scale
DOMContentLoaded
可能需要更合理的替代方案:
document.querySelector('meta[name=viewport]').setAttribute('content', 'width='+width+',minimum-scale=0,maximum-scale=10,initial-scale='+scale);
这应该可以让视口(viewport)重新缩放,就像您在 Webkit 浏览器中所希望的那样,而不会出现缩放问题。我只在 webkit 中说,因为遗憾的是 IE 和 Firefox 不支持根据此浏览器兼容性表的视口(viewport)、尺寸和设备像素比率更改视口(viewport)显示:http://www.quirksmode.org/mobile/tableViewport.html
IE 有自己的动态更改视口(viewport)的方法,这实际上是 IE 捕捉模式响应所必需的。 http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
因此,对于 IEMobile 和 IE SnapMode (IE10&11),您需要动态插入内联 <style>
在<head>
用类似的东西。
<script>
var s = document.createElement('style');
s.appendChild(document.createTextNode('@-ms-viewport{width:'+width+'px')+';}'));
document.head.appendChild(s);
</script>
不幸的是,Firefox 两者都没有:如上面的兼容性表所示,视口(viewport)是一次性设置的。目前,由于缺乏其他方法,使用 CSS Transform(正如@imcg 指出的那样)是在 Android 或 Gecko OS 上的 FireFox Mobile 中更改视口(viewport)的唯一方法。我刚刚测试过它,它在固定尺寸设计的背景下工作。 (在“响应式设计上下文”中,可以通过 CSS Transform 将布局重新调整为更大的尺寸,比如手机上的桌面大小,但 Firefox 仍然读取手机大小的 MQ。因此在 RWD 上下文中需要注意这一点。/除了 webkit )
不过,我注意到一些随机的 Webkit 在 Android 上使用 CSSTransform 崩溃,所以我推荐 Safari/Chrome/Opera 的视口(viewport)方法作为更可靠的方法。
此外,为了获得视口(viewport)宽度的跨浏览器可靠性,您还必须面对/修复浏览器之间 innerWidth 的整体不一致(注意 documentElement.clientWidth
获得准确的布局像素宽度要可靠得多innerWidth) 并且你还必须处理 devicePixelRatio
如 quirksmode.org 表所示的差异。
更新:实际上,在对我自己的 Firefox 问题的解决方案进行了更多思考之后,我发现了一种使用 document.write()
覆盖 Firefox Mobile 中的视口(viewport)的方法。 ,只应用一次:
document.write('<meta name="viewport" content="width='+width+'px,initial-scale='+scale+'">');
刚刚在 Webkit 和 Firefox 中测试成功,没有缩放问题。我无法在 Window Phones 上进行测试,所以我不确定 itf document.write 是否适用于 IEMobile...
关于javascript - 将视口(viewport)设置为缩放以适应宽度和高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21419404/
我想检测鼠标何时离开顶部的视口(viewport)(可以说是向北)。我在网上搜了下How can I detect when the mouse leaves the window? .是一个好的开始
我有一个 HTML 元素,宽 1000 像素,高 850 像素(它实际上是一个 iFrame,在 canvas 标签上包含一个 HTML5 游戏,但我希望这不会有影响)。 我希望元素在平板电脑上呈现,
我正在创建一个 2D 引擎,我想实现对接,所以我需要创建一个视口(viewport)并将屏幕渲染为纹理。 为了渲染视口(viewport),我将帧缓冲区保存到一个 FrameBufferObject
大多数移动页面都提供元视口(viewport)尺寸,例如 出于 iphone 向后兼容的原因,这将在宽度上模拟 320px... 但是当我通过 javascript 检查时 window.screen
我有一个客户提供的宽度为 1440 像素的网站。客户要求我使用以下方法将视口(viewport)设置为 1440 像素对于桌面浏览器,小于 1440 像素的屏幕不显示滚动条。 它确实适用于移动设备、i
我刚刚读了一篇 nice article on viewport这给我留下了几个关于移动设备上的视觉视口(viewport)与布局视口(viewport)的问题。 the width and the
layout viewport和visual viewport的解释可以找到here . 我已阅读 here和 here那个应该使用 如果想针对移动设备优化网页。 我想了解这对横向模式下的 ipho
我想用javascript获取视口(viewport)宽度。但不是常见的虚拟视口(viewport)。我需要逻辑硬件视口(viewport),在我的情况下,它不是设置视口(viewport)元标记的选
我有一个 menu 元素,如果 menu 元素变得在视口(viewport)之外,我想固定到浏览器视口(viewport)的顶部由于滚动。从概念上讲,我的网页看起来类似于下面的示例 HTML,其中菜单
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this qu
我只包含了“main”的 HTML 代码,因为这是我希望能够通过媒体查询控制的部分。我希望内容只能在小于 480 像素的视口(viewport)上查看,但浏览器似乎隐藏了所有视口(viewport)尺
我不知道如何描述这个,所以最好的办法是链接一个例子:http://www.pascalvangemert.nl/#/profile 无论这个人对侧边栏菜单做了什么都很棒,我很想复制它。我试过检查,但我
我遇到了一页末尾有空白的问题。据我所知,没有元素占据空间。仅当视口(viewport)设置为特定宽度时才会出现该空间。例如,它出现在宽度 940 和 400 左右,但不是 550 或非常宽。 起初我以
iPhone/iPad 等移动设备的视觉视口(viewport)和布局视口(viewport)有什么区别? 网上查了很多资料,还是不清楚。 最佳答案 视觉视口(viewport)是当前显示在屏幕上的页
我正在使用这个元标记来设置移动浏览器上的视口(viewport)大小: 和这个 css 以确保较大的图像不会导致在较小的视口(viewport)上滚动: img { max-width: 95%;
这是针对平板电脑浏览器的,它使用相对于视口(viewport)宽度/高度的尺寸。为简单起见,假设横向。 我在一个全屏容器中有两个 div,就像提供的图像一样。他们有 position:absolute
我在 opengl 中创建了一个迷宫,并且正在尝试创建一个小 map 。为此,我想到在视口(viewport)内创建一个视口(viewport)。我有三种方法,一种用于创建墙壁,另一种用于创建地板,另
所以我有 2 个屏幕:一个级别选择屏幕,使用分辨率为 720 x 405 的 FitViewport,然后是一个游戏屏幕,使用分辨率为 480 x 270 的 FillViewport,按每米像素数
无论视口(viewport)的宽度如何,我都有一个图像幻灯片,我试图将其置于视口(viewport)的中心。如果视口(viewport)比图像宽,使用 margin: auto; 很容易实现,但是,当
我有一个元素,该元素具有从屏幕边缘底部弹出并循环向下弹出(虽然不是完全向下)的动画。下面的代码对此非常有用。但是,有一个问题。当浏览器全屏显示时,百分比占旧视口(viewport)大小而不是新视口(v
我是一名优秀的程序员,十分优秀!