Обнаружение функции для позиции: исправлено

Я пытаюсь найти скрипт, который определяет, размещает ли устройство элементы position: fixed относительно ViewPort, а не всего документа.

В настоящее время стандартные настольные браузеры и Mobile Safari (для iOS 5) делают это, тогда как устройства Android размещают фиксированные элементы относительно всего документа.

Я нашел пару тестов для обнаружения этого, но ни один из них не работает:

  • http://kangax.github.com/cft/ Дает мне ложное срабатывание, когда я передаю его из Android-устройство.
  • https://gist.github.com/1221602 дает мне ложноотрицательный результат, когда я передаю его на iPhone с iOS 5.

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


person pau.moreno    schedule 02.04.2012    source источник


Ответы (3)


По словам участников Modernizr, вы не можете сделать это, не обнаружив используемый браузер. Авторы достаточно хорошо зарекомендовали себя в этой области.

Тестирование position: fixed на устройствах iOS и Android указано на вики-странице Undetectables в проекте Modernizr.

На веб-сайте MobileHTML5 указана поддержка position:fixed. http://mobilehtml5.org/

person sirhc    schedule 04.04.2012

На самом деле, ребята из Filament Group сделали умную вещь со своим Fixedfixed, добавив в свой тест строку известных ложных срабатываний пользовательского агента.

Проверьте это @ http://github.com/filamentgroup/fixed-fixed.

Кто-то может также дополнить его некоторыми ложноотрицательными результатами и сделать его модернизированным тестом с дополнительными функциями.

person Mister Crimson    schedule 26.10.2012

Я создал еще одну проверку, действительно ли position:fixed поддерживается в браузере. Он создает фиксированный div и пытается прокрутить и проверить, изменилось ли положение div.

function isPositionFixedSupported(){
    var el = jQuery("<div id='fixed_test' style='position:fixed;top:1px;width:1px;height:1px;'></div>");
    el.appendTo("body");

    var prevScrollTop = jQuery(document).scrollTop();
    var expectedResult = 1+prevScrollTop;
    var scrollChanged = false;

    //simulate scrolling
    if (prevScrollTop === 0) {
        window.scrollTo(0, 1);
        expectedResult = 2;
        scrollChanged = true;
    }

    //check position of div
    suppoorted = (el.offset().top === expectedResult);

    if (scrollChanged) {
        window.scrollTo(0, prevScrollTop);
    }

    el.remove();

    return suppoorted;
}

Эта функция была протестирована в Firefox 22, Chrome 28, IE 7-10, Android Browser 2.3.

person pulzarraider    schedule 14.08.2013