2013-03-11 6 views
5

Mam system siatki dla mojej strony, który został początkowo utworzony w stylu zastosowanego do każdego szóstej pozycji w siatcenth-child „kolizji” w elastycznym projektowaniu/Tworzenie siatki płynu

li:nth-child(5n+1){ margin-left:0 } 

I jestem w procesie podejmowania moja strona czułe i mam przerwania gdzie mogę określić

li:nth-child(3n+1){ margin-left:0 } 

Ale problemem jest to, że nadal interpretacji poprzedni styl 5N + 1, którego nie chcę. Jak powiedzieć CSS, aby zignorował ten styl. Albo jeszcze lepiej, w jaki sposób utworzyć płynną siatkę, aby za każdym razem, gdy przedmiot li był pierwszy z rzędu, ma on margines-lewy od 0, a wszystkie inne mają margines, powiedzmy, 25px?

+0

'li {margin-left: 25px;} li: first-child {margin -left:} '? –

+0

Niestety nie jest możliwe stylizowanie elementu pływającego, który pojawia się jako pierwszy w nowej linii. ': first-child' po prostu adresuje pierwsze dziecko w kodzie HTML, a nie w wyświetlanej linii. Czy próbowałeś zresetować "margin-left: 25px" dla ': nth-child (5n + 1)'? –

+1

Musisz zastosować ten margines (być może jako wartość ujemną) do elementu nadrzędnego. Zobacz, jak robi to Twitter za pomocą Bootstrapa. – isherwood

Odpowiedz

12

Używając marginesów ujemnych na elemencie macierzystym, można reagować bez konieczności zapytań mediów:

http://codepen.io/cimmanon/pen/dwbHi

.gallery { 
    margin: -10px 0 0 -10px; 
    overflow: hidden; 
} 

.gallery img { 
    margin: 10px 0 0 10px; 
    float: left; 
} 
+0

Uwielbiam rozwiązanie, ale nienawidzę sposobu, w jaki powinniśmy stosować hacki *, triki * lub cokolwiek innego, aby osiągnąć proste rzeczy, takie jak to ... może css powinno być przemyślane * – AgelessEssence

3

Problem z resetowanie margines na 5n + 1 to nie jestem pewien, czy 5n + 1 zastępuje 3n + 1 lub odwrotnie - bo na 15 elementu zasady te style będzie kolidować.

Są równie specyficzny, ponieważ masz do czynienia tylko z jednym :nth-child() selektora za rządów na raz, więc musisz umieścić 5n + 1 regułę przed 3n + 1 reguły w swojej przerwania, i reset Margines na jakąkolwiek jego niezerową wartość mieści się w Twojej regule 5n + 1. W ten sposób reguła 3n + 1 będzie miała pierwszeństwo dla elementu pasującego do obu reguł.

Nie ma sposobu, aby wybrać pierwszy element z wiersza za pomocą CSS, ponieważ nie ma jasnego pojęcia, co jest pierwszym elementem z rzędu. Jeśli znasz dokładny margines i nie masz zbyt wielu punktów przerwania, to jest to dobra alternatywa.

0

Spróbuj:

li:nth-child(5n+1):not(:nth-child(3n+1)){ margin-left:0 } 

:not selektor robi to, co jest napisane na opakowaniu, a nie wybierać elementy, które pasują do wyboru w środku jest wsporniki.

Ponadto, jeżeli dwie reguły zderzają się i nie mają priorytetu, zostanie użyta ta, która pojawia się jako ostatnia w CSS. To może być łatwiej po prostu wstawić li:nth-child(5n+1) po li:nth-child(3n+1) w arkuszu stylów.

EDYCJA: komentarz @ cimmanon na twoje pytanie jest bardzo dobrą alternatywną metodą.

+1

To byłoby ': not (: nth-child (3n + 1))' - 'li' jest zbędne i złamałoby selektor dla przeglądarek CSS3. Zobacz http://stackoverflow.com/questions/10711730/whats-the-difference-in-the-not-selector-between-jquery-and-css – BoltClock

+0

@BoltClock masz rację, edytuj :) – Bill

Powiązane problemy