Jak należy zarządzać zapytaniami CSS3 Media Queries?

Ponieważ istnieje wiele sposobów na implementację zapytań CSS3 do strony internetowej, chciałbym wiedzieć, który z nich jest zalecany przez bardziej doświadczonych projektantów stron internetowych. Myślę o kilku:

1. Wszystko w jednym arkuszu stylów

Istnieje domyślny styl, który odnosi się do wszystkich szerokości ekranu, a zapytania o media, które dotyczą tylko niższych szerokości ekranu i zastępują domyślne, wszystko w jednym pliku. Na przykład:

HTML

<link rel="stylesheet" href="main.css">

Main.css

article
{
    width: 1000px;    
}

@media only screen and (max-width: 1000px)
{
    article
    {
        width: 700px;
    }

}

(proszę pamiętać, że to tylko przykład)

Plusy:

  • domyślny styl dotyczy starszych przeglądarek
  • wymagane jest tylko jedno żądanie HTTP

Wady:

  • robi bałagan z dużą ilością kodu
  • niektóre przeglądarki będą musiały pobrać kod, który nie będzie stosowany

2. Osobne Arkusze Stylów

Tam są osobnymi arkuszami stylów zawierającymi Pełny kod dopasowany do każdej szerokości ekranu. Przeglądarki ładują tylko tę, która ma zastosowanie. Na przykład:

HTML

<link rel="stylesheet" href="large-screen.css" media="screen and (min-width: 1001px)"> /*Also older browsers*/
<link rel="stylesheet" href="small-screen.css" media="only screen and (max-width: 1000px)">

Duży ekran.css

article
{
    width: 1000px;
}

Mały ekran.css

article
{
    width: 700px;
}

Plusy:

  • schludny i zorganizowany
  • wymagane jest tylko jedno żądanie HTTP
  • przeglądarki ładują tylko to, czego potrzebują

Wady:

  • (dlatego się waham aby to wykorzystać:) gdy dokonamy zmiany, która dotyczy wszystkich szerokości ekranu, zmiana musi zostać skopiowana i wklejona do odpowiednich miejsc we wszystkich arkuszach stylów.

3. Osobne arkusze stylów, jeden globalny arkusz stylów

To samo co #1, ale styl globalny i zapytania mediów są w osobnych arkuszach stylów. Na przykład:

HTML

<link rel="stylesheet" href="main.css">
<link rel="stylesheet" href="small-screen.css" media="only screen and (max-width: 1300px)">

Main.css

article
{
    width: 1000px;
}

Mały ekran.css

article
{
    width: 700px;
}

Plusy:

  • również schludny i zarządzalny
  • nie ma problemu z #2 przy wprowadzaniu globalnych zmian
  • styl globalny dotyczy starszych przeglądarek

Wady:

  • Mniejsze szerokości ekranu wymagają 2 żądań HTTP
Tylko o tym myślę. Jak powinny media zarządzanie zapytaniami?

Dzięki za odpowiedzi.

Author: LonelyWebCrawler, 2012-07-23

3 answers

Cóż, na pewno nie mogę twierdzić, że jestem autorytetem w tej sprawie( sam wciąż uczę się o konwencjach kodowania), ale właściwie skłaniam się ku opcji #1 - pojedynczemu arkuszowi stylów. Myślę jednak o konkretnej realizacji. Zamiast mieć jeden punkt przerwania dla każdego przypadku rozmiaru ekranu, dla którego potrzebujesz nowych stylów, sugerowałbym wiele punktów przerwania - jeden dla stylów CSS każdego modułu, w którym należy rozwiązać wiele rozmiarów ekranu.

Ah...to mogło być nieco mylące stwierdzenie. Przykład jest w porządku...

Zamiast czegoś w rodzaju:

/*default styles:*/
/*header styles*/
.header-link{  ...  }
.header-link:active{  ...  }
.header-image{  ...  }
.header-image-shown{  ...  }
.header-table-cell{  ...  }

/*content styles*/
.content-link{  ...  }
.content-link:active{  ...  }
.content-image{  ...  }
.content-image-shown{  ...  }
.content-table-cell{  ...  }

/*footer styles*/
.footer-link{  ...  }
.footer-link:active{  ...  }
.footer-image{  ...  }
.footer-image-shown{  ...  }
.footer-table-cell{  ...  }

/*alternate styles for smaller screens:*/
@media only screen and (max-width: 1000px){
    /*header styles*/
    .header-link{  ...  }
    .header-image{  ...  }
    .header-image-shown{  ...  }
    .header-table-cell{  ...  }

    /*content styles*/
    .content-link{  ...  }
    .content-image{  ...  }
    .content-image-shown{  ...  }
    .content-table-cell{  ...  }

    /*footer styles*/
    .footer-link{  ...  }
    .footer-image{  ...  }
    .footer-image-shown{  ...  }
    .footer-table-cell{  ...  }
}

