2013-03-05 2 views
33

На HTML сайте, у вас есть фиксированный элемент вроде этого:Предотвратить, что фиксированный элемент изменяет размеры при масштабировании на сенсорном экране

<div id="fixed"> 
    <p>Some content</p> 
</div> 

Он имеет этот CSS:

#fixed { height:150px; position:fixed; top:0; left:0; z-index:10000; } 

При просмотре этой страницы на мобильном устройстве (или любом устройстве с сенсорным экраном), и вы увеличиваете масштаб экрана, фиксированный элемент масштабируется вместе со всем остальным контентом (он становится больше). Когда вы приближаетесь достаточно далеко, он становится настолько большим, что он почти полностью перекрывает все содержимое под ним.

Практичным примером использования будет пользовательский интерфейс, например, фиксированная панель навигации сверху или плавающая кнопка в углу экрана.

Как вы можете предотвратить изменение размера одного элемента в браузере и сделать его неизменным в любое время?

+0

Я не знал, что CSS/HTML был смоделирован после природы и вселенной;) – bobsoap

+3

Я также работаю над этой проблемой. Ответ Али Бассама - это булл. Этот эффект преимущественно используется в мобильных мобильных рекламных объявлениях и мобильных наборах пользовательского интерфейса с фиксированными элементами нижнего колонтитула. Пример: http://www.adform.com/BannerTags/Views/Test/Test.aspx?key=MTI5MTI5MQ== – kevzettler

+0

Переключение с «фиксированного» на «абсолютное» при масштабировании - это путь. Как и вы, вы оставляете изображение устройства или браузера по мере того, как пользователь хочет его использовать, чтобы веб-сайт был доступен для пользователей, которые хотят использовать масштабирование, и вам не нужно беспокоиться об уровне масштабирования или будущем браузере или изменениях устройств и ОС в отношении функций масштабирования , – lowtechsun

ответ

-2

Вам не хватает атрибута ширины, и вы можете использовать такие вещи, как max-width и max-height, чтобы сохранить размер нужного размера. Тем не менее, масштабирование позволяет пользователю получить довольно подробную страницу, поэтому всегда будет шанс, что у них есть эта проблема.

#fixed { height:150px; width: 200px; max-width: 200px; max-height: 150px; position:fixed; top:0; left:0; z-index:10000; } 
+0

Спасибо за ваш ответ, но я считаю, что вы, возможно, неправильно поняли вопрос. Max-height не делает ничего особенного в случае масштабирования. Кроме того, ширина не важна для вопроса, и это абсолютно не требуется для элементов блочного уровня. – bobsoap

+2

Я думаю, что вы недопонимаете проблему - масштабирование - это функция уровня телефона, а не функция уровня кода. Вы не можете контролировать это. –

+2

Не нужно защищаться, Тэмми. Я вижу, что теперь вы понимаете вопрос, который я задаю. Ваш оригинальный ответ не отражает этого. Функция масштабирования телефона действительно является тем, что мне нужно, только потому, что я надеюсь, что есть способ ее контролировать. Отсюда мой вопрос. Еще раз спасибо. – bobsoap

22

Demo to this answer
Dialog widget library I wrote based on this answer.
Demo for the dialog widget Попробуйте на мобильном устройстве, увеличьте масштаб и коснитесь ссылки.

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

window.addEventListener('scroll', function(e){ /* coming next */ }) 

Вычислим коэффициент масштабирования и применить его к масштабированно- элементу как CSS3 преобразования:

el.style["transform"] = "scale(" + window.innerWidth/document.documentElement.clientWidth + ")"; 

Это будет масштабировать элемент обратно масштаба 1 отношение относительно текущего видового экрана зумом, но это вероятно, он по-прежнему неправильно размещен на странице. Это означает, что мы должны получить новые значения для его позиции. То, что на самом деле произойдет на экране, зависит от значения позиции CSS элемента, fixed будет вести себя иначе, чем absolute, и в мобильном Safari конкретно, fixed позиция имеет дополнительный эффект сглаживания при увеличении страницы, что создает некоторые неудобные проблемы для этой причины - Я хотел бы предложить иметь элемент высоты 100% контента в качестве родителя relative для вашего предполагаемого масштабированного элемента, а затем в вашем скрипте поместите свой элемент absolute внутри родительского элемента. Следующие значения работают на данном примере демо:

overlay.style.left = window.pageXOffset + 'px'; 
overlay.style.bottom = document.documentElement.clientHeight - (window.pageYOffset + window.innerHeight) + 'px'; 

Вы также можете обратить внимание на использование transform-origin CSS свойства в зависимости от которого точки привязки вы хотите, чтобы масштабирование вступило в силу - это оказывает непосредственное влияние на выравнивании.

+0

Удивительно! Это работает на Android и Windows Mobile? – mozgras

+1

@mozgras Пример должен работать на iPhone, хотя у него, вероятно, много проблем с реальным миром неподходящим. После ответа я создал специальный модальный диалог, который пересказывает себя и репозиции на экране, основываясь на этой идее. Я думаю, что репо в настоящее время закрыто, но я постараюсь сделать его общедоступным как можно скорее. Вот [repo] (https://github.com/salsita/jquery-ui-scalebreaker), и вот публичная [живая демонстрация] (http://mystrd.at/testing/jq-scalebreaker/demo/) - на самом деле вы можете просто получить код из самой демонстрации. – mystrdat

+0

@mystrdat в каких уголках ваша обложка библиотеки, на которую не отвечает этот оригинальный ответ? Кроме того, вы упомянули, что «у него, вероятно, будет много проблем в реальном мире без внимания». Можете ли вы уточнить? Я тестировал вашу технику на многих устройствах, и она работает на удивление хорошо. – ido

8

Я ищу, чтобы сделать то же самое, что @bobsoap пытался сделать, но Мое решение заключается в следующем:

1.Отключить масштабирование в вашем окне просмотра тега:

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

2. Используйте плагин, как: TouchSwipe.js:

https://github.com/mattbryson/TouchSwipe-Jquery-Plugin

И только увеличить в Div или дивы, что вы хотите & костюм для ваших нужд ,

У меня есть 2 divs на странице (слева & справа) Левый div имеет фиксированное меню прокрутки, а справа - небольшой текст & изображений. Я хочу ущипнуть/увеличить масштаб и иметь только правый зум, чтобы пользователь мог читать текст в случае необходимости. Вместо того чтобы сделать весь видовой экран масштабируемым и отключить масштабирование на моем левом div, я делаю все наоборот: сделайте только мой правый div, масштабируемый с помощью плагина TouchSwipe.

Я поделюсь своим кодом, когда закончите, если кто-то заинтересован в том, как я применил плагин TouchSwipe.

+0

Это похоже на хороший способ сделать это. Как вы используете TouchSwipe? – Konservin

+0

Привет, мне было интересно, как вы использовали TouchSwipe.js, чтобы включить эффект масштабирования, аналогичный нормальному поведению браузера ... можете ли вы объяснить, как вы это достигли? – user3098549

+1

пинч не обнаружен в демонстрации щепотка на ios. – FlavorScape

Смежные вопросы