Zapytania o Media dla obrazów @2x, @3x i @4x

Staram się obsługiwać różne proporcje pikseli na obecnej stronie, którą rozwijam. Chcę również upewnić się, że podaję wszelkie wymagane prefiksy przeglądarki, aby obsługiwać najszerszą gamę urządzeń / przeglądarek w granicach rozsądku. Poza tym, używam SVG tam, gdzie to możliwe, ale potrzebuję rozwiązania dla obrazów fotograficznych. Idealnie, chciałbym podać:

  1. @ 1x image (Pixel Ratio 1.0)
  2. @ 2x image (Pixel Ratio of 1.25+)
  3. @3x image (Pixel Ratio of 2.25+)
  4. @ 4X image (Pixel Ratio of 3.25+)

Moje pytanie brzmi, jaki byłby najlepszy sposób na pisanie zapytań medialnych, aby to osiągnąć? Moim głównym zmartwieniem jest to, że moje argumenty są poprawne dla tego, co próbuję osiągnąć. Będę wdzięczny za wszelkie sugestie i Rady. Obecnie Mój kod jest następujący:

/* @1x Images (Pixel Ratio 1.0) */
#dgst_shopping_bag {background-image:url(img/shopping_bag.png);}

/* @2x Images (Pixel Ratio of 1.25+) */
@media only screen and (-o-min-device-pixel-ratio: 5/4),
       only screen and (-webkit-min-device-pixel-ratio: 1.25),
       only screen and (min-device-pixel-ratio: 1.25),
       only screen and (min-resolution: 1.25dppx) {
    #dgst_shopping_bag {background-image:url(img/[email protected]);}
}

/* @3x Images (Pixel Ratio of 2.25+) */
@media only screen and (-o-min-device-pixel-ratio: 9/4),
       only screen and (-webkit-min-device-pixel-ratio: 2.25),
       only screen and (min-device-pixel-ratio: 2.25),
       only screen and (min-resolution: 2.25dppx) {
    #dgst_shopping_bag {background-image:url(img/[email protected]);}
}

/* @4x Images (Pixel Ratio of 3.25+) */ 
@media only screen and (-o-min-device-pixel-ratio: 13/4),
       only screen and (-webkit-min-device-pixel-ratio: 3.25),
       only screen and (min-device-pixel-ratio: 3.25),
       only screen and (min-resolution: 3.25dppx) {
    #dgst_shopping_bag {background-image:url(img/[email protected]);}
}

Alternatywa 1: rozważałem użycie znacznika <picture>, aby to osiągnąć. Wiem, że możesz zapewnić alternatywną zawartość dla przeglądarek które nie wspierają <picture>, co byłoby moim głównym zmartwieniem w jego wykorzystaniu. Myślicie, że to byłaby najlepsza praktyka w dostarczaniu zdjęć dla wielu proporcji pikseli?

Author: Alexander O'Mara, 2015-02-06

2 answers

Cóż, pomijając oczywiste różnice funkcjonalne między obrazem tła a elementem obrazu wbudowanego, takim jak picture, Istnieje kilka zalet i wad między nimi.

Plusy dla obrazu inline / minusy dla background-image:

Nie ma możliwości użycia media-query dla stylu inline, więc podanie background-image wymaga zadeklarowania selektora dla elementów, które wymagają obrazów tła oddzielonych od znacznika. Komplikuje to rozwiązanie dla dynamicznie tworzonych żywioły.

Ponadto, jeśli jesteś zainteresowany tylko serwowaniem obrazów o różnych proporcjach pikseli, możesz po prostu użyć srcset atrybut znacznika img zamiast elementu picture. Element picture wymaga więcej znaczników i ma wiele funkcji, które są do tego niepotrzebne, plus srcset jest nieco lepiej obsługiwany.

Plusy dla background-image / minusy dla inline image:

Resolution-based media queries są znacznie lepiej obsługiwane niż the picture element i atrybut srcset . Niektóre przeglądarki nie obsługują obecnie ani elementu picture, ani atrybutu srcset, chociaż wsparcie jest coraz lepsze.

Nawiasem mówiąc, jeśli chcesz zmaksymalizować obsługę przeglądarki Firefox w wersjach starszych niż 16, możesz dodać selektor min--moz-device-pixel-ratio , który ma taką samą składnię jak -webkit-min-device-pixel-ratio. Oto przykład użycia CSS.

/* @2x Images (Pixel Ratio of 1.25+) */
@media only screen and (-o-min-device-pixel-ratio: 5/4),
       only screen and (-webkit-min-device-pixel-ratio: 1.25),
       only screen and (min--moz-device-pixel-ratio: 1.25),
       only screen and (min-device-pixel-ratio: 1.25),
       only screen and (min-resolution: 1.25dppx) {
    #dgst_shopping_bag {background-image:url(img/[email protected]);}
}

Najlepsza praktyka?

Najlepszą praktyką byłoby używanie zapytań o media dla miejsc potrzebujesz obrazka w tle, a srcset lub picture dla miejsc potrzebujesz obrazka w linii. Jednak w tym momencie ważniejsze może być zastanowienie się, jakie przeglądarki należy obsługiwać. Aby to zobaczyć, zobacz kompatybilne linki (prawdopodobnie biorąc pod uwagę, że wiele osób korzystających ze starszych przeglądarek prawdopodobnie używa również monitorów o standardowej rozdzielczości): {]}

 18
Author: Alexander O'Mara,
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
2016-09-30 23:48:44

Naprawdę użyj atrybutu img[srcset]. Jego poparcie jest znacznie lepsze niż stan w innej odpowiedzi. Obecne Chrome i Safari obsługują ten atrybut. A my wiemy, że Firefox 38 i IE 12 również będą go wspierać. Dodatkowo składnia pozwala na proste progresywne ulepszanie i nie trzeba pisać złożonych zapytań o media.

Tak to wygląda:

<img src="img/[email protected]" srcset="img/[email protected] 2x, img/[email protected] 3x" />

A jeśli chcesz dodać obsługę nie obsługujących przeglądarek, możesz wybrać pomiędzy inny polyfills .

Jeśli używasz polyfill, możesz zmienić znaczniki na to:

<img srcset="img/[email protected], img/[email protected] 2x, img/[email protected] 3x" />
 7
Author: alexander farkas,
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-06-24 16:30:20