Zapobieganie ukrywaniu pasków przewijania dla użytkowników gładzika systemu MacOS w oprogramowaniu WebKit / Blink

162

Domyślne zachowanie WebKit / Blink (Safari / Chrome) w systemie MacOS od 10.7 (Mac OS X Lion) polega na ukrywaniu pasków przewijania przed użytkownikami gładzika, gdy nie są one używane. Może to być mylące ; pasek przewijania jest często jedyną wizualną wskazówką dotyczącą przewijania elementu.

Przykład ( jsfiddle )

HTML
<div class="frame">
    Foo<br />
    Bar<br />
    Baz<br />
    Help I'm trapped in an HTML factory! 
</div>
CSS
.frame {
    overflow-y: auto;
    border: 1px solid black;
    height: 3em;
    width: 10em;
    line-height: 1em;
}​
Zrzut ekranu WebKit (Chrome)

zrzut ekranu div bez widocznego paska przewijania

Zrzut ekranu Presto (Opera)

zrzut ekranu div z widocznym paskiem przewijania


Jak mogę wymusić, aby pasek przewijania był zawsze wyświetlany na przewijalnym elemencie w oprogramowaniu WebKit?

Jeremy Banks
źródło
Czy próbowałeś przepełnić: przewiń? To działało w Chrome. Powinno to wymusić wyświetlanie pasków przewijania.
xaddict
2
Zauważ, że jest to również problem w Firefoksie na Mac OS X.
Blaise
Człowieku, nienawidzę, gdy strony internetowe psują interfejs użytkownika w moim systemie i kliencie użytkownika.
rano

Odpowiedzi:

250

Wygląd pasków przewijania można kontrolować za pomocą -webkit-scrollbarpseudoelementów  [ blog ] WebKit . Możesz wyłączyć domyślny wygląd i zachowanie, ustawiając -webkit-appearance [ dokumenty ] na none.

Ponieważ usuwasz styl domyślny, musisz również samodzielnie określić styl, w przeciwnym razie pasek przewijania nigdy się nie pojawi. Poniższy CSS odtwarza wygląd ukrytych pasków przewijania:

Przykład ( jsfiddle )

CSS
.frame::-webkit-scrollbar {
    -webkit-appearance: none;
}

.frame::-webkit-scrollbar:vertical {
    width: 11px;
}

.frame::-webkit-scrollbar:horizontal {
    height: 11px;
}

.frame::-webkit-scrollbar-thumb {
    border-radius: 8px;
    border: 2px solid white; /* should match background, can't be transparent */
    background-color: rgba(0, 0, 0, .5);
}

.frame::-webkit-scrollbar-track { 
    background-color: #fff; 
    border-radius: 8px; 
} 
Zrzut ekranu WebKit (Chrome)

zrzut ekranu przedstawiający pasek przewijania webkita bez konieczności najechania kursorem

Jeremy Banks
źródło
1
W przypadku wymuszonych pasków przewijania lwa w macosx, sztuczka opisana tutaj nie działa z tą techniką: stackoverflow.com/a/3417992/62255 . Nie przejmuj się jednak - ponieważ wyraźnie ustawiamy tutaj wymiary, mamy do nich bezpośredni dostęp.
jedierikb
5
Zauważ, że możesz również dostosować ścieżkę / tło paska przewijania za pomocą:.frame::-webkit-scrollbar-track { background-color: #FFF; border-radius: 8px; }
XML
Uwaga: style paska przewijania w webkit nie działają w iOS 7 (i prawdopodobnie 6).
RobW
4
Jedną z rzeczy, o których warto wspomnieć, jest to, że w moich testach i naprawdę starym komentarzu kogoś innego wydaje się, że nie możesz mieć zawsze włączonego paska przewijania ORAZ szybkiego przewijania, do którego ludzie są przyzwyczajeni w iOS. Wykonanie CSS przewijającego tempo spowodowało zniknięcie moich niestandardowych pasków przewijania.
jmq
2
Nie sprawdzałem tego ostatnio, ale znalazłem w naszym CSS tę notatkę, która odnosiła się do tego rozwiązania: „Zauważ, że to pokaże paski przewijania w stylu OS X, np. W Chrome na Windows”.
Henrik N
19

W przypadku jednostronicowej aplikacji internetowej, w której dynamicznie dodaję przewijalne sekcje, uruchamiam paski przewijania OSX, programowo przewijając jeden piksel w dół i tworząc kopię zapasową:

// Plain JS:
var el = document.getElementById('scrollable-section');
el.scrollTop = 1;
el.scrollTop = 0;

// jQuery:
$('#scrollable-section').scrollTop(1).scrollTop(0);

To powoduje zanikanie i zanikanie wskazówki wizualnej.

Blaise
źródło
19

Oto krótszy fragment kodu, który ponownie włącza paski przewijania w całej witrynie. Nie jestem pewien, czy różni się znacznie od aktualnej najpopularniejszej odpowiedzi, ale oto jest:

::-webkit-scrollbar {
    -webkit-appearance: none;
    width: 7px;
}
::-webkit-scrollbar-thumb {
    border-radius: 4px;
    background-color: rgba(0,0,0,.5);
    box-shadow: 0 0 1px rgba(255,255,255,.5);
}

Znalezione pod tym linkiem: http://simurai.com/blog/2011/07/26/webkit-scrollbar

Alex Banman
źródło
3

Paski przewijania przeglądarki w ogóle nie działają na iPhonie / iPadzie. W pracy używamy niestandardowych pasków przewijania JavaScript, takich jak jScrollPane, aby zapewnić spójny interfejs użytkownika dla różnych przeglądarek: http://jscrollpane.kelvinluck.com/

U mnie działa to bardzo dobrze - możesz stworzyć naprawdę piękne niestandardowe paski przewijania, które pasują do projektu Twojej witryny.

Chris M. Welsh
źródło
2

Innym dobrym sposobem radzenia sobie z ukrytymi paskami przewijania Lion jest wyświetlenie monitu o przewinięcie w dół. Nie działa z małymi obszarami przewijania, takimi jak pola tekstowe, ale dobrze działa z dużymi obszarami przewijania i zachowuje ogólny styl witryny. Jedną z witryn, które to robią, jest http://versusio.com , po prostu sprawdź tę przykładową stronę i poczekaj 1,5 sekundy, aby zobaczyć monit:

http://versusio.com/en/samsung-galaxy-nexus-32gb-vs-apple-iphone-4s-64gb

Implementacja nie jest trudna, ale musisz uważać, aby nie wyświetlać monitu, gdy użytkownik już przewinął.

Potrzebujesz jQuery + Underscore i

$(window).scroll by sprawdzić, czy użytkownik sam przewinął,

_.delay() wyzwalać opóźnienie przed wyświetleniem monitu - monit nie powinien być natrętny

$('#prompt_div').fadeIn('slow') zaniknąć w swoim monicie i oczywiście

$('#prompt_div').fadeOut('slow') znikać, gdy użytkownik przewinął ekran po wyświetleniu monitu

Ponadto możesz powiązać zdarzenia Google Analytics, aby śledzić zachowanie użytkownika podczas przewijania.

user976647
źródło