Сбросить масштаб / ширину / масштабирование Safari на iPhone с помощью JavaScript/onorientationchange

StackOverflow https://stackoverflow.com/questions/1430747

Вопрос

Я показываю различный контент в зависимости от того, как пользователь держит свой телефон, используя вызов onorientationchange в теге body.Это отлично работает - я скрываю один div, делая другой видимым.

Div в портретном режиме отлично смотрится при первой загрузке.Я использую это, чтобы получить правильный масштаб:

<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;" />

Даже если содержимое в портретном режиме растекается, ширина остается правильной, и пользователь может прокручивать страницу вниз.Отображение в альбомном режиме тоже идеально.Однако, если содержимое в альбомном режиме требует от пользователя прокрутки вниз, то, когда пользователь возвращается в портретный режим, экран, так сказать, "уменьшается".Это происходит независимо от того, прокручивал пользователь страницу вниз в альбомном режиме или нет.

Я перепробовал много разных способов, чтобы попытаться правильно настроить масштаб / зум / ширину экрана, но безуспешно.Есть ли какой-нибудь способ сделать это?

Заранее спасибо!

Это было полезно?

Решение

Вот что я использую для обработки масштабирования в моих медиа-запросах:

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

Максимальный масштаб - это то, что продало его для меня.Это означает, что переход от портретной к альбомной ориентации на iphone действительно плавный, без каких-либо проблем с масштабированием вообще...

Другие советы

Принятый выше "ответ" на самом деле не является ответом, поскольку запрещать какое-либо масштабирование вообще так же плохо, как просить пользователя IE переключиться на другой браузер.Это ужасно для доступности.Вы хотите, чтобы в вашем дизайне не было чрезмерного увеличения, которое Apple сочла идеальным при переключении ориентации просмотра, но вы оставляете пользователей с ограниченными возможностями в пыли.Настоятельно не рекомендуется.

Попробуйте использовать медиа-запросы или js-хук (screen.width и т.д.), Чтобы автоматически корректировать свой дизайн при смене ориентации.Вот почему эти атрибуты доступны нам как разработчикам.

У меня были некоторые проблемы с изменением уровня масштабирования с альбомной ориентации на портретную, когда содержимое было больше, чем видовой экран.Установив "minimum-scale = 1.0", я решил это для меня.

Это не сработает, если вы запускаете веб-приложение в safari, но я думаю, что это сработает, если вы используете UIWebView внутри своего собственного приложения.

Я не тестировал это, но есть простой способ заставить ваш javascript взаимодействовать со стороной кода objective-c, после чего у вас будет доступ к таким вещам, как масштабирование веб-представления.

Думаю, у меня тоже была эта проблема.Попробуйте поместить "максимальный масштаб = 1.0" (и, возможно, "минимальный масштаб = 1.0", если вам так хочется) в свой тег viewport.Это предполагает, что вы не хотите, чтобы пользователь мог масштабироваться, хотя (чего я не делаю)

Использование мета-тегов для этого не работает.Я перепробовал все комбинации мета-тегов и orientationchange и gesturechange возможные события, я попробовал тайм-ауты и все виды навороченного javascript, затем я нашел это:https://github.com/scottjehl/iOS-Orientationchange-Fix

через этот связанный вопрос: Как мне сбросить масштаб веб-приложения при изменении ориентации на iPhone?

В этом посте Эндрю Эшбахер опубликовал ссылку на код, написанный Скоттом Джелом:

/*! A fix for the iOS orientationchange zoom bug. Script by @scottjehl, rebound by @wilto.MIT License.*/(function(m){if(!(/iPhone|iPad|iPod/.test(navigator.platform)&&navigator.userAgent.indexOf("AppleWebKit")>-1)){return}var l=m.document;if(!l.querySelector){return}var n=l.querySelector("meta[name=viewport]"),a=n&&n.getAttribute("content"),k=a+",maximum-scale=1",d=a+",maximum-scale=10",g=true,j,i,h,c;if(!n){return}function f(){n.setAttribute("content",d);g=true}function b(){n.setAttribute("content",k);g=false}function e(o){c=o.accelerationIncludingGravity;j=Math.abs(c.x);i=Math.abs(c.y);h=Math.abs(c.z);if(!m.orientation&&(j>7||((h>6&&i<8||h<8&&i>6)&&j>5))){if(g){b()}}else{if(!g){f()}}}m.addEventListener("orientationchange",f,false);m.addEventListener("devicemotion",e,false)})(this);

Это решение, красиво завернутое в ИЖИЗНЬ так что вам не нужно беспокоиться о проблемах с пространством имен.

Просто добавьте это в свой скрипт (не в document.ready() если вы используете jQuery) и viola!

Все, что он делает, это отключает масштабирование devicemotion события , которые указывают на то, что orientationchange это неизбежно.Это лучшее решение, которое я видел, потому что оно действительно работает и не отключает масштабирование.

Редактировать:такой подход не всегда надежен, особенно когда вы держите ipad под углом.кроме того, я не думаю, что это событие доступно для iPad поколения 1

Вы можете установить user-scalable свойство в атрибуте содержимого.Попробуй это:

<meta name="viewport" content="width=device-width; initial-scale=1.0; user-scalable=no;">

От этот ответ:

Но если вы назначаете User-scalable=no, это означает, что веб-сайт не позволяет увеличивать или уменьшать масштаб.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top