2013-04-05 11 views
63

Byłoby miło owinąć style CSS dla różnych rozdzielczości w niektórych klasach css używając mniej.Fancy Media Queries z niektórymi LESS Magic

chciałbym zrobić coś takiego:

footer { 
    width: 100%; 
} 

.tablet { 
    footer { 
    width: 768px; 
    } 
} 

.desktop { 
    footer { 
    width: 940px; 
    } 
} 

Na koniec coś takiego powinno być wynikiem:

footer { 
    width: 100%; 
} 

@media screen and (min-width: 768px) { 
    footer { 
    width: 768px; 
    } 
} 

@media screen and (min-width: 992px) { 
    footer { 
    width: 940px; 
    } 
} 

.tablet może wyglądać jakoś tak:

@media screen and (min-width: 768px) { 
    .tablet { 

    } 
} 

Mam nadzieję, że ktoś ma fajny pomysł!

+0

możliwy duplikat grupowania Media Query zamiast wielu rozproszonych zapytań o media, które pasują] (http://stackoverflow.com/questions/13503862/media-query-grouping-instead-of-multiple-scattered-media-queries- that-match) – ScottS

+0

Na podstawie rozmowy w komentarzach do @zzzzBov, być może potrzebujemy nieco większej jasności w pytaniu o to, co próbujesz osiągnąć, i _how_, chcesz to osiągnąć. – ScottS

Odpowiedz

188

Oto co zrobiłem w moich projektach:

@desktop: ~"only screen and (min-width: 960px) and (max-width: 1199px)"; 
@tablet: ~"only screen and (min-width: 720px) and (max-width: 959px)"; 

@media @desktop { 
    footer { 
    width: 940px; 
    } 
} 

@media @tablet { 
    footer { 
    width: 768px; 
    } 
} 

To pozwala zdefiniować tylko zapytania multimedialne raz i można go używać w całym swoim mniejszych plików. Również trochę łatwiejsze do odczytania. :)

+11

Używam tego w każdym projekcie teraz. Chciałbym go nagrać tysiąc razy! –

+2

To jest niesamowite, dzięki @Hai! Drobnym problemem w Visual Studio jest to, że ten komunikat ostrzegawczy jest generowany na temat użycia '@ media' w pliku .less:" * Nieoczekiwany blok "@" w regule stylu * ". To nie wydaje się być problemem. –

+0

Dlaczego nie mogę przenieść '@ media' do zmiennych zdefiniowanych w linii 1 + 2? ➪ Szkoda, że ​​czysty '@tablet {...' nie rozwiązuje wtedy, podczas gdy '@media @tablet {...' (w wyniku dwukrotnego '@ media' oczywiście, jeśli zostanie przyjęty w ciągu znaków. –

96

I całkowicie zgadzam się z odpowiedzią Hai Nguyen (który został zaakceptowany), ale można je posprzątać trochę więcej, robiąc coś takiego:

@desktop: ~"only screen and (min-width: 960px) and (max-width: 1199px)"; 
@tablet: ~"only screen and (min-width: 720px) and (max-width: 959px)"; 

footer{ 
    width: 100%; 
    @media @tablet { 
    width: 768px; 
    } 
    @media @desktop { 
    width: 940px; 
    } 
} 

To w zasadzie to samo, ale pozwala gniazdo zapytania o media w oryginalnym selektorze. Zachowuje wszystkie css dla konkretnego elementu razem i sprawia, że ​​twoje style są bardziej modularne (w porównaniu z podejściem split breakpoint).

+0

Tak , to właśnie robię! Ale dzięki za radę :) –

+0

Po przeczytaniu tego, znalazłem to zadanie Grunt, aby zgrupować MQs po skompilowaniu zagnieżdżonych MQ: https://github.com/buildingblocks/grunt-combine- zapytania o media Usuwa wzdęcia. – Jazzy

+0

To jest ładne i czyste. Czy mogę zapytać, dlaczego ~ przed "tylko ...? –

33

+1 dla Nguyena i Yanceya - i jeszcze jeden dodatek.

Jeśli chcesz uzyskać wyraźną definicję szerokości, możesz to zrobić przy pomocy string interpolation i zmiennych dla twoich punktów przerwania. Tutaj na przykład z bootstrap - ścisłe zasady mają zapobiegać nakładaniu się definicji.

/* 
    setup 
*/ 

