입력“텍스트”태그 자동 확대 비활성화-iPhone의 Safari


539

<input>태그 가있는 HTML 페이지를 만들었습니다 type="text". iPhone에서 Safari를 사용하여 클릭하면 페이지가 커집니다 (자동 확대 / 축소). 아무도 이것을 비활성화하는 방법을 알고 있습니까?


8
여기에 도착하는 모든 Twitter 부트 스트랩 사용자의 경우이 Github 문제 도 참조하십시오 .
Jeroen

7
@daxmacrog가 원하는 답변에 정확하게 대답한다고 생각합니다. 기꺼이 받아 들일 수 있습니까? 2018 답변 : stackoverflow.com/a/46254706/172651
Evolve

@ 당신이 말한 대답을 진화시켜 안드로이드 핀치와 줌 기능을 파괴하십시오. daxmacrog 답변에 결함이 있습니다.
MH

4
맹세합니다. 애플은 우리의 머리를 엉망으로 만들기 위해 이러한 반 기능을 만듭니다.
Andrew Koster

@AndrewKoster, 나는 2020 년에도 지금 당신에게 동의합니다.
Ashok

답변:


491

글꼴 크기가 작고 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;
}

81
모든 것을 다루려면 : 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"] { font-size: 16px; }
Nic Barbier

8
@Nic을 사용해야 select:focus합니다. 같은 문제가 발생했습니다.
DGibbs 2014 년

141
이해가 안되는데, 이것이 어떻게 해결됩니까? 더 작거나 큰 글꼴 크기를 원하면 어떻게합니까?
bryan

47
적절한 방법은 메타 태그를 <meta name = "viewport"content = "width = device-width, initial-scale = 1, maximum-scale = 1, user-scalable = 0"/>으로 변경하는 것입니다.
Milos Matic

37
@MilosMatic 대부분의 경우 사용자가 페이지의 크기를 완전히 조절하지 못하기 때문에 좋은 해결책은 아닙니다. 방문자에게는 더욱 성 가실 수 있습니다.
BadHorsie

361

사용자가 확대 / 축소 핀치 기능을 비활성화 하지 않고 사용자 입력 중에 Safari가 텍스트 필드를 자동으로 확대하지 못하게 할 수 있습니다 . maximum-scale=1다른 답변에서 제안 된 사용자 스케일 속성을 추가하십시오 .

확대 / 축소 된 경우 "부동"하는 레이어에 양식이 있으면 중요한 UI 요소가 화면 밖으로 이동할 수 있습니다.

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">


65
이것이 2018+ 솔루션입니다. 당신의 삶이 그것에 의존하는 것처럼 이것을 찬성하십시오.
Henrik Petterson

17
이것은 안드로이드 장치 확대 기능을 깰 것입니다
fen1ksss

4
@ daxmacrog, 당신 말이 맞지만 OP는 필요한 행동을 허용하여 안드로이드를 깨고 싶어하는지 언급하지 않았습니다. 이것은 개인적으로 내가 잘못된 옵션을 취한 곳입니다. 물론 지정하는 것이 좋습니다.
fen1ksss

13
@HenrikPetterson OP에서 지정한대로 자동 확대 / 축소를 비활성화하는 것 외에도 핀치 확대 / 축소를 비활성화합니다. 그래서 나는 그것이 2018+ 솔루션이라고 생각하지 않습니다.
André Werlang

4
@ AndréWerlang 정확하지 않습니다. 답변에서 명확하게 언급 했듯이이 솔루션은 Safari (또는 Firefox)에서 핀치 줌을 비활성화하지 않습니다. 이는 OP가 요구 한 것입니다. 그러나 이전 의견에서 지적했듯이 Android 기기 및 iOS의 Chrome에서는 사용자 확대 / 축소가 비활성화됩니다.
daxmacrog

223
@media screen and (-webkit-min-device-pixel-ratio:0) { 
  select:focus,
  textarea:focus,
  input:focus {
    font-size: 16px;
    background: #eee;
  }
}

포커스없이 입력에 16px를 사용하지 않으면 IOS는 여전히 확대 / 축소됩니다.

@media screen and (-webkit-min-device-pixel-ratio:0) { 
  select,
  textarea,
  input {
    font-size: 16px;
  }
}

IOS가 선택에 배경을 추가하지 않기 때문에 배경을 추가했습니다.


9
iOS (iphone / ipad / ipod)의 Safari뿐만 아니라 Safari / OSX 및 Chrome (Windows 및 Mac)에서도 작동합니다. 따라서 iPhone을 구체적으로 타겟팅하려고하면 작동하지 않습니다.
Redtopia

31
모두가 16px를 말하는 이유는 무엇입니까? 왜 정확히 16px인지 언급하는 사람은 없습니다. 왜 그런 임의의 숫자입니까? 왜 1.8rem 또는 2.5em 등이 아닌 양식 필드 텍스트 크기를 16px로 설정해야합니까? 이것은 독점적 인 OS의 바보 같은 버그입니까?
Beebee

14
@Beebee 100 % 글꼴 크기는 16px이며, 모든 브라우저가 아니라면 대부분의 기본값입니다 (데스크톱도 해당). IOS는 읽기에 편안한 크기이기 때문에 기본으로 사용합니다. 왜 이렇게 신경 쓰지 않습니까? 걱정하지 마십시오.
Christina

