Как получить полосу прокрутки с переполнением CSS на iOS


82

Разрабатывая веб-сайт для iPad, я попытался использовать свойство CSS overflow: autoдля получения полос прокрутки, если это необходимо, в a div, но мое устройство отказывается отображать их, даже если прокрутка двумя пальцами работает.

Я пробовал с

overflow: auto;

и

overflow: scroll;

и результат тот же.

Тестирую только на iPad (на настольных браузерах работает отлично).

Есть идеи?


1
моя проблема очень хорошо описана здесь: webmanwalking.org/library/experiments/…
mat_jack1

Ответы:


115

Отредактируйте после комментария, любезно оставленного kritzikratzi :

[Запуск] с ios 5beta -webkit-overflow-scrolling: touchможет быть добавлено новое свойство , которое должно привести к ожидаемому поведению.

Некоторое, но очень небольшое, дополнительное чтение:


Оригинальный ответ , оставленный потомкам.

К сожалению ни overflow: auto, ниscroll , не создает полос прокрутки на устройствах iOS, по-видимому, из-за ширины экрана, на которой будут использоваться такие полезные механизмы.

Вместо этого, как вы выяснили, пользователи должны проводить пальцем по экрану двумя пальцами, чтобы прокручивать overflowпомеченный контент. Единственная ссылка, поскольку я не могу найти руководство для самого телефона, я могла найти здесь: tuaw.com: iPhone 101: Прокрутка двумя пальцами .

Единственное, что я могу придумать для этого, - это использовать какой-нибудь JavaScript и, возможно, jQTouch, для создания собственных полос прокрутки для overflowэлементов. В качестве альтернативы вы можете использовать запросы @media, чтобы удалить overflowи показать контент полностью, поскольку пользователь iPhone получает мой голос, хотя бы из-за чистой простоты. Например:

<link rel="stylesheet" href="handheld.css" media="only screen and (max-device width:480px)" />

Приведенный выше код взят из A List Apart из той же статьи, на которую ссылается выше (я не уверен, почему они ушли из type="text/css", но я предполагаю, что есть причины.


это очень полезно! Значит, нет способов добиться этого только с помощью CSS?
mat_jack1 02

К сожалению, нет, все варианты CSS, которые могут применять полосы прокрутки к элементам страницы, к сожалению, запрещены . Единственные варианты: 1, использовать JavaScript для эмуляции (что должно быть нативной функцией) или, предпочтительно, 2, использовать запросы @media для создания таблиц стилей для мобильных устройств, которые устраняют необходимость в элементах прокрутки.
Дэвид говорит, что нужно восстановить Монику

13
начиная с ios 5beta, можно добавить новое свойство -webkit-overflow-scrolling: touch, что должно привести к ожидаемому поведению.
kritzikratzi

@kritzikratzi: спасибо за обновление! Я ничего об этом не слышал до сих пор; интересная находка :)
Дэвид говорит восстановить Монику

2
Очень интересное решение .... к сожалению, при использовании этого метода полоса прокрутки видна только во время прокрутки, и не всегда ...
Лука Детоми

20

Примените этот код в своем CSS

::-webkit-scrollbar{

    -webkit-appearance: none;
    width: 7px;

}

::-webkit-scrollbar-thumb {

    border-radius: 4px;
    background-color: rgba(0,0,0,.5); 
    -webkit-box-shadow: 0 0 1px rgba(255,255,255,.5);
}

1
Это отлично работало на симуляторе Chrome IPAD. Я еще не пробовал его на реальном IPAD, но скрестим пальцы, спасибо!
user2808054

19

Я провел некоторое тестирование и использовал CSS3 для переопределения работы полос прокрутки, и вы можете сохранить свой Overflow:scroll;илиOverflow:auto

У меня получилось что-то вроде этого ...

::-webkit-scrollbar {
    width: 15px;
    height: 15px;
    border-bottom: 1px solid #eee; 
    border-top: 1px solid #eee;
}
::-webkit-scrollbar-thumb {
    border-radius: 8px;
    background-color: #C3C3C3;
    border: 2px solid #eee;
}