Proponowałbym opcję # 1, tylko zaimplementowaną tak:

/*default header styles*/
.header-link{  ...  }
.header-link:active{  ...  }
.header-image{  ...  }
.header-image-shown{  ...  }
.header-table-cell{  ...  }

/*alternate header styles for smaller screens*/
@media only screen and (max-width: 1000px){
    .header-link{  ...  }
    .header-image{  ...  }
    .header-image-shown{  ...  }
    .header-table-cell{  ...  }
}

/*default content styles*/
.content-link{  ...  }
.content-link:active{  ...  }
.content-image{  ...  }
.content-image-shown{  ...  }
.content-table-cell{  ...  }

/*alternate content styles for smaller screens*/
@media only screen and (max-width: 1000px){
    .content-link{  ...  }
    .content-image{  ...  }
    .content-image-shown{  ...  }
    .content-table-cell{  ...  }
}

/*default footer styles*/
.footer-link{  ...  }
.footer-link:active{  ...  }
.footer-image{  ...  }
.footer-image-shown{  ...  }
.footer-table-cell{  ...  }

/*alternate footer styles for smaller screens*/
@media only screen and (max-width: 1000px){
    .footer-link{  ...  }
    .footer-image{  ...  }
    .footer-image-shown{  ...  }
    .footer-table-cell{  ...  }
}

(wszystkie klasy są elementami zastępczymi. Nie jestem zbyt kreatywny...)

Chociaż oznacza to, że będziesz robił tę samą deklarację zapytań o media wiele razy( co prowadzi do nieco więcej kodu), jest to o wiele bardziej przydatne do testowania pojedynczych modułów, które ogólnie pomogą w utrzymaniu witryny rośnie. Spróbuj dodać wiele prawdziwych stylów, więcej tagów/klas/id do podanego przeze mnie przykładu, a może dodać do nich nieco więcej białych znaków, a wkrótce zobaczysz, o ile szybciej jest zawęzić i zmienić/dołączyć style (we wszystkich rozmiarach ekranu) w implementacji pokazanej w drugiej części przykładu.

I przypisuję tę odpowiedź całkowicie informacjom z skalowalnej i modułowej architektury dla CSS , autorstwa Jonathana Snooka. (Przecież początkujący nie ma mowy tak jak ja byłbym w stanie sam wymyślić i uzasadnić taką odpowiedź!) Cytowany z jednej z wielu istotnych części tej książki,

"...zamiast mieć pojedynczy punkt przerwania, w głównym pliku CSS lub w oddzielnym arkuszu stylów zapytań o media, umieść zapytania o media wokół Stanów modułu."

Chociaż, jeśli według osobistych preferencji lub innych wolisz nie używać tego podejścia, to możesz wybrać jedną z innych opcji, które zaproponowałeś-w końcu, Sam Snook mówi, że jego książka "jest bardziej przewodnikiem stylu niż sztywnym frameworkiem" , więc nie czuj się, jakby to był standard kodowania. (Choć uważam, że tak powinno być. XD)

 28
Author: Serlite,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-25 16:17:59

Wierzę w "umieszczanie kodu tam, gdzie go oczekujesz". Jeśli styl wymaga overrulingu, chciałbym, aby mój kod, który overruluje, był jak najbardziej zbliżony do domyślnego stylu, a więc w tym samym dokumencie. W ten sposób, za rok, będę wiedział, co się dzieje, kiedy spojrzę na kod. W drugim podejściu (oddzielny plik css na punkt przerwania) będę musiał pamiętać, aby Goo szukać overruling kodu stylów w oddzielnym pliku. Żaden problem, chyba że zapomnę, że zrobiłem to w ten sposób za rok. Guess it ' s personal preferencje i przeglądarka ma to gdzieś.

 3
Author: Jorix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-05 17:09:45

Jeśli chcesz skorzystać z drugiej opcji, istnieje sposób na uniknięcie "kopiowania + wklejania" globalnych stylów, które są potrzebne zarówno dla wersji mobilnej, jak i stacjonarnej witryny, która jest veeeeeery handy i pomaga utrzymać wszystko w porządku, moim zdaniem, a to za pomocą SASS.

Mógłbyś mieć coś takiego:

> CSS Folder
> Sass folder
 - _global.scss
 - _mobile_layout.scss
 - _desktop_layout.scss
 - main_mobile.scss
 - main_desktop.scss

, które skompilują się do

> CSS Folder
 - main_mobile.css
 - main_desktop.css

Hope you find it useful ^^

 1
Author: legnaleama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-22 08:42:19