2014-12-15 21 views
5

Mam problemy ze stałym pozycjonowaniem, zmienionym css kontenerem i przeglądarką Safari. Próbuję wyświetlić listę rozwijaną po kliknięciu elementu wewnątrz modalu. Modal nosi css transform. Aby upewnić się, że lista rozwijana jest zawsze wyświetlana nad modalem, ustawiam ją jako stałą (obliczam wartości left i top używając JS).Transformacja CSS i ustalone pozycjonowanie w Safari

Działa zgodnie z oczekiwaniami w Chrome, Firefox i Opera, ale Safari pokazuje dziwne zachowanie. According to the W3C:

Każda wartość kalkulowana żaden inny niż dla wyników transformacji w tworzeniu zarówno w kontekście układania i bloku zawierającego . Obiekt działa jako blok zawierający dla ustalonych pozycjonowanych potomków.

Tak więc stały element wewnątrz przekształconego kontenera CSS powinien być umieszczony relatywnie do tego kontenera, zamiast widoku. Wygląda jednak na to, że Safari nie zachowuje się w ten sposób. Zobacz poniższy przykład:

$(document).ready(function() { 
 
    $(".show-liste").click(function() { 
 
    $(".liste").show(); 
 
    }); 
 
});
.modale { 
 
    height: 50px; 
 
    overflow-y: scroll; 
 
    transform: translate(100px); 
 
} 
 

 
ul { 
 
    position: fixed; 
 
    left: 0px; 
 
    top: 0px; 
 
} 
 

 

 

 
/* --- Purely style related stuff ---- */ 
 

 
body { 
 
    font-size: 80%; 
 
} 
 
.modale { 
 
    position: absolute; 
 
    top: 50px; 
 
    padding: 60px; 
 
    background-color: white; 
 
    border: 1px solid #ccc; 
 
    box-shadow: 2px 2px 2px #ddd; 
 
} 
 
button { 
 
    width: 200px; 
 
} 
 
ul { 
 
    list-style-type: none; 
 
    margin-top: 0; 
 
    padding-left: 0; 
 
    width: 200px; 
 
    display: none; 
 
    box-shadow: 2px 2px 2px #ddd; 
 
} 
 
li { 
 
    background: white; 
 
    padding: 10px 20px; 
 
    border: 1px solid #eee; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div class="modale"> 
 
    <div class="row"> 
 
    <div> 
 
     <button class="show-liste">Open dropdown</button> 
 
     <ul class="liste"> 
 
     <li>Choice 1</li> 
 
     <li>Choice 2</li> 
 
     <li>Choice 3</li> 
 
     <li>Choice 4</li> 
 
     <li>Choice 5</li> 
 
     </ul> 
 
    </div> 
 
    </div> 
 
</div>

Czy macie jakiś pomysł jak to naprawić? Jakieś polyfill, jakikolwiek sposób obejść ten problem? Używanie bezwzględnego pozycjonowania to rozwiązanie, którego chciałbym uniknąć, ponieważ oznaczałoby przesunięcie listy na poziomie treści dokumentu, a następnie obsługę jej tworzenia/niszczenia, dołączonego modelu (używam AngularJS), zdarzeń itp. To naprawdę moja ostatnia deska ratunku.

+0

Coś dziwnego dzieje się z fragmentem kodu. [Tutaj jest jsFiddle tego samego kodu] (http://jsfiddle.net/mblase75/Loap9oc0/). – Blazemonger

+0

Wygląda na to, [zgodnie z W3C] (http://www.w3.org/wiki/CSS_absolute_and_fixed_positioning#Fixed_positioning), że 'position: fixed' ma zawsze być względne względem okna przeglądarki, a nie elementu zawierającego np.' absolute' is. Firefox i Chrome różnią się od oficjalnej specyfikacji, a Safari uważa, że ​​jej zachowanie jest "poprawne". – Blazemonger

+0

Cóż, tak było w rzeczywistości przed transformacją CSS. Teraz przekształcone elementy CSS3 stają się "blokiem zawierającym ustalonych pozycjonowanych potomków" (http://www.w3.org/TR/css3-transforms/#transform-property). –

Odpowiedz

1

Wierzę, że można uzyskać pożądane zachowanie w różnych przeglądarkach, używając position:absolute zamiast position:fixed.

+0

Rzeczywiście mogłem. Szukałem innych rozwiązań, ponieważ projekt, nad którym pracuję, wymagałby znacznie więcej pracy, aby użyć pozycji '' position: absolute'' do pozycjonowania elementu (musiałby skopiować węzeł DOM na poziomie katalogu głównego, dbając o jego cykl życia, wydarzenia itp., które doprowadziłyby mnie do innych kwestii). Całkowicie zapomniałem o tym wspomnieć, zaktualizuję moje pytanie. –

+0

Nie musisz w ogóle przenosić węzła DOM. Zmiana 'fixed' na' absolute' pozycjonuje '.liste' absolutnie * wewnątrz' .modale' * tak, jakbyś tego chciał. – Blazemonger

+0

Przykro mi, mój fragment nie był dokładny. Zapomniałem wspomnieć, że moje okno modalne ma stałą wysokość + '' overflow: scroll'' (dlatego potrzebuję użyć fixed lub przenieść '' .liste'' do katalogu głównego dokumentu, jeśli chcę ustawić go za pomocą '' Absolutny''. Naprawiłem moje pierwsze pytanie jeszcze raz. Przepraszam za to jeszcze raz! –