我制作了一个包含 <input>
标签以及 type="text"
属性的 HTML 页面。当我在 iPhone 上使用 Safari 点击它时,页面会变大(自动缩放)。有人知道如何禁用此功能吗?
我制作了一个包含 <input>
标签以及 type="text"
属性的 HTML 页面。当我在 iPhone 上使用 Safari 点击它时,页面会变大(自动缩放)。有人知道如何禁用此功能吗?
您可以在用户输入期间防止Safari自动放大文本字段,而无需禁用用户拥有缩放的能力。只需添加maximum-scale=1
,但不要包含其他答案中建议的user-scale属性。
如果您有一个浮动层中的表单,如果进行缩放会导致重要的UI元素移出屏幕,那么这是一个值得选择的选项。
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
maximum-scale=1
是否会影响用户手势缩放的问题,有很多人存在困惑。然而,随着苹果在iOS 10中做出正确决定并不再禁用用户手势缩放,这种行为已经发生了改变。好消息是,该设置仍然可以防止自动缩放焦点。 - Dem Pilafian如果字体大小小于 16px
,并且表单元素的默认字体大小为 11px
(至少在Chrome和Safari中),则浏览器将进行缩放。
此外,select
元素需要附加 focus
伪类。
input[type="color"],
input[type="date"],
input[type="datetime"],
input[type="datetime-local"],
input[type="email"],
input[type="month"],
input[type="number"],
input[type="password"],
input[type="search"],
input[type="tel"],
input[type="text"],
input[type="time"],
input[type="url"],
input[type="week"],
select:focus,
textarea {
font-size: 16px;
}
不必使用上面列出的所有内容,只需样式化您需要的元素,例如:仅 text
、number
和 textarea
:
input[type='text'],
input[type='number'],
textarea {
font-size: 16px;
}
实现让输入元素继承父元素的样式的另一种方法:
body {
font-size: 16px;
}
input[type="text"] {
font-size: inherit;
}
select,
textarea,
input[type="text"],
input[type="password"],
input[type="datetime"],
input[type="datetime-local"],
input[type="date"],
input[type="month"],
input[type="time"],
input[type="week"],
input[type="number"],
input[type="email"],
input[type="url"],
input[type="search"],
input[type="tel"],
input[type="color"] {
字体大小:16像素;
}
- Nic Barbierselect:focus
。我之前也遇到了同样的问题。 - DGibbs@media screen and (-webkit-min-device-pixel-ratio:0) {
select:focus,
textarea:focus,
input:focus {
font-size: 16px;
background: #eee;
}
}
@media screen and (-webkit-min-device-pixel-ratio:0) {
select,
textarea,
input {
font-size: 16px;
}
}
我添加了一个背景,因为IOS在选择时不会添加背景。
@media screen and (-webkit-min-device-pixel-ratio:0) and (max-device-width:1024px)
来限制效果只在iPhone上生效,但不要改变在Chrome浏览器中的网站显示。 - BurninLeo@supports (-webkit-overflow-scrolling: touch)
,因为这个 CSS 特性只存在于 iOS 上。 - James Moran如果您的网站已经为移动设备进行了适当的设计,您可以决定不允许缩放。
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
这解决了您的移动页面或表单“漂浮”的问题。
修复此问题的正确方法是更改视口为:
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
重要提示:请勿设置minimum-scale
属性!这将使页面无法手动缩放。
总的来说,答案是:将表单元素的字体大小设为至少16px。
font-size: 100%
的值,并获取了所需的16px。 - Nathan Lafferty正如其他答案已经指出的那样,可以通过在meta viewport
标签中添加maximum-scale
来实现此目标。但是,这样做会导致Android设备上禁用用户缩放功能。(自版本10起,它不会在iOS设备上禁用用户缩放功能。)
当设备为iOS时,我们可以使用JavaScript动态地将maximum-scale
添加到meta viewport
中。这既允许用户缩放,又可以防止iOS在聚焦文本字段时进行缩放,从而实现了最佳效果。
| maximum-scale | iOS: can zoom | iOS: no text field zoom | Android: can zoom |
| ------------------------- | ------------- | ----------------------- | ----------------- |
| yes | yes | yes | no |
| no | yes | no | yes |
| yes on iOS, no on Android | yes | yes | yes |
代码:
const addMaximumScaleToMetaViewport = () => {
const el = document.querySelector('meta[name=viewport]');
if (el !== null) {
let content = el.getAttribute('content');
let re = /maximum\-scale=[0-9\.]+/g;
if (re.test(content)) {
content = content.replace(re, 'maximum-scale=1.0');
} else {
content = [content, 'maximum-scale=1.0'].join(', ')
}
el.setAttribute('content', content);
}
};
const disableIosTextFieldZoom = addMaximumScaleToMetaViewport;
// https://dev59.com/EGox5IYBdhLWcg3wr2To#9039885
const checkIsIOS = () =>
/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
if (checkIsIOS()) {
disableIosTextFieldZoom();
}
addMaximumScaleToMetaViewport
的副本?这仅仅是为了语义上的原因吗? - Pherrymasoninput[type='text'],textarea {font-size:1em;}
1em
、或 100%
)时,这才有效。如果你设置了自定义字体大小,你可以将代码片段中的 font-size
设置为 16px
以避免自动缩放。 - Alan H.input
元素的font-size
设置为16px
,在iOS Safari或Chrome上仍无法正常工作... - oldboy不要简单地将字体大小设置为16px,您可以:
scale()
CSS变换函数和负边距将输入字段缩小到正确的大小。例如,假设您的输入字段最初是这样样式化的:
input[type="text"] {
border-radius: 5px;
font-size: 12px;
line-height: 20px;
padding: 5px;
width: 100%;
}
如果您通过将所有尺寸增加16/12=133.33%来扩大字段,然后使用scale()
减少12/16=75%,输入字段将具有正确的视觉大小(和字体大小),并且在焦点时不会缩放。
由于scale()
仅影响视觉大小,因此您还需要添加负边距以减小字段的逻辑大小。
使用以下CSS:
input[type="text"] {
/* enlarge by 16/12 = 133.33% */
border-radius: 6.666666667px;
font-size: 16px;
line-height: 26.666666667px;
padding: 6.666666667px;
width: 133.333333333%;
/* scale down by 12/16 = 75% */
transform: scale(0.75);
transform-origin: left top;
/* remove extra white space */
margin-bottom: -10px;
margin-right: -33.333333333%;
}
字段的逻辑字体大小为16px,但显示出来的文字大小为12px。受@jirikuchta答案的启发,我通过添加以下CSS代码解决了这个问题:
#myTextArea:active {
font-size: 16px; /* `16px` is safer I assume, although `1rem` works too */
}
没有JS,我也没有注意到任何闪存或其他东西。
值得注意的是,具有maximum-scale=1
的viewport
也可以工作,但在页面作为iframe加载时不起作用,或者如果您有某些其他脚本修改了viewport
等情况下也不起作用。