5
@media screen and (-webkit-min-device-pixel-ratio:0) and (max-device-width:1024px)iPhone에 미치는 영향을 제한하는 데 사용 하지만 Chrome에서 볼 때 웹 사이트를 수정하지 마십시오.
BurninLeo

9
@supports (-webkit-overflow-scrolling: touch)이 CSS 기능은 iOS에만 존재 하므로 미디어 쿼리를 사용하는 대신을 사용해야 합니다.
James Moran

189

웹 사이트가 휴대 기기 용으로 올바르게 설계된 경우 확장을 허용하지 않을 수 있습니다.

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

이렇게하면 모바일 페이지 또는 양식이 '부동'하는 문제가 해결됩니다.


123
기술적으로는 정확하지만 추론에 동의하지 않습니다. 올바르게 디자인 된 사이트에서 사용자 확대 / 축소를 비활성화하는 것은 여전히 ​​나쁜 생각입니다.
Fer

20
"적절하게 디자인 된"은 매우 주관적입니다. 반응이 빠르고 모든 브라우저에서 작동해야하는 사이트 상단의 고정 된 50px 헤더를 고려하십시오. iOS Safari에서 확대하면 헤더 위치가 깨지고 전체 사이트가 거의 깨집니다.
Redtopia

62
사용자 확대 / 축소 기능을 사용하지 않도록 설정하는 것은 UX 관점에서 볼 때 끔찍한 방법이므로 모든 비용을 피해야합니다. 자유롭게 확대 할 수 있다는 것은 기본적인 접근성 기능이며 절대로 사용자로부터 절대 빼앗아서는 안되는 컨트롤입니다.
가브리엘 루에 제

72
기본 모바일 앱에서는 확대 / 축소 할 기회가 없으며 제대로 작동합니다. 왜 웹앱이 다른가요? 명암비가 명확한 적절한 글꼴 크기와 선 높이를 설정하면 괜찮습니다.
jotav

39
'네이티브 앱에서는 괜찮습니다'라는 주장을 사용하는 사람들은 잘 만들어진 네이티브 앱이 텍스트 크기와 같은 OS 수준의 접근성 설정을 준수한다는 사실을 간과하고 있습니다. 노약자와 시력이 좋지 않은 사용자는 필요한 만큼 OS 전체에서 매우 큰 글꼴 크기를 사용할 수 있습니다. 웹 앱은 종종이 설정을 준수하지 않거나 준수 할 수 없으므로 확대 / 축소와 같은 웹 브라우저의 기본 제공 접근 기능을 허용하는 것이 중요합니다. 당신이 완벽하게 읽을 수 있다고 생각하는 것이 무엇이든, 그것을 믿지 않는 사람들이 있습니다. 마십시오 하지 당신이 유용성을 중시하는 경우 사용자로부터 멀리이 옵션을.
Ryan Williams

72

요약하면 대답은 다음과 같습니다. 양식 요소의 글꼴 크기를 16px 이상으로 설정하십시오.


예, 이것은 모바일 장치에서 확대 / 축소를 피하기 위한 최상의 방법 입니다. js, 해킹, 해결 방법이 없습니다. 그러나 16px로도 페이지가 약간 확대되어 17px, 18px ...를 시도하여 어떤 일이 발생하는지 확인했습니다.
ed1nh0

8
본문, 버튼, 입력, 텍스트 영역 및 선택 요소에 100 %를 선언하는 것이 가장 좋습니다. 이를 통해 사용자는 브라우저와 함께 제공되는 16px가 아닌 기본값을 설정할 수 있습니다. 화면을 읽는 데 문제가있는 사람은 기본값을 18px 또는 20px로 설정할 수 있습니다. 16px을 강제로 선택하여 선택을 재정의하고 싶지 않습니다. 그러나 iOS에 관해서는 HIG가 말하는 값이 너무 작다는 결정을 내 렸습니다. 불행히도 100 % 값을 해석하지 못하는 것처럼 보이므로 기본값을 추가하여 달래 지 않습니다.
J. Hogue

RE iOS Safari는이 의견으로 Safari가 font-size: 100%값을 올바르게 해석하고 필요한 16px를 얻습니다.
Nathan Lafferty

36
input[type='text'],textarea {font-size:1em;}

3
user-scalable을 no로 설정하면 모든 확대 / 축소가 비활성화되며 이는 잘못된 생각입니다.
stormsweeper

18
본문 글꼴 크기가 기본값 (지정되지 않은 또는 1em, 또는 100%) 인 경우에만 작동합니다 . 맞춤 글꼴 크기를 설정하면 자동 확대를 피하기 위해 font-size스 니펫에서 16px를 설정할 수 있습니다 .
Alan H.

나는이 질문이 iPhone에 관한 것이지만 이것이 플랫폼간에 더 호환 가능하고 더 많은 플랫폼 / 장치의 미래에 16px 접근법을 시도했지만 Android 태블릿에서는 자동 줌 효과를 줄였습니다. 게시물에 지정된 '1em'으로 설정하면 문제가 해결되었습니다.
toddles_fp

