Chciałbym użyć zapytań o media, aby zmienić rozmiar elementów na podstawie rozmiaru div
elementu, w którym się znajdują. Nie mogę użyć rozmiaru ekranu, ponieważ div
jest on po prostu używany jako widżet na stronie internetowej, a jego rozmiar może się różnić.
Aktualizacja
Wygląda na to, że obecnie trwają prace: https://github.com/ResponsiveImagesCG/cq-demos
css
media-queries
Yazz.com
źródło
źródło
Odpowiedzi:
Nie, zapytania multimedialne nie są zaprojektowane do działania w oparciu o elementy na stronie. Są zaprojektowane do pracy w oparciu o urządzenia lub typy mediów (dlatego nazywane są zapytaniami o media ).
width
,height
i inne funkcje multimedialne oparte na wymiarach odnoszą się do wymiarów rzutni lub ekranu urządzenia w mediach ekranowych. Nie można ich używać do odwoływania się do określonego elementu na stronie.Jeśli musisz zastosować style w zależności od rozmiaru określonego
div
elementu na swojej stronie, będziesz musiał użyć JavaScript, aby obserwować zmiany wielkości tegodiv
elementu zamiast zapytań o media.źródło
@element
zapytań. W3C ma dobrą dokumentację dotyczącą rymu / przyczyny@media
zapytań: w3.org/TR/css3-mediaqueries/#width (ten link prowadzi do sekcji omawiającej szerokości --- szerokości typu nośnika, a nie zawartych w nim elementów)Właśnie stworzyłem podkładkę javascript, aby osiągnąć ten cel. Spójrz, jeśli chcesz, to dowód koncepcji, ale uważaj: to wczesna wersja i wciąż wymaga trochę pracy.
https://github.com/marcj/css-element-queries
źródło
min-width
odnowienia atrybutu; czy muszę ręcznie pisać listę klas css, zaznaczone elementy, włączyćmin-width
odnawianie?Zapytanie o media wewnątrz elementu iframe może działać jako zapytanie elementu. Z powodzeniem to zaimplementowałem. Pomysł zrodził się z ostatniego postu na temat Responsive Ads autorstwa Zurb. Bez Javascript!
źródło
Obecnie nie jest to możliwe w przypadku samego CSS, ponieważ @BoltClock napisał w zaakceptowanej odpowiedzi, ale można to obejść, używając JavaScript.
Utworzyłem zapytanie kontenerowe (inaczej kwerenda elementowa) prolyfill, aby rozwiązać ten problem. Działa nieco inaczej niż inne skrypty, więc nie musisz edytować kodu HTML swoich elementów. Wszystko, co musisz zrobić, to dołączyć skrypt i użyć go w swoim CSS w następujący sposób:
https://github.com/ausi/cq-prolyfill
źródło
Kilka lat temu napotkałem ten sam problem i sfinansowałem opracowanie wtyczki, która pomogłaby mi w pracy. Udostępniłem wtyczkę jako oprogramowanie typu open source, aby inni również mogli z niej skorzystać. Możesz ją pobrać na Github: https://github.com/eqcss/eqcss
Istnieje kilka sposobów zastosowania różnych responsywnych stylów w oparciu o to, co wiemy o elemencie na stronie. Oto kilka elementów zapytania, które wtyczka EQCSS pozwoli Ci pisać w CSS:
Więc jakie warunki są obsługiwane dla elastycznych stylów z EQCSS?
Zapytania dotyczące wagi
px
%
px
%
Zapytania o wysokość
px
%
px
%
Policz zapytania
Specjalne selektory
Wewnątrz zapytań o elementy EQCSS można również użyć trzech specjalnych selektorów, które pozwalają bardziej szczegółowo zastosować swoje style:
$this
(elementy odpowiadające zapytaniu)$parent
(elementy nadrzędne elementów odpowiadających zapytaniu)$root
(element główny dokumentu<html>
)Zapytania o elementy pozwalają ci skomponować układ z indywidualnie reagujących modułów projektowych, każdy z odrobiną samoświadomości tego, jak są wyświetlane na stronie.
Dzięki EQCSS możesz zaprojektować jeden widżet, który będzie wyglądał dobrze od szerokości 150 pikseli aż do 1000 pikseli, a następnie możesz śmiało upuścić ten widget na dowolnym pasku bocznym na dowolnej stronie przy użyciu dowolnego szablonu (na dowolnej stronie) i
źródło
Z perspektywy układu jest to możliwe przy użyciu nowoczesnych technik.
Składa się (jak sądzę) Heydon Pickering. Szczegółowo opisuje proces tutaj: http://www.heydonworks.com/article/the-flexbox-holy-albatross
Chris Coyier podnosi go i przegląda tutaj: https://css-tricks.com/putting-the-flexbox-albatross-to-real-use/
Aby ponownie przedstawić problem, poniżej widzimy 3 tego samego komponentu, każdy złożony z trzech pomarańczowych div oznaczonych
a
,b
ic
.Bloki dwóch drugich są wyświetlane w pionie, ponieważ są ograniczone do poziomego pomieszczenia, a górne komponenty 3 bloki są ułożone poziomo.
Wykorzystuje
flex-basis
właściwość CSS i Zmienne CSS do stworzenia tego efektu.Próbny
Artykuł Heydona zawiera 1000 słów szczegółowo go wyjaśniających i bardzo polecam lekturę.
źródło
Pytanie jest bardzo niejasne. Jak mówi BoltClock, zapytania o media znają tylko wymiary urządzenia. Można jednak używać zapytań o media w połączeniu z selektorami opuszczania w celu wykonania regulacji.
Jedyne inne rozwiązanie wymaga JS.
źródło
Jedynym sposobem, w jaki mogę myśleć, że możesz osiągnąć to, co chcesz wyłącznie za pomocą css, jest użycie pojemnika z płynem dla widgetu. Jeśli szerokość kontenera jest procentem ekranu, możesz użyć zapytań o media, aby stylizować w zależności od szerokości kontenera, ponieważ teraz będziesz wiedział dla wymiarów każdego ekranu, jakie są wymiary kontenera. Załóżmy na przykład, że decydujesz się na 50% szerokości ekranu kontenera. Następnie dla szerokości ekranu 1200px wiesz, że twój pojemnik ma 600px
źródło
Myślałem również o zapytaniach medialnych, ale potem znalazłem to:
Wystarczy utworzyć opakowanie
<div>
z wartością procentową dlapadding-bottom
:Spowoduje to, że
<div>
wysokość będzie równa 75% szerokości pojemnika (współczynnik kształtu 4: 3).Technikę tę można również łączyć z zapytaniami o media i odrobiną wiedzy ad hoc na temat układu strony, aby uzyskać jeszcze bardziej szczegółową kontrolę.
To wystarczy na moje potrzeby. Co może być wystarczające również dla twoich potrzeb.
źródło
Możesz użyć interfejsu API ResizeObserver . Nadal jest na początku, więc nie jest jeszcze obsługiwany przez wszystkie przeglądarki (ale jest kilka polifillów, które mogą ci w tym pomóc).
Zasadniczo ten interfejs API umożliwia dołączenie detektora zdarzeń do zmiany rozmiaru elementu DOM.
Demo 1 - Demo 2
źródło
W przypadku mojego zrobiłem to, ustawiając maksymalną szerokość div, dlatego dla małego widgetu nie będzie to miało wpływu, a duży widget zostanie przeskalowany ze względu na styl maksymalnej szerokości.
źródło
.widget
jest tylko próbką jako klasą div widgetu.