2013-06-11 15 views
11

Chcę dodać wyblakłą sekcję na górze mojego DIV, tak, że gdy użytkownik przewinie zawartość stopniowo zanika. Ustawiłem CSS, który to osiągnął, ale ma jeden problem. Wyblakły dział przewija zawartość, zamiast pozostać na miejscu.CSS wyblakły przekrój na górze przewijania div

Jak mogę to naprawić? Czy potrzebuję pomocy z jQuery, czy jest to możliwe przy użyciu CSS i czy będzie działać w dowolnych przeglądarkach zgodnych z CSS3? (Wiem, że nie mam poprawnych prefiksy dostawców na moich linear-gradient s jeszcze)

Oto mój kod tak daleko i fiddle:

.fadedScroller { 
    overflow: auto; 
    position: relative; 
    height: 100px; 
} 

.fadedScroller:after { 
    content: ''; 
    top: 0; 
    left: 0; 
    height: 20px; 
    right: 0; 
    background: linear-gradient(to bottom, rgba(251,251,251,1) 0%,rgba(251,251,251,0) 100%); 
    position: absolute; 
} 

Aktualizacja

I zostały zaktualizowane my fiddle podkreślić to, że przy użyciu position: fixed faktycznie nie działa jako wyblakły przekrój, pojawia się powyżej zawierającego div nie ustalony na górze.

+0

miałem podobny problem: http://stackoverflow.com/q/16396951/522479 –

+1

Do twojej aktualizacji, co do cholery jest 'display: fixed'? ;) Myślę, że masz na myśli 'position: fixed' ?! – yckart

+0

@plkart Oh yeah - literówka, zaktualizowano – Chris

Odpowiedz

9

Tworzenie drugi div trzymać nachylenie i przesunięcie go w ciągu prac zawartości div. Wiem, że jest to trochę brudne i mało intuicyjne w pisaniu, ale działa.

HTML:

<div class="fadedScroller"> 
    ... 
</div> 
<div class="fadedScroller_fade"></div> 

CSS:

.fadedScroller { 
    overflow: auto; 
    position: relative; 
    height: 100px; 
} 

.fadedScroller_fade { 
    content:''; 
    margin-top: -100px; 
    height: 40px; 
    background: linear-gradient(to bottom, rgba(251, 251, 251, 1) 0%, rgba(251, 251, 251, 0) 100%); 
    position: relative; 
} 

Demo:

http://fiddle.jshell.net/hP3wu/12/

+0

Teraz to napisałeś, wydaje się to takie oczywiste! Dzięki – Chris

+3

+1 Jest to w zasadzie ten sam wniosek, do którego doszedłem: http://fiddle.jshell.net/hP3wu/15/ - Jedną wadą jest to, że nie można kliknąć górnej części paska przewijania (w tym strzałki w górę) ponieważ nakładka jest w drodze =/ – xec

+0

Ładne rozwiązanie @xec! – Chris

4

Całkiem proste, należy position:fixed zamiast position:absolute:

.fadedScroller:after { 
    content:''; 
    position: fixed; 
    top: 0; 
    left: 0; 
    height: 20px; 
    right: 0; 
    background: linear-gradient(to bottom, rgba(251, 251, 251, 1) 0%, rgba(251, 251, 251, 0) 100%); 
} 

http://fiddle.jshell.net/hP3wu/4/

Update1

http://fiddle.jshell.net/hP3wu/7/

Update2

http://fiddle.jshell.net/hP3wu/9/

+0

Efekt blaknięcia jest bardzo osłabiony (prawie niezauważalny) dla mnie w skrzypcach. (FF21/Linux3.8.12) –

+0

@Cobra_Fast Dzieje się tak, ponieważ 'position: absolute' jest zawarty w' position: relative', więc nie znajduje się w 'top: 0' twojego okna. Dostosuj wysokość do np. '40px' :) – yckart

+2

Po nadaniu' position: fixed; 'pozycja nie jest już związana z' .fadedScroller' - http://fiddle.jshell.net/hP3wu/6/ – xec

1

To ogromny rozwiązanie obejście, więc przeprosiny, ale jest to jedyny sposób, jaki mogłem wymyślić: http://fiddle.jshell.net/hP3wu/17/

Więc najpierw zrobiłem kolejny div z class="after" bo nie mogę wybrać pseudo-element :after z JQuery

Potem zrobiłem repozycji sam div.after każdym razem zwój występuje w .fadedScrollbardiv z

$(".fadedScroller").scroll(function() { 
    $(".fadedScroller .after").css("top", $(this).scrollTop()); 
}); 
+0

+1 Jest to prawdopodobnie najlepsze działające rozwiązanie, z wyjątkiem urządzeń mobilnych, ponieważ nie wywołują zdarzenia przewijania, dopóki przewijanie nie zostanie zatrzymane. – xec

+0

@xec dziękuje, edytowałem to i nie wahałem się dodać niczego, co według ciebie powinno tam być. – pandavenger

0

http://fiddle.jshell.net/ne1baj4e/1/ To jest moja modyfikacja rozwiązania yckart's, które zmniejsza zanikanie, gdy div jest przewijany do góry.To po prostu dodaje to trochę JavaScript/jQuery:

const FADE_HEIGHT = 40; 
let oldStyle = $(`<style>.fadedScroller:after {top: -${FADE_HEIGHT}px;}</style>`).appendTo("head"); 

$(".fadedScroller").scroll(() => { 
    let offset = Math.min($(".fadedScroller").scrollTop() - FADE_HEIGHT, 0); 

    oldStyle.remove(); 

    oldStyle = $(`<style>.fadedScroller:after {top: ${offset}px;}</style>`).appendTo("head"); 
}); 

Zanikanie na dole div jest podobny z wyjątkiem musisz obliczyć przesunięcie jako

$(".fadedScroller")[0].scrollHeight - $(".fadedScroller")[0].clientHeight - $(".fadedScroller")[0].scrollTop 
Powiązane problemy