3
둘 다보다 작을 수 있고 Safari는 최소한 확대 / 축소하지 않아야 하기 때문에 적절한 해결책 도 1em아닙니다 . 1rem16px16px
Finesse

2
내가 뷰포트 솔루션을 사용하지만이 일을하지, 16px 솔루션은 잘 작동하지만, 16px 내 사이트의에서 InputBox에 대한 너무 큰, 어떤 제 3 해결책이 있습니다
Suneth Kalhara

21

이 문제를 해결하는 올바른 방법은 메타 뷰포트를 다음과 같이 변경하는 것입니다.

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>


32
이것이 반드시이 행동을 막는 "적절한"방법은 아닙니다. 텍스트가 읽기에 너무 작 으면 모바일 Safari가 확대됩니다. 모두 확대 / 축소 기능을 해제하면 사용자가 페이지를 조작 할 수 없게됩니다.
AlecRust

3
분명히 iOS10에서 Apple은 최대 스케일 속성을 더 이상 존중하지 않기 때문에 모든 사이트가 설정에 관계없이 확대되도록 허용했습니다.
Wolfr

3
이것은 iOS10 20/2016/9 버전에서 작동합니다 ... 적어도 내 앱에서 작동합니다 ... <meta name = "viewport"content = "width = device-width, initial-scale = 1, minimum-scale = 1 , maximum-scale = 1">을 사용하기 전에 응답의 라인으로 전환했습니다. 그것은 작동했습니다 ...
eljamz

1
"브라우저 핀치 확대 / 축소가 페이지의 뷰포트 메타 요소에 의해 차단되지 않도록하여 페이지를 200 %로 확대 / 축소하는 데 사용할 수 있습니다.이 메타 요소의 사용자 확장 가능 및 최대 스케일 속성에 대한 제한적인 값은 피해야합니다." w3.org/TR/mobile-accessibility-mapping/#zoom-magnification
danielnixon

이 메타 태그 중 일부가 iOS 10에서 작동하지 않는 방식에 대한 의견을 보았으며 위의 iOS 용 Chrome에서 작동한다는 것을 알고 있습니다. :) 감사!
cbloss793

16

내가 찾을 수있는 확실한 방법은 없지만 여기에 해킹이 있습니다 ...

1) 확대 전에 마우스 오버 이벤트가 발생하지만 마우스 다운 또는 포커스 이벤트 전에 확대가 발생합니다.

2) javascript를 사용하여 META 뷰포트 태그를 동적으로 변경할 수 있습니다 ( Javascript를 사용하여 iPhone Safari에서 확대 / 축소 활성화 / 비활성화?를 참조 하십시오 ).

따라서 이것을 시도하십시오 (압축성을 위해 jquery에 표시).

$("input[type=text], textarea").mouseover(zoomDisable).mousedown(zoomEnable);
function zoomDisable(){
  $('head meta[name=viewport]').remove();
  $('head').prepend('<meta name="viewport" content="user-scalable=0" />');
}
function zoomEnable(){
  $('head meta[name=viewport]').remove();
  $('head').prepend('<meta name="viewport" content="user-scalable=1" />');
}

이것은 분명히 해킹입니다 ... 마우스 오버 / 다운이 항상 항목 / 종료를 잡을 수는 없지만 테스트에서 잘 작동하고 견실 한 시작입니다.


5
Safari 동작이 언제 변경되었는지 확실하지 않지만, 자동 줌 이전에 (iOS6.0.1) 마우스 다운이 발생하고 있습니다. 따라서 이전 솔루션에서 확대 / 축소가 너무 빨리 다시 활성화됩니다. 내가 시도한 모든 이벤트가 확대 전에 발생하기 때문에 적절한 수정을하지 못했습니다. 키 다운 또는 블러시 확대 / 축소를 다시 활성화 할 수 있지만 사용자가 입력을 시작하기 전에 수동으로 확대 / 축소하려는 경우와 같이 누락 될 수있는 시나리오가 있습니다.
dlo

14

나는 최근에 (오늘 : D)이 행동을 통합해야했다. 콤보를 포함한 원래 디자인 필드에 영향을 미치지 않기 위해 필자는 필드의 초점에 맞춰 변형을 적용하기로 결정했습니다.

input[type="text"]:focus, input[type="password"]:focus,
textarea:focus, select:focus {
  font-size: 16px;
}

참고로, iOS 6이 설치된 iPhone 5에서는 잘 작동했지만 세로 모드의 iOS 5가 장착 된 iPhone 4에서는 줌이 발생한 후 포커스 스타일이 적용되었습니다. 미묘한 일이 벌어졌을 수도 있지만 더 조사하지는 않았습니다.
Vish

확대 / 축소를 사용하여 개발 속도를 높이고 확대 / 축소 정도에 따라 필요한 글꼴 크기를 결정하는 방법에 대해 이야기하고 싶습니다.
mike

: focus는 iOS 10.2 iPhone 6에서 작동하지 않지만 input [type = "text"] : hover는 잘 작동했습니다.
Amirhossein Rzd

14

다음과 같이 user-scalable = 0 을 뷰포트 메타에 추가하십시오.

