2011-12-25 13 views
30

Próbuję dowiedzieć się, jak mieć przewijany div, który pokazuje tylko paski przewijania, gdy są ukryte.Czy paski przewijania są widoczne tylko po obróceniu Div?

Przykład to wyszukiwarka grafiki Google, na poniższym obrazku widać, jak lewy pasek boczny nie wydaje się być przewijany, dopóki nie najedziesz na niego myszą.

Czy jest to możliwe w przypadku CSS lub JavaScript jest wymagany? Jeśli to możliwe, może być szybkim przykładem, jak wykonać takie zadanie?

Example

+2

Zamiarem jest całkiem jasne, bez dwóch wysokich obrazów. –

Odpowiedz

71
#div { overflow:hidden;height:whatever px; } 
#div:hover { overflow-y:scroll; } 

Byłoby coś w tej pracy?

+1

@saratis: robi ... [JS Fiddle demo] (http://jsfiddle.net/davidThomas/GXZHk/), choć obecnie testowany tylko w Chrome 16/WinXP. –

+1

Jestem prawie pewny, że powinien działać x-browser –

+0

Wsparcie wydaje się całkiem przyzwoite: http://www.quirksmode.org/css/contents.html#t16 Jednak awaryjne usunięcie przepełnienia: ukryte dla

1

myślę coś

$("#leftDiv").mouseover(function(){$(this).css("overflow","scroll");}); 
$("#leftDiv").mouseout(function(){$(this).css("overflow","hidden");}); 
+7

': hover' not good enough? ;) – alex

+2

Jest to znacznie droższe (z punktu widzenia wydajności) niż przy użyciu rozwiązania: hover firmy Calvin. –

1

Daj div ustaloną wysokość i srcoll: hidden; i po najechaniu myszą zmieniamy przewijanie na auto;

#test_scroll{ height:300px; overflow:hidden;} 
#test_scroll:hover{overflow-y:auto;} 

Oto przykład. http://jsfiddle.net/Lywpk/

+0

dobra metoda z różnymi przeglądarkami – JasonDavis

0

Jeżeli jesteś jedyną troską o pokazywanie/ukrywanie, to kod będzie działać dobrze:

$("#leftDiv").hover(function(){$(this).css("overflow","scroll");},function(){$(this).css("overflow","hidden");}); 

Jednakże może zmodyfikować niektóre elementy w projekcie, w przypadku korzystania width = 100%, biorąc pod uwagę, że po ukryciu paska przewijania tworzy on trochę więcej miejsca na szerokość.

15

Odpowiedź ze zmiennym przepełnieniem zawiera szereg problemów, takich jak niespójna szerokość wewnętrznego bloku i wyzwalanie ponownego przepływu.

Jest łatwiejszy sposób, aby mieć taki sam skutek, że nie pociągnie za sobą reflow kiedykolwiek: using visibility mienia i zagnieżdżonych bloków:

.scrollbox { 
    width: 10em; 
    height: 10em; 
    overflow: auto; 
    visibility: hidden; 
} 
.scrollbox-content, 
.scrollbox:hover { 
    visibility: visible; 
} 

Oto długopis z przykładu roboczego: http://codepen.io/kizu/pen/OyzGXY

Innym cechą tej metody jest to, że visibility można animować, więc możemy dodać przejście do niej (patrz drugi przykład w pisaku powyżej). Dodanie przejścia byłoby lepsze dla UX: pasek przewijania nie pojawi się natychmiast po ukryciu podczas poruszania się po innym elemencie, a trudniej będzie pominąć pasek przewijania, gdy celuje się w niego kursorem myszy, ponieważ nie będzie się on ukrywał natychmiastowo dobrze.

+0

Tak więc, aby wyjaśnić: wiąże się to ze specjalnym elementem div dla paska przewijania? Czy to właściwy sposób? –

+0

Widziałem wiele pytań na ten temat, a ta odpowiedź jest naprawdę genialna. Jest kompatybilny z przeglądarką i ogólnie łatwy i niesamowity. – Rithwik

0

Jedną z takich sztuczek, w przypadku przeglądarek Webkit, jest utworzenie niewidocznego paska przewijania, a następnie wyświetlenie go po najechaniu myszą. Ta metoda nie ma wpływu na szerokość obszaru przewijania, ponieważ jest tam już miejsce na pasek przewijania.

coś takiego:

.scrolling-div { 
    &::-webkit-scrollbar { 
    background-color: transparent; 
    width: 10px; 
    } 
&::-webkit-scrollbar-thumb { 
    background-color: transparent; 
} 

}

.scrolling-div:hover { 
&::-webkit-scrollbar-thumb { 
    background-color: black; 
} 

}

codepen example

Powiązane problemy