Potrzebuję dynamicznie ładować obrazy banerów do aplikacji HTML5 i chciałbym, aby kilka różnych wersji pasowało do szerokości ekranu. Nie mogę poprawnie określić szerokości ekranu telefonu, więc jedynym sposobem, aby to zrobić, jest dodanie obrazów tła div i użycie @media do określenia szerokości ekranu i wyświetlenia prawidłowego obrazu.
Na przykład:
<span style="background-image:particular_ad.png; @media (max-width:300px){background-image:particular_ad_small.png;}"></span>
Czy to możliwe, czy ktoś ma jakieś inne sugestie?
html
css
media-queries
Tancerz
źródło
źródło
Odpowiedzi:
Nie,
@media
reguły i zapytania multimedialne nie mogą istnieć w atrybutach stylu wbudowanego, ponieważ mogą zawierać tylkoproperty: value
deklaracje. Zgodnie ze specyfikacją :Jedynym sposobem zastosowania stylów do elementu tylko w niektórych mediach jest oddzielna reguła w arkuszu stylów, co oznacza, że musisz wymyślić selektor dla tego elementu.
Atrapa
span
selektora wyglądałaby tak, ale jeśli celujesz w bardzo konkretny element, potrzebujesz bardziej szczegółowego selektora:źródło
<style>
tag w swoim HTML. Jest to konieczne podejście w przypadku, gdy danebackground-image
są dynamicznie pobierane z bazy danych. Oczywiście w zewnętrznym arkuszu stylów nie jest do tego odpowiednie miejsce.<script>
znacznik jest często usuwany przez klientów poczty e-mail, gdy wiadomość e-mail jest przesyłana dalej, więc ludzie często używają stylów wbudowanych w wiadomościach e-mail. A to oznacza brak zapytań o media. Obecnie szukam najlepszych praktyk w tej sytuacji, ale tylko przyjaznego heads-upa.em
ws, a nie wpx
. W ten sposób nadal będzie działać rozsądnie podczas powiększania.Problem
Nie, zapytań o media nie można używać w ten sposób
Rozwiązanie
Ale jeśli chcesz zapewnić określone zachowanie możliwe do użycia w locie ORAZ responsywne, możesz użyć
style
znaczników, a nie atrybutu.ei
Zobacz kod działający na żywo w CodePen
Na przykład na moim blogu wstawiam
<style>
znacznik<head>
tuż po<link>
deklaracji dla CSS i zawiera on zawartość obszaru tekstowego dostarczonego obok rzeczywistego obszaru tekstowego, aby stworzyć dodatkową klasę w locie, gdy pisałem artykuł.Uwaga: ten
scoped
atrybut jest częścią specyfikacji HTML5. Jeśli go nie użyjesz, walidator będzie cię winił, ale przeglądarki obecnie nie obsługują prawdziwego celu: zakres zawartości<style>
tylko elementu bezpośrednio nadrzędnego i elementów potomnych tego elementu. Zakres nie jest obowiązkowy, jeśli<style>
element jest<head>
oznaczony.AKTUALIZACJA: Radzę, aby zawsze używać reguł w telefonie komórkowym, więc poprzedni kod powinien być:
źródło
background-image
ładowania strony..on-the-fly-behavior
na użycie go gdziekolwiek, ale jeśli słowo to jest ignorowane przez jakiegoś nawigatora, nie stanowi problemu. <style> może być użyte w <body> we wszystkich nawigatorach, to działa. To tylko wymóg sprawdzania poprawności w3c.scoped
jest to genialne rozwiązanie, nie jest oficjalnie obsługiwane przez żadną przeglądarkę. Mam nadzieję, że wkrótce się to zmieni.<style>
lubmedia queries
lub wszystkich funkcji HTML / CSS. Więc tak naprawdę problem jest większy. Wiem tylko, że możesz tworzyć wiadomości e-mail wyświetlane w ten sam sposób na wszystkich wiadomościach e-mail klientów (w tym Gmail) tylko z funkcją HTML4 i CSS2 (z pewnym włamaniem do programu Outlook), ale w tym przypadku nie ma zapytań o media.Style wbudowane nie mogą obecnie zawierać niczego poza deklaracjami (
property: value
parami).W sekcji dokumentu możesz używać
style
elementów o odpowiednichmedia
atrybutachhead
.źródło
Tak, możesz napisać zapytanie o media w inline-css, jeśli używasz tagu graficznego. Dla różnych rozmiarów urządzeń można uzyskać różne obrazy.
źródło
Jeśli używasz narzędzi responsywnych Bootstrap lub podobnej alternatywy, która pozwala ukryć / pokazać div w zależności od punktów przerwania, możliwe jest użycie kilku elementów i pokazanie najbardziej odpowiednich. to znaczy
źródło
Zapytania o media w atrybutach stylu nie są teraz możliwe. Ale jeśli musisz to ustawić dynamicznie za pomocą Javascript. Możesz również wstawić tę regułę za pośrednictwem JS.
To tak, jakby styl był w arkuszu stylów. Bądź więc świadomy specyficzności.
źródło
Hej, właśnie to napisałem.
Teraz możesz użyć
<div style="color: red; @media (max-width: 200px) { color: green }">
mniej więcej tego.Cieszyć się.
źródło
Próbowałem to przetestować i nie działało, ale jestem ciekawy, dlaczego Apple go używa. Byłem właśnie na https://linkmaker.itunes.apple.com/us/ i zauważyłem w wygenerowanym kodzie, który udostępnia, jeśli wybierzesz przycisk opcji „Duży przycisk”, używają wbudowanego zapytania medialnego.
Uwaga: dodano podział wierszy dla czytelności, oryginalny wygenerowany kod jest minimalizowany
źródło
Możesz użyć image-set ()
źródło
tak, możesz zrobić z javascript przez window.matchMedia
pulpit dla tekstu w kolorze czerwonym
tablet dla tekstu w kolorze zielonym
źródło
Wewnętrzne zapytania o media są możliwe przy użyciu czegoś takiego jak Breakpoint for Sass
Ten post na blogu dobrze wyjaśnia, w jaki sposób wbudowane zapytania o media są łatwiejsze do zarządzania niż oddzielne bloki: Nie ma punktu przerwania
Związana z wbudowanymi zapytaniami o media jest idea „zapytań o elementy”, kilka interesujących lektur to:
źródło
jeśli dodasz regułę do pliku print.css, nie musisz używać @media.
Odkryłem to w smarty foreach, którego używam, aby nadać niektórym elementom kolor tła.
źródło