<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0">

나를 위해 일했다 :)


11
"브라우저 핀치 확대 / 축소가 페이지의 뷰포트 메타 요소에 의해 차단되지 않도록하여 페이지를 200 %로 확대 / 축소하는 데 사용할 수 있습니다.이 메타 요소의 사용자 확장 가능 및 최대 스케일 속성에 대한 제한적인 값은 피해야합니다." w3.org/TR/mobile-accessibility-mapping/#zoom-magnification
danielnixon

9
이것은 W3에 의해 정의 된 접근성 규칙을 위반합니다.
Joshua Russell

16px 미만의 입력 글꼴 크기를 자유롭게 변경하고 JS 해킹을 원하지 않기 때문에 나에게 가장 적합한 솔루션입니다.
Blue Bot

13

다른 많은 답변이 이미 지적했듯이 maximum-scale메타 viewport태그 에 추가하면 됩니다 . 그러나 이는 Android 기기에서 사용자 확대 / 축소를 사용 중지하면 부정적인 결과를 초래합니다 . ( v10 이후 iOS 기기에서는 사용자 확대 / 축소를 비활성화하지 않습니다 .)

기기가 iOS 인 경우 JavaScript를 사용 maximum-scale하여 메타 에 동적으로 추가 할 수 있습니다 viewport. 이 두 세계의 최고 달성 : 우리는 사용자가 확대 할 수 있도록 하고 초점을 텍스트 필드에 확대에서 아이폰 OS를 방지 할 수 있습니다.

| 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;

// /programming/9038625/detect-if-device-is-ios/9039885#9039885
const checkIsIOS = () =>
  /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;

if (checkIsIOS()) {
  disableIosTextFieldZoom();
}

왜 사본을 만드 addMaximumScaleToMetaViewport시겠습니까? 의미상의 이유 때문입니까?
Pherrymason

예, 함수를 다른 이름으로 매핑하면 사용법을 명확하게 알 수 있습니다.
Oliver Joseph Ash

8

iOS 7에서 작동하는 Javascript 핵은 @dlo의 답변을 기반으로하지만 mouseover 및 mouseout 이벤트는 touchstart 및 touchend 이벤트로 대체됩니다. 기본적으로이 스크립트는 확대를 방지하기 위해 확대 / 축소가 다시 활성화되기 전에 0.5 초 시간 초과를 추가합니다.

$("input[type=text], textarea").on({ 'touchstart' : function() {
    zoomDisable();
}});
$("input[type=text], textarea").on({ 'touchend' : function() {
    setTimeout(zoomEnable, 500);
}});

function zoomDisable(){
  $('head meta[name=viewport]').remove();
  $('head').prepend('<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0" />');
}
function zoomEnable(){
  $('head meta[name=viewport]').remove();
  $('head').prepend('<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=1" />');
} 

이것은 나를 위해 가장 잘 작동했습니다. 그러나 zoomDisable 및 zoomEnable을 사용하여 터치 스타트 / 터치 엔드 이벤트를 하나의 '포커스'이벤트로 변경했습니다.
Justin Cloud

지연을 추가하면 최신 버전의 iOS에서 잘 작동하는 것처럼 보이지만 250ms로 설정하면 잘 작동하지 않는다는 것이 흥미 롭습니다. 그것은 어떤 상황에서는 500ms도 작동하지 않을 수도 있지만, 대부분의 시간 동안 작동한다면 전혀 작동하지 않는 것보다 낫다고 생각합니다. 좋은 생각이야
dlo

7

이것은 나를 위해 일했다 :

input, textarea {
    font-size: initial;
}

아주 간단하지만 "초기"크기를 제어 할 수있는 방법이 있습니까?
2540625

테스트하지는 않았지만 글꼴 크기를 제어하는 ​​방법이어야합니다. (이 기능이 작동하는지 알려 주시면 답변을 업데이트하겠습니다.) body {font-size : 20px; } 입력 {font-size : inherit; }

7

위의 Christina 솔루션을 사용했지만 부트 스트랩을 약간 수정하고 데스크톱 컴퓨터에 적용 할 다른 규칙을 사용했습니다. 부트 스트랩의 기본 글꼴 크기는 14px이므로 줌이 발생합니다. 다음은 부트 스트랩의 "폼 컨트롤"에 대해 16px로 변경하여 확대를 방지합니다.

@media screen and (-webkit-min-device-pixel-ratio:0) {
  .form-control {
    font-size: 16px;
  }
}

모바일이 아닌 브라우저의 경우 14px로 돌아갑니다.

@media (min-width: 768px) {
  .form-control {
    font-size: 14px;
  }
}

.form-control : focus를 사용하여 16px로 변경 한 포커스를 제외하고 14px로 남겨두고 iOS8의 줌 문제를 해결하지 못했습니다. 적어도 iOS8을 사용하는 iPhone에서는 iPhone이 페이지를 확대하지 않으려면 글꼴 크기가 16px이어야합니다.


6

jQuery와 함께이 작업을 수행했습니다.

