Ответ 1
iOS 5 имеет поддержку позиции: исправлено.
Можно ли поместить элемент, зафиксированный относительно окна просмотра в Mobile Safari? Как отмечали многие, position: fixed
не работает, но Gmail просто вышла с решением, которое почти то, что я хочу – см. панель плавающего меню в представлении сообщения.
Доступ к событиям прокрутки в режиме реального времени в JavaScript также будет разумным решением.
iOS 5 имеет поддержку позиции: исправлено.
Эта фиксированная позиция div может быть достигнута только в двух строках кода, который перемещает div на прокрутку в нижнюю часть страницы.
window.onscroll = function() {
document.getElementById('fixedDiv').style.top =
(window.pageYOffset + window.innerHeight - 25) + 'px';
};
См. решение Google для этой проблемы. Вы сами должны сами прокручивать контент, используя JavaScript. Sencha Touch также предоставляет библиотеку для получения этого поведения в очень удобной усадьбе.
это сработало для меня:
function changeFooterPosition() {
$('.footer-menu').css('top', window.innerHeight + window.scrollY - 44 + "px");
}
$(document).bind('scroll', function() {
changeFooterPosition();
});
(44 - высота моего бара)
Хотя панель перемещается только в конце прокрутки...
Это может вас заинтересовать. Это страница поддержки Apple Dev.
http://developer.apple.com/library/ios/#technotes/tn2010/tn2262/
Прочитайте пункт " 4. Измените код, основанный на фиксированном позиционировании CSS", и вы обнаружите, что есть очень веская причина, по которой Apple решила принять фиксированную позицию как статическую.
Я думаю, что gmail просто отслеживает положение прокрутки по таймеру и репозиции a div
соответственно.
Лучшее решение, которое я видел, находится на doctyper.
Более простое решение jQuery, которое перемещает элемент onscroll: ссылка
Вы можете попробовать использовать touch-scroll, плагин jQuery, который имитирует прокрутку с помощью фиксированных элементов на мобильном Safari: https://github.com/neave/touch-scroll
Посмотрите пример с вашим устройством iOS на http://neave.github.com/touch-scroll/
Или альтернатива iScroll: http://cubiq.org/iscroll
Я нашел это только сейчас: http://doctyper.com/archives/200808/fixed-positioning-on-mobile-safari/
(Этот вопрос также находился в результатах поиска Google.)
(Извините за necrobump.)
Я нашел решение gmail для плавающей строки.
http://googlecode.blogspot.com/2009/09/gmail-for-mobile-html5-series-css.html
Вот как я это сделал. У меня есть блок nav, который находится ниже заголовка, когда вы прокручиваете страницу вниз, она "прилипает" к верхней части окна. Если вы вернетесь назад, nav вернется в это место Я использую позицию: исправлена в CSS для немобильных платформ и iOS5. Другие мобильные версии имеют этот "лаг", пока экран не перестанет прокручиваться до его установки.
// css
#sticky.stick {
width:100%;
height:50px;
position: fixed;
top: 0;
z-index: 1;
}
// jquery
//sticky nav
function sticky_relocate() {
var window_top = $(window).scrollTop();
var div_top = $('#sticky-anchor').offset().top;
if (window_top > div_top)
$('#sticky').addClass('stick');
else
$('#sticky').removeClass('stick');
}
$(window).scroll(function(event){
// sticky nav css NON mobile way
sticky_relocate();
var st = $(this).scrollTop();
// sticky nav iPhone android mobile way iOS<5
if (navigator.userAgent.match(/OS 5(_\d)+ like Mac OS X/i)) {
//do nothing uses sticky_relocate() css
} else if ( navigator.userAgent.match(/(iPod|iPhone|iPad)/i) || navigator.userAgent.match(/Android/i) || navigator.userAgent.match(/webOS/i) ) {
var window_top = $(window).scrollTop();
var div_top = $('#sticky-anchor').offset().top;
if (window_top > div_top) {
$('#sticky').css({'top' : st , 'position' : 'absolute' });
} else {
$('#sticky').css({'top' : 'auto' });
}
};
<meta name="viewport" content="width=320, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
Также убедитесь, что height=device-height
отсутствует в этом метатеге, чтобы предотвратить добавление дополнительного нижнего колонтитула, который обычно не существует на странице. Высота строки добавляет к высоте окна просмотра, заставляя фиксированный фон прокручиваться.
Здесь вы можете видеть, какие (мобильные) браузеры поддерживают позицию css fixed + there version.
Для нашего веб-приложения требуется фиксированный заголовок. Нам повезло, что нам нужно поддерживать только последние браузеры, но поведение Safari в этой области вызвало у нас настоящую проблему.
Лучшее решение, как указывали другие, заключается в написании собственного кода прокрутки. Однако мы не можем оправдать усилия по устранению проблемы, которая возникает только на iOS. Имеет смысл надеяться, что Apple может решить эту проблему, тем более, что, как предлагает QuirksMode, Apple теперь стоит одна в своей интерпретации "позиции: фиксированная".
http://www.quirksmode.org/blog/archives/2013/12/position_fixed_1.html
То, что сработало для нас, - это переключение между "position: fixed" и "position: absolute" в зависимости от того, увеличился ли пользователь. Это заменяет наш "плавающий" заголовок предсказуемым поведением, что важно для удобства использования. При масштабировании поведение не то, что мы хотим, но пользователь может легко обойти это, изменив масштаб.
// On iOS, "position: fixed;" is not supported when zoomed, so toggle "position: absolute;".
header = document.createElement( "HEADER" );
document.body.appendChild( header );
if( navigator.userAgent.match( /iPad/i ) || navigator.userAgent.match( /iPhone/i )) {
addEventListener( document.body, function( event ) {
var zoomLevel = (( Math.abs( window.orientation ) === 90 ) ? screen.height : screen.width ) / window.innerWidth;
header.style.position = ( zoomLevel > 1 ) ? "absolute" : "fixed";
});
}