У меня возникла проблема в мобильных версиях webkit (в частности, Webkit 534.46 на iOS 5.1.1 в качестве мобильного Safari, а теперь и Chrome для iOS), чего не наблюдается ни на одном настольном браузере, который я видел. (т.е. демонстрации ниже должны быть просмотрены на мобильной версии webkit.)
Вот живой пример проблемы. Ядро CSS очень прямолинейно. Он позиционирует алфавитный указатель слева от страницы:
#index {
left:0; margin:0; padding:0; position:fixed; top:0; width:3em;
}
Проблема возникает, когда элемент фиксируется по верхней части тела. Он может взаимодействовать с ним до тех пор, пока свиток не изменится, а затем перестанет принимать входные данные. Если я (вручную) перетащил прокрутку даже на один пиксель, тогда он снова активируется. Пример был как можно более простым и не использует JavaScript. После того, как он действительно ударил, я обнаружил, что кажется, что элемент считает, что он прокручивается, но визуально фиксируется. Другими словами, если вы нажмете "A", попробуйте снова нажать "A", иногда вы получите второй щелчок, но он будет дальше по списку. Мне показалось, что это проблема с оплатой CSS. Я знаю, что мобильный веб-кит пытается уменьшить количество переходов.
Вот живой пример обходного пути.
Я могу использовать JS, чтобы заставить CSS всего документа переливаться на прокрутку (с дроссельной заслонкой, которая предотвращает ее до 100 мс после прокрутки), которая, кажется, обходит эту проблему в простом примере. К сожалению, это не помогает реальной версии этой проблемы.
Это код для страницы проблемы и обходной путь script.
Мой вопрос заключается в том, что происходит здесь, и есть ли обходное решение CSS, которое мне не хватает? В частности, мне любопытно, может ли какой-либо гуру CSS понять, что такое макетная ситуация, которая предотвращает клики от попадания правильного места на фиксированный элемент? Лучшее понимание может помочь найти реальное решение.
Изменить: Я забыл упомянуть, что пример явно заставляет viewport размер окна. Таким образом, пользователь не может увеличивать/уменьшать масштаб, что означает, что фиксированное положение должно привязывать элемент к левой стороне окна.
Обновление (2012-09-20): Это, похоже, исправлено в Mobile Safari на iOS 6 (а также в UIWebView). Любое обходное решение должно сначала проверить, чтобы убедиться, что оно находится на iOS < 6. Например, используя CssUserAgent, это будет выглядеть так:
if (parseFloat(cssua.ua.ios) < 6) { /* ... */ }