$('input[type=search]').on('focus', function(){
  // replace CSS font-size with 16px to disable auto zoom on iOS
  $(this).data('fontSize', $(this).css('font-size')).css('font-size', '16px');
}).on('blur', function(){
  // put back the CSS font-size
  $(this).css('font-size', $(this).data('fontSize'));
});

물론,이 16px글꼴 크기로 인해 디자인이 중단되는 경우 인터페이스의 일부 다른 요소를 수정해야 할 수도 있습니다 .


4
이것은 고급입니다. 이것은 스타일링입니다. 말장난이 없습니다. 영리한 접근.
crowjonah

@Wolfr 실제 장치를 사용해 보셨습니까?
Nicolas Hoizey 2016 년

1
이것은 iOS 12에서 우리를 위해 일했습니다. CSS 변환 및 음수 여백을 사용하는 대신이 방법이 가장 좋습니다.
anonymous-one

6

잠시 동안이 솔루션을 생각해 냈습니다.

// set font-size to 16px to prevent zoom 
input.addEventListener("mousedown", function (e) {
  e.target.style.fontSize = "16px";
});

// change font-size back to its initial value so the design will not break
input.addEventListener("focus", function (e) {
  e.target.style.fontSize = "";
});

"마우스 다운"에서는 입력의 글꼴 크기를 16px로 설정합니다. 줌이되지 않습니다. 포커스가있는 이벤트에서는 글꼴 크기가 초기 값으로 다시 변경됩니다.

이전에 게시 된 솔루션과 달리 입력의 글꼴 크기를 원하는대로 설정할 수 있습니다.


이것은 특히 나에게 효과적입니다. 특히 최신 iOS 버전에서는 뷰포트 메타 태그를 사용하여 확대 / 축소를 비활성화 할 수 없기 때문입니다.
mparizeau

iOS 12.1에서 작업을 확인했습니다. 감사합니다
Ziki

6

여기에서 거의 모든 한 줄을 읽고 다양한 솔루션을 테스트 한 후 솔루션을 공유 한 모든 사람들, iPhone 7 iOS 10.x에서 내가 생각해 냈고 테스트 한 결과 덕분입니다.

@media screen and (-webkit-min-device-pixel-ratio:0) {
    input[type="email"]:hover,
    input[type="number"]:hover,
    input[type="search"]:hover,
    input[type="text"]:hover,
    input[type="tel"]:hover,
    input[type="url"]:hover,
    input[type="password"]:hover,
    textarea:hover,
    select:hover{font-size: initial;}
}
@media (min-width: 768px) {
    input[type="email"]:hover,
    input[type="number"]:hover,
    input[type="search"]:hover,
    input[type="text"]:hover,
    input[type="tel"]:hover,
    input[type="url"]:hover,
    input[type="password"]:hover,
    textarea:hover,
    select:hover{font-size: inherit;}
}

그러나 "호버링"상태와 "포커스"상태 사이에서 발생하는 빠른 글꼴 크기 변경과 성능에 대한 다시 그리기 영향으로 인해 현저한 "점프"문제가 있습니다.


의견을 보내 주셔서 감사합니다. @MikeBoutin env (장치 / iOS 버전)를 공유 할 수 있습니까?
l3bel

6

@jirikuchta의 답변에서 영감을 얻어 CSS 비트를 추가 하여이 문제를 해결했습니다.

#myTextArea:active {
  font-size: 16px; /* `16px` is safer I assume, although `1rem` works too */
}

JS가 없으며 플래시 또는 다른 것을 눈치 채지 못합니다.

주목할 그것은의 가치가있는 viewportmaximum-scale=1도 작동하지만 페이지가 iframe으로로드하지 않을 때, 또는 다른 스크립트 수정이있는 경우 viewport


4

의사 요소는 :focus예전 처럼 작동하지 않습니다. iOS 11부터 기본 스타일 앞에 간단한 재설정 선언을 추가 할 수 있습니다 (글꼴 크기가 더 작은 글꼴을 재정의하지 않는 경우).

/* Prevent zoom */
select, input, textarea {
  font-size: 16px;
}

Tachyons.css와 같은 CSS 라이브러리의 경우 실수로 글꼴 크기를 무시하기 쉽다는 점을 언급 할 가치가 있습니다.

예를 들어 class : f5는 다음과 같습니다.fontSize: 1rem 본문 글꼴 크기를 기본값으로 유지하면 좋습니다.

그러나 글꼴 크기 클래스를 선택 하면 작은 디스플레이에서 f6위와 같습니다 fontSize: .875rem. 이 경우 재설정 선언에 대해 더 구체적이어야합니다.


  /* Prevent zoom */
  select, input, textarea {
    font-size: 16px!important;
  }

@media screen and (min-width: 30em) {

/* not small */

}

3

그건 그렇고, Bootstrap을 사용하면이 변형을 사용할 수 있습니다.

.form-control {
  font-size: 16px;
}

3

네덜란드 대학 웹 사이트 (양식 컨트롤에서 15px를 사용함)의 자동 폼 컨트롤 문제를 "수정"해야했습니다. 나는 다음과 같은 요구 사항을 생각해 냈습니다.

  • 사용자는 여전히 확대 할 수 있어야합니다
  • 글꼴 크기는 동일하게 유지되어야합니다
  • 일시적으로 다른 스타일링의 번쩍임 없음
  • jQuery 요구 사항 없음
  • 최신 iOS에서 작동해야하며 다른 OS / 장치 조합을 방해하지 않아야합니다.
  • 가능한 경우 매직 타임 아웃이없고 필요한 경우 타이머를 올바르게 지 웁니다.