::-webkit-scrollbar-track {
    -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.2); 
} 

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


также эта полоса прокрутки не будет поверх содержимого, но будет как в окнах, где она занимает свое собственное пространство (перемещает содержимое влево). или какие-нибудь идеи, как этого избежать?
Ганс

Для ::-webkit-scrollbar
справки

6

Решение, данное Крисом Барром здесь

function isTouchDevice(){
    try{
        document.createEvent("TouchEvent");
        return true;
    }catch(e){
        return false;
    }
}

function touchScroll(id){
    if(isTouchDevice()){ //if touch events exist...
        var el=document.getElementById(id);
        var scrollStartPos=0;

        document.getElementById(id).addEventListener("touchstart", function(event) {
            scrollStartPos=this.scrollTop+event.touches[0].pageY;
            event.preventDefault();
        },false);

        document.getElementById(id).addEventListener("touchmove", function(event) {
            this.scrollTop=scrollStartPos-event.touches[0].pageY;
            event.preventDefault();
        },false);
    }
}

У меня отлично работает. Удалите event.preventDefault, если вам нужно использовать несколько кликов ...


2

IScroll4 библиотеки JavaScript исправит это право. У него есть hideScrollbarметод, который вы можете установить, falseчтобы предотвратить исчезновение полосы прокрутки.


2

Другие 2 человека на SO предложили возможное решение проблемы только с помощью CSS. Решение Дэвида Томаса идеально, но имеет ограничение: полоса прокрутки видна только во время прокрутки.

Чтобы полосы прокрутки всегда были видны, можно следовать инструкциям, предложенным по следующим ссылкам:


2

убедитесь, что ваше тело и дивы не имеют

  position:fixed

иначе это не сработает


1

По моему опыту, вам необходимо убедиться, что элемент display:block;подал заявку на -webkit-overflow-scrolling:touch;работу.


1
у меня это не работает .. chorme говорит, что -webkit-overflow-scrolling: touch; недействителен
Victor Hugo Arango A.

1

У меня отлично работает, попробуйте:

.scroll-container {
  max-height: 250px;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
}

1
::-webkit-scrollbar {
    width: 15px;
    height: 15px;
}

::-webkit-scrollbar-thumb {
    border-radius: 8px;
    background-color: #C3C3C3;
    border: 2px solid #eee;
}

Используйте этот код, он работает в веб-просмотре приложения ios / android; Удаляет некоторый непереносимый код css;


0

Если вы пытаетесь добиться горизонтальной divпрокрутки касанием на мобильном устройстве, обновленное исправление CSS не работает (проверено на нескольких версиях Android Chrome и iOS Safari), например:

-webkit-overflow-scrolling: touch

Я нашел решение и модифицировал его для горизонтальной прокрутки до трюка с CSS. Я тестировал его в Android Chrome и iOS Safari, и события касания слушателя существуют уже давно, поэтому у него хорошая поддержка: http://caniuse.com/#feat=touch .

Применение:

touchHorizScroll('divIDtoScroll');

Функции:

function touchHorizScroll(id){
    if(isTouchDevice()){ //if touch events exist...
        var el=document.getElementById(id);
        var scrollStartPos=0;

        document.getElementById(id).addEventListener("touchstart", function(event) {
            scrollStartPos=this.scrollLeft+event.touches[0].pageX;              
        },false);

        document.getElementById(id).addEventListener("touchmove", function(event) {
            this.scrollLeft=scrollStartPos-event.touches[0].pageX;              
        },false);
    }
}
function isTouchDevice(){
    try{
        document.createEvent("TouchEvent");
        return true;
    }catch(e){
        return false;
    }
}  

Изменено из вертикального решения (трюк до CSS):

http://chris-barr.com/2010/05/scrolling_a_overflowauto_element_on_a_touch_screen_device/

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.