@xs-min: 480px; 
@sm-min: 768px; 
@md-min: 992px; 
@lg-min: 1200px; 

@xs-max: (@sm-min - 1); 
@sm-max: (@md-min - 1); 
@md-max: (@lg-min - 1); 

@phone:   ~"only screen and (min-width: @{xs-min})"; 
@phone-strict: ~"only screen and (min-width: @{xs-min}) and (max-width: @{xs-max})"; 
@tablet:   ~"only screen and (min-width: @{sm-min})"; 
@tablet-strict: ~"only screen and (min-width: @{sm-min}) and (max-width: @{sm-max})"; 
@desktop:  ~"only screen and (min-width: @{md-min})"; 
@desktop-strict: ~"only screen and (min-width: @{md-min}) and (max-width: @{md-max})"; 
@large:   ~"only screen and (min-width: @{lg-min})"; 

/* 
    usage 
*/ 

footer{ 
    width: 100%; 
    @media @tablet { 
     width: 768px; 
    } 
    @media @desktop { 
     width: 940px; 
    } 
} 
+1

Świetny sposób na zarządzanie zapytaniami o media .Dziękuję! –

+0

Co to jest" krasomówstwo ", z tego, co napisałeś, nie jestem Czy jest jakieś źródło, które możesz wskazać mi do dalszej lektury na ten temat? – Kevkong

+1

W rzeczywistości, "ścisłe zapytania" są dla wygody i powinny być używane tylko, jeśli chcesz, aby Twój CSS zastosował się do pojedynczego tylko zasięg ekranu, kiedy używasz moba pierwszy (np. zobacz: http://zellwk.com/blog/how-to-write-mobile-first-css/), chciałbym powiedzieć, że ich użycie jest prawdopodobnie trochę zapachową konstrukcją i zwykle staram się ich unikać. Ale w zależności od okoliczności możesz chcieć, aby jakiś (ciężki) styl CSS był kierowany, powiedz wyłącznie "@ tablet", a nie chcesz go przesłonić, powiedz '@ desktop' i/lub' @ large'. W takich przypadkach można użyć ścisłego zapytania (tutaj '@ tablet-strict'). – SunnyRed

7

I można również łączyć zapytania mediów jak ten

@media @desktop, @tablet, @ipad{ 

//common styles... 

} 
1

jestem przy użyciu tych wstawek & zmienne

.max(@max; @rules){@media only screen and (max-width: (@max - 1)){@rules();}} 
.min(@min; @rules){@media only screen and (min-width: @min){@rules();}} 
.bw(@min; @max; @rules){@media only screen and (min-width: @min) and (max-width: (@max - 1)){@rules();}} 

@pad: 480px; 
@tab: 800px; 
@desktop: 992px; 
@hd: 1200px; 

Więc to

footer{ 
    width: 100%; 
    .bw(@tab,@desktop,{ 
     width: 768px; 
    }); 
    .min(@desktop,{ 
     width: 940px; 
    }); 
} 

staje

footer { 
    width: 100%; 
} 
@media only screen and (min-width: 800px) and (max-width: 991px) { 
    footer { 
    width: 768px; 
    } 
} 
@media only screen and (min-width: 992px) { 
    footer { 
    width: 940px; 
    } 
} 
2

Używamy konfigurację takiego:

@vp_desktop: 801px; 
@vp_tablet:  800px; 
@vp_mobile:  400px; 

.OnDesktop(@rules) { @media screen and (min-width:@vp_desktop){ @rules(); } }; 
.OnTablet(@rules) { @media screen and (max-width:@vp_tablet){ @rules(); } }; 
.OnMobile(@rules) { @media screen and (max-width:@vp_mobile){ @rules(); } }; 

Wystarczy tylko ustawić zmiennych, wstawek obsłużyć resztę więc jest bardzo łatwe w utrzymaniu, a jednocześnie elastyczny:

div { 
    display: inline-block; 
    .OnTablet({ 
    display: block; 
    }); 
} 

Warto wspomnieć, że chociaż ta technika jest bardzo łatwa, jeśli źle ją wykorzystasz, Twój wynik CSS będzie pełen zapytań o media. Próbuję ograniczyć liczbę zapytań o media do 1 na punkt przerwania na plik. Gdzie plik byłby header.less lub search.less.

N.B. Ta metoda prawdopodobnie się nie skompiluje, chyba że używasz kompilatora javascript.