이것이 내가 지금까지 생각 해낸 것입니다.

/*
NOTE: This code overrides the viewport settings, an improvement would be
      to take the original value and only add or change the user-scalable value
*/

// optionally only activate for iOS (done because I havn't tested the effect under other OS/devices combinations such as Android)
var iOS = navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform)
if (iOS)
  preventZoomOnFocus();


function preventZoomOnFocus()
{
  document.documentElement.addEventListener("touchstart", onTouchStart);
  document.documentElement.addEventListener("focusin", onFocusIn);
}


let dont_disable_for = ["checkbox", "radio", "file", "button", "image", "submit", "reset", "hidden"];
//let disable_for = ["text", "search", "password", "email", "tel", "url", "number", "date", "datetime-local", "month", "year", "color"];


function onTouchStart(evt)
{
  let tn = evt.target.tagName;

  // No need to do anything if the initial target isn't a known element
  // which will cause a zoom upon receiving focus
  if (    tn != "SELECT"
      &&  tn != "TEXTAREA"
      && (tn != "INPUT" || dont_disable_for.indexOf(evt.target.getAttribute("type")) > -1)
     )
    return;

  // disable zoom
  setViewport("width=device-width, initial-scale=1.0, user-scalable=0");
}

// NOTE: for now assuming this focusIn is caused by user interaction
function onFocusIn(evt)
{
  // reenable zoom
  setViewport("width=device-width, initial-scale=1.0, user-scalable=1");
}

// add or update the <meta name="viewport"> element
function setViewport(newvalue)
{
  let vpnode = document.documentElement.querySelector('head meta[name="viewport"]');
  if (vpnode)
    vpnode.setAttribute("content",newvalue);
  else
  {
    vpnode = document.createElement("meta");
    vpnode.setAttribute("name", "viewport");
    vpnode.setAttribute("content", newvalue);
  }
}

몇 가지 참고 사항 :

  • 지금까지 iOS 11.3.1에서만 테스트했지만 곧 다른 버전에서도 테스트됩니다.
  • focusIn 이벤트를 사용한다는 것은 iOS 5.1 이상이 필요하다는 것을 의미합니다 (그러나 iOS 버전 9에서 작동하는 사이트는 멋진 보너스로 간주합니다)
  • 내가 작업하는 많은 사이트에서 양식 컨트롤을 동적으로 만들 수있는 페이지가 있으므로 이벤트 위임 사용
  • 본문을 사용할 수있을 때까지 기다릴 필요가 없도록 eventListeners를 html 요소 (documentElement)로 설정 (문서가 준비 /로드 된 상태인지 확인하거나 DOMContentLoaded 이벤트를 기다려야 함)

3

글꼴 크기를 16px로 설정하는 대신 다음을 수행 할 수 있습니다.

  1. 논리 글꼴 크기를 16px로 설정할 수 있도록 입력 필드의 크기를 의도 한 크기보다 크게 지정하십시오.
  2. 입력 필드를 올바른 크기로 줄이려 면 scale()CSS 변환 및 음수 여백을 사용하십시오.

예를 들어 입력 필드의 스타일이 원래 다음과 같다고 가정합니다.

input[type="text"] {
    border-radius: 5px;
    font-size: 12px;
    line-height: 20px;
    padding: 5px;
    width: 100%;
}

모든 치수를 16/12 = 133.33 % 늘려서 필드를 확대 한 다음 12/16 scale()= 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입니다.

블로그 게시물을 좀 더 자세히 살펴 보고이 예제를 볼 수있는 HTML로 가지고 있습니다 : iPhone의 Safari에서 입력 확대 / 축소가 없습니다 .


3

이러한 답변에도 불구하고 무슨 일이 일어나고 있는지 파악하는 데 3 일이 걸렸으며 앞으로 해결책을 다시 필요할 수 있습니다.

내 상황은 설명 된 것과 약간 다릅니다.

내 페이지의 div에 편집 가능한 텍스트가 있습니다. 사용자가 정렬 버튼 인 DIFFERENT div를 클릭하면 contenteditable div에서 일부 텍스트 (이전에 저장하고 지운 선택 범위)를 자동으로 선택하고 해당 선택에서 서식있는 텍스트 execCommand를 실행 한 다음 다시 지 웁니다.

이를 통해 페이지의 다른 곳에서 색상 div와의 사용자 상호 작용을 기반으로 텍스트 색상을 눈에 띄게 변경할 수 있었으며 적절한 컨텍스트에서 색상을 볼 수 있도록 선택 영역을 숨겨 두었습니다.

아이 패드의 사파리에서 컬러 div를 클릭하면 온 스크린 키보드가 나왔고, 아무 것도 막을 수 없었습니다.

나는 마침내 아이 패드가 어떻게하고 있는지 알아 냈다.

편집 가능한 텍스트 선택을 트리거하는 터치 스타트 및 터치 엔드 시퀀스를 수신합니다.

