2013-06-09 16 views
11

Używam wtyczki Snap.js - (umożliwia tworzenie przewijanych bocznych szuflad/paneli).Potrzebuję ustalonego pozycjonowanego elementu div wewnątrz bezwzględnie umieszczonego elementu div

Działa, tworząc 3 absolutnie ustawione divy, z których jeden zawiera główną treść.

Czy istnieje sposób umieszczenia elementu div ustalonego na górze okna, gdy znajduje się wewnątrz bezwzględnie umieszczonego elementu div.

W tej chwili dostaję stały div, aby przypiąć do początku bezwzględnie pozycjonowanej części div, a nie do górnej części przeglądarki. Kiedy przewijam, element div pozostaje stały na górze głównej zawartości, ale nie na oknie.

Na przykład:

<div style="position:absolute;"> 

    <div style="position:fixed;top:0"> 
     <!-- some content which needs to be pinned to top of window --> 
    </div> 

</div> 

Obecnie używam javascript, aby śledzić zwój offsetu i ręcznie ustawić górną pozycję div dziecka, które nie jest idealny pod kątem wydajności.

Każda pomoc doceniona!

+1

absolutnie usytuowana strefa ma następujący CSS zastosowano: translate3d (0 pikseli, 0 pikseli, 0 pikseli), o ile ją usunąć stałym elementem zachowuje się tak jak powinien, i jest przypięta do góry okna . Jakieś pomysły na to, dlaczego tak jest? –

+0

To właśnie pokazuje przykładowy kod. (Czy to było zamierzone?) Po ustawieniu pozycji na elemencie, usuwa on go z przepływu dokumentu i czyni go względem rzutni. Czy mówisz, że snap.js to łamie? – BjornJohnson

+0

Interesujące. czy to pomaga? http://code.google.com/p/chromium/issues/detail?id=20574 – BjornJohnson

Odpowiedz

2

Zrobiłem skrzypce pokazując mój javascript obejścia - to trema podczas przewijania w programie Internet Explorer, jakieś pomysły.

<div id="displayed-content" class="snap-content scrollable"> 
    <div><!-- regular content --></div> 
     <div><!-- fixed content --></div> 
    <div><!-- footer content --></div> 
</div> 

http://jsfiddle.net/bxRVT/

+0

Zrobiłeś tu sporo pracy. Trudno powiedzieć, jak najlepiej poprawić wydajność IE. Naprawdę jesteś w czołówce technologii CSS3. Moim pierwszym przypuszczeniem jest to, że transformacje nie grają dobrze z jQuery .scrollTop, ale byłby to cały projekt sam w sobie, aby spróbować ulepszyć to, co zrobiłeś. Dam wam głos na wysiłek! –

+0

Dzięki, używam powyższej implementacji na teraz, dopóki nie znajdę czegoś lepszego. –

0

Domyślam się trochę o tym, co staramy się robić, ale może być patrząc na coś takiego:

<div class="local-wrap"> 
    <div class="fixed"> 
     Some content which needs to be pinned to top of window 
    </div> 
    <div class="port"> 
     Regular content... 
    </div> 
</div> 

i zastosować następujące CSS:

.local-wrap { 
    position: relative; 
} 
.local-wrap .fixed { 
    position: absolute; 
    top: 0; 
    left: 0; 
    background-color: lightgray; 
    width: 100%; 
    height: 5.00em; 
} 
.local-wrap .port { 
    position: relative; 
    top: 5.00em; 
    min-height: 10em; 
    height: 15em; 
    overflow: auto; 
    border: 1px solid gray; 
    border-width: 0 1px 1px 1px; 
} 

Demo skrzypce: http://jsfiddle.net/audetwebdesign/pTJbW/

Zasadniczo, aby uzyskać stały blok w odniesieniu do elementu blokowego, należy użyć pozycjonowania bezwzględnego. Naprawiono pozycjonowanie zawsze w odniesieniu do elementu głównego lub portu widoku, więc position: fixed nie pomoże.

To, co zrobiłem, to zdefiniowanie kontenera .local-wrap, z dwoma blokami podrzędnymi, jednym, który jest umieszczony absolutnie na szczycie .local-wrap, a drugi w regularnym przepływie. Użyłem position: relative, aby ustawić go poniżej .fixed, ale górny margines również zadziałałby.

Naprawiłem kilka wysokości, aby zademonstrować przewijanie zawartości w lokalnym oknie/porcie, ale można to zmienić w zależności od projektu i aplikacji.

Zastrzeżone

nie jestem zaznajomiony z snap.js więc mogą istnieć inne czynniki do rozważenia.

Skomentuj CSS3 Transform i stałych elementów

Według specyfikacji CSS3, jeśli stosuje transformację do elementu, nazwać div.transformed, następnie div.transformed tworzy nowy kontekst układania i służy jako zawierający blok dla wszystkich zawartych w nim elementów potomnych o stałej pozycji, dlatego w scenariuszu kontekst ustalonej pozycji nie pozostaje u góry okna.

Dla porównania, patrz Mozilla Developer Network -> CSS Reference -> Transform

+0

Niestety to nie działa, ponieważ element div musi być przypięty do górnej części okna, ale będzie przewijany z oknem jako .local-wrap w twoim przykładzie przewija. Normalna metoda użycia ustalonej pozycji div działa, ale tylko wtedy, gdy transformacja css zostanie usunięta z elementu dominującego div. Czy istnieje obejście tego problemu? W tej chwili używam javascript, aby dostosować górną właściwość css dla pływającego div za każdym razem, gdy przewijane jest okno - działa to dobrze w niektórych przeglądarkach, ale jest niepewne w stosunku do innych. –

+1

Stworzyłem jsfiddle, aby zilustrować to lepiej http://jsfiddle.net/pTJbW/10/. Zmniejsz okno przeglądarki do momentu pojawienia się pasków przewijania w wynikach, podczas przewijania stałego nagłówka będzie przewijany z zawartością. Jeśli jednak usuniesz transformację css w css w treści i aktualizacji, zauważysz, że po przewinięciu nagłówek pozostaje niezmienny. –

+0

Dobre skrzypce, obraz jest teraz o wiele jaśniejszy. Jeśli rozumiem pewne rzeczy, jeśli usuniesz właściwość przekształcania CSS, snap.js nie zadziała, a to jest problem, który próbujesz ominąć. –

Powiązane problemy