해당 조합이 발생하면 온 스크린 키보드가 표시됩니다.

실제로 편집 가능한 텍스트를 확대하면서 기본 페이지를 확장하는 돌리 확대 / 축소를 수행합니다. 내가보고있는 것을 이해하는 데 하루가 걸렸습니다.

그래서 내가 사용한 솔루션은 특정 색상 div에서 터치 스타트와 터치 엔드를 모두 차단하는 것이 었습니다. 두 처리기 모두에서 전파 및 버블 링을 중지하고 false를 반환합니다. 그러나 터치 엔드 이벤트에서 클릭이 트리거 된 것과 동일한 동작을 트리거합니다.

그래서 Safari는 전에 "터치 스타트", "마우스 다운", "터치 엔드", "마우스 업", "클릭"이라고 생각한 것을 트리거했습니다.

인터셉트로 인한 새로운 시퀀스는 단순히 텍스트 선택입니다. Safari가 처리하고 키보드 작업을 수행하기 전에 다른 모든 것이 차단됩니다. 터치 스타트와 터치 엔드 인터셉트는 마우스 이벤트가 트리거되는 것을 막아줍니다.

나는 이것을 설명하는 더 쉬운 방법을 모르지만 처음에 문제가 발생한 후 1 시간 이내에이 스레드를 발견했기 때문에 여기에있는 것이 중요하다고 생각합니다.

나는 같은 수정이 입력 상자 및 다른 것들과 작동 할 것이라고 확신합니다. 터치 이벤트를 가로 채서 전파하거나 버블 링하지 않고 개별적으로 처리하고, Safari가 시퀀스를 키보드 트리거로 인식하지 못하도록 약간의 시간 초과 후 선택을 고려하십시오.


이것은 사파리가하는 일에 대한 훌륭한 설명입니다. 감사!
Jeremy Jeremy

2

여기 사람들이 JavaScript 또는 뷰포트 기능을 사용하여 이상한 일을하고 수동으로 장치를 확대 / 축소하는 것을 봅니다. 내 생각에는 해결책이되어서는 안됩니다. 이 CSS 스 니펫을 추가하면 글꼴 크기를 16px와 같은 고정 숫자로 변경하지 않고 iOS에서 자동 확대 기능이 해제됩니다.

기본적으로 입력 필드에 93.8 % (15px) 글꼴 크기를 사용하고 CSS 스 니펫을 추가하면 93.8 %로 유지됩니다. 16px로 변경하거나 고정 번호로 만들 필요가 없습니다.

input[type="text"]:focus,
textarea:focus {
    -webkit-text-size-adjust: 100%;
}

5
최신 iOS 6 및 iOS 9.2.1 모두에서 테스트 된 결과가 나에게 적합하지 않습니다. 재현 가능한 최소 페이지는 다음과 같습니다. pastebin.com/bh5Zhe9h 여전히 초점을 확대합니다. 이 2015에 게시 및 iOS 6에서 작동하지 않습니다 아직 upvoted 것을 이상한
알렉상드르 Dieulot

2

본문의 글꼴 크기와 같은 글꼴 크기 (입력 필드의 경우)를 설정하면 브라우저가 축소되거나 확대되는 것을 막는 것 같습니다. font-size: 1rem더 우아한 솔루션 으로 사용 하는 것이 좋습니다 .


1

iPhone에서 자동 확대 (축소 제외) 기능이 계속 작동하므로 초점 / 흐림 작업에 대한 dlo의 제안을 기반으로하는 JavaScript가 있습니다.

입력을 그대로두면 텍스트 입력이 취소되고 다시 활성화되는 즉시 확대 / 축소가 비활성화됩니다.

참고 : 일부 사용자는 작은 텍스트 입력으로 편집 텍스트를 적절하게 표시하지 않을 수 있습니다! 따라서 개인적으로 편집하는 동안 입력 텍스트 크기를 변경하는 것을 선호합니다 (아래 코드 참조).

<script type="text/javascript">
<!--
function attachEvent(element, evtId, handler) {
    if (element.addEventListener) {
        element.addEventListener(evtId, handler, false);
    } else if (element.attachEvent) {
        var ieEvtId = "on"+evtId;
        element.attachEvent(ieEvtId, handler);
    } else {
        var legEvtId = "on"+evtId;
        element[legEvtId] = handler;
    }
}
function onBeforeZoom(evt) {
    var viewportmeta = document.querySelector('meta[name="viewport"]');
    if (viewportmeta) {
        viewportmeta.content = "user-scalable=0";
    }
}
function onAfterZoom(evt) {
    var viewportmeta = document.querySelector('meta[name="viewport"]');
    if (viewportmeta) {
        viewportmeta.content = "width=device-width, user-scalable=1";
    }
}
function disableZoom() {
    // Search all relevant input elements and attach zoom-events
    var inputs = document.getElementsByTagName("input");
    for (var i=0; i<inputs.length; i++) {
        attachEvent(inputs[i], "focus", onBeforeZoom);
        attachEvent(inputs[i], "blur", onAfterZoom);
    }
}
if (navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPad/i)) {
    attachEvent(window, "load", disableZoom);
}
// -->
</script>

다음 코드는 요소에 포커스가있는 동안 입력의 텍스트 크기를 16 픽셀 (현재 줌 크기로 계산)로 변경합니다. 따라서 iPhone은 자동으로 확대되지 않습니다.

참고 : 확대 / 축소 비율은 window.innerWidth 및 320 픽셀의 iPhone 디스플레이를 기준으로 계산됩니다. 이됩니다 세로 모드에서 아이폰 유효.

<script type="text/javascript">
<!--
function attachEvent(element, evtId, handler) {
    if (element.addEventListener) {
        element.addEventListener(evtId, handler, false);
    } else if (element.attachEvent) {
        var ieEvtId = "on"+evtId;
        element.attachEvent(ieEvtId, handler);
    } else {
        var legEvtId = "on"+evtId;
        element[legEvtId] = handler;
    }
}
function getSender(evt, local) {
    if (!evt) {
        evt = window.event;
    }
    var sender;
    if (evt.srcElement) {
        sender = evt.srcElement;
    } else {
        sender = local;
    }
    return sender;
}
function onBeforeZoom(evt) {
    var zoom = 320 / window.innerWidth;
    var element = getSender(evt);
    element.style.fontSize = Math.ceil(16 / zoom) + "px";
}
function onAfterZoom(evt) {
    var element = getSender(evt);
    element.style.fontSize = "";
}
function disableZoom() {
    // Search all relevant input elements and attach zoom-events
    var inputs = document.getElementsByTagName("input");
    for (var i=0; i<inputs.length; i++) {
        attachEvent(inputs[i], "focus", onBeforeZoom);
        attachEvent(inputs[i], "blur", onAfterZoom);
    }
}
if (navigator.userAgent.match(/iPhone/i)) {
    attachEvent(window, "load", disableZoom);
}
// -->
</script>

1

그것을 찾는 데 시간이 걸렸지 만 여기에 내가 찾은 최고의 코드가 있습니다 ... http://nerd.vasilis.nl/prevent-ios-from-zooming-onfocus/

var $viewportMeta = $('meta[name="viewport"]');
$('input, select, textarea').bind('focus blur', function(event) {
$viewportMeta.attr('content', 'width=device-width,initial-scale=1,maximum-scale=' +        (event.type == 'blur' ? 10 : 1));
});

1

Stephen Walsh의 대답을 바탕으로 ...이 코드는 초점이 맞지 않는 입력의 글꼴 크기를 변경하지 않고 작동하며 (불충분하게 보입니다) FastClick 과 함께 작동합니다 . 필요에 따라 "뷰포트 너비"를 조정하십시오.

// disable autozoom when input is focused
    var $viewportMeta = $('head > meta[name="viewport"]');
    $('input, select, textarea').bind('touchend', function(event) {
        $viewportMeta.attr('content', 'width=640, user-scalable=0');
        setTimeout(function(){ $viewportMeta.attr('content', 'width=640, user-scalable=1'); }, 1)
    });

입력 컨트롤을 클릭하기 전에 사용자가 이미 약간 확대 한 경우이 솔루션으로 인해 뷰포트가 갑자기 "확대 해제"됩니까?
Bruno Torquato

그렇습니다. 그러나 사용자가 입력을 클릭 할 때마다 발생했던 이전의 "줌"효과보다 더 이상 혼란스럽지 않습니다.
Pete

1

font-size를 16px로 설정하는 것에 대한 최고 답변에 대한 해결책은 그것이 어떻게 해결책인지, 더 큰 / 작은 글꼴을 원하는지 어떻게 물었습니까?

나는 당신에 대해 모두 모르지만 글꼴 크기에 px를 사용하는 것이 가장 좋은 방법은 아닙니다 .em을 사용해야합니다.

텍스트 필드가 16 픽셀보다 큰 반응 형 사이트에서이 문제가 발생했습니다. 양식 컨테이너를 2rem으로 설정하고 입력 필드를 1.4em으로 설정했습니다. 모바일 쿼리에서 뷰포트에 따라 html 글꼴 크기를 변경합니다. 기본 HTML은 10이므로 데스크톱에서 입력 필드가 28px로 계산됩니다.

자동 확대를 제거하려면 입력을 1.6em으로 변경해야했습니다. 이것은 내 글꼴 크기를 32px로 늘 렸습니다. 약간 높고 눈에 띄지 않습니다. iPhone 4 & 5에서는 세로 방향으로 html 글꼴 크기를 15px로 변경하고 가로 방향으로 10px로 변경합니다. 해당 픽셀 크기의 스위트 스팟이 48px 인 것처럼 보였으므로 1.4em (42px)에서 1.6em (48px)로 변경되었습니다.

당신이해야 할 일은 글꼴 크기에서 스위트 스팟을 찾아서 rem / em 크기로 거꾸로 변환하는 것입니다.


1

내 프로젝트 중 하나에서 사용한 해킹은 다음과 같습니다.

select {
    font-size: 2.6rem; // 1rem = 10px
    ...
    transform-origin: ... ...;
    transform: scale(0.5) ...;
}

초기 스타일과 스케일로 마무리되었지만 초점을 확대하지 않았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.