Biorąc pod uwagę szablon, w którym HTML nie może być modyfikowany z powodu innych wymagań, w jaki sposób można wyświetlić (zmienić kolejność) jeden div
nad drugim, div
gdy nie są w tej kolejności w HTML? Oba div
zawierają dane o różnej wysokości i szerokości.
<div id="wrapper">
<div id="firstDiv">
Content to be below in this situation
</div>
<div id="secondDiv">
Content to be above in this situation
</div>
</div>
Other elements
Mamy nadzieję, że oczywistym jest, że pożądanym rezultatem jest:
Content to be above in this situation
Content to be below in this situation
Other elements
Po ustaleniu wymiarów łatwo je ustawić w razie potrzeby, ale potrzebuję pomysłów na to, kiedy treść jest zmienna. Ze względu na ten scenariusz, po prostu rozważ szerokość jako 100% w obu przypadkach.
W szczególności szukam rozwiązania opartego wyłącznie na CSS (i prawdopodobnie będzie musiało zostać spełnione inne rozwiązania, jeśli to się nie powiedzie).
Po tym są inne elementy. Wspomniano dobrą sugestię, biorąc pod uwagę ograniczony scenariusz, który pokazałem - biorąc pod uwagę, że może to być najlepsza odpowiedź, ale staram się również upewnić, że nie wpłynie to na następujące po niej elementy.
img { max-width: 100% }
nie będzie działał wewnątrz zmienionych elementów.Rozwiązanie tylko CSS (działa dla IE10 + ) - użyj
order
właściwości Flexbox :Demo: http://jsfiddle.net/hqya7q6o/596/
Więcej informacji: https://developer.mozilla.org/en-US/docs/Web/CSS/order
źródło
#flex { display: flex; flex-direction: column; }
wyświetli wiersze o szerokości 100%. jsfiddle.net/2fcj8s9etransform
pomocą szerszego wsparcia przeglądarkiJak powiedzieli inni, nie jest to coś, co chciałbyś robić w CSS. Możesz łączyć go z absolutnym pozycjonowaniem i dziwnymi marginesami, ale to po prostu nie jest solidne rozwiązanie. Najlepszym rozwiązaniem w twoim przypadku byłoby przejście na javascript. W jQuery jest to bardzo proste zadanie:
lub bardziej ogólnie:
źródło
Można to zrobić za pomocą Flexbox.
Utwórz kontener, który stosuje zarówno display: flex, jak i flex-flow: odwrócenie kolumny .
Źródła:
źródło
Nie ma absolutnie żadnego sposobu na osiągnięcie tego, co chcesz za pomocą samego CSS, przy jednoczesnym wsparciu programów użytkownika pre-flexbox ( głównie stary IE ) - chyba że :
Jeśli powyższe są prawdziwe, możesz zrobić, co chcesz, absolutnie ustawiając elementy -
Ponownie, jeśli nie wiesz, jakiej wysokości chcesz przynajmniej #firstDiv, nie możesz zrobić tego, co chcesz za pomocą samego CSS. Jeśli którakolwiek z tych treści jest dynamiczna, będziesz musiał użyć javascript.
źródło
Oto rozwiązanie:
Ale podejrzewam, że masz trochę treści, które są zgodne z div otoki…
źródło
Dzięki modułowi układu flexbox CSS3 możesz zamówić div.
źródło
Jeśli wiesz lub możesz wymusić rozmiar elementu, który ma być wyższy, możesz użyć
W swoim css i podaj divs ich pozycję.
w przeciwnym razie javascript wydaje się jedyną drogą:
lub coś podobnego.
edit: Właśnie znalazłem to, co może być przydatne: w3 document css3 move-to
źródło
Ujemne górne marginesy mogą osiągnąć ten efekt, ale należy je dostosować dla każdej strony. Na przykład ten znacznik ...
... i ten CSS ...
... pozwoli ci przeciągnąć drugi akapit powyżej pierwszego.
Oczywiście będziesz musiał ręcznie dostosować swój CSS dla różnych długości opisu, aby akapit wprowadzający przeskoczył odpowiednią ilość, ale jeśli masz ograniczoną kontrolę nad innymi częściami i pełną kontrolę nad znacznikami i CSS, może to być opcja .
źródło
Cóż, z odrobiną pozycjonowania bezwzględnego i pewnym niepewnym ustawieniem marginesu, mogę się zbliżyć, ale nie jest to idealne ani ładne:
„Margines na górze: 4em” to szczególnie paskudny bit: margines ten należy dostosować do ilości treści w pierwszymDiv. W zależności od dokładnych wymagań może to być możliwe, ale mam nadzieję, że ktoś będzie w stanie zbudować na tym solidne rozwiązanie.
Komentarz Erica na temat JavaScript powinien być prawdopodobnie kontynuowany.
źródło
Można to zrobić tylko za pomocą CSS!
Sprawdź moją odpowiedź na to podobne pytanie:
https://stackoverflow.com/a/25462829/1077230
Nie chcę podwójnie publikować mojej odpowiedzi, ale w skrócie jest to, że rodzic musi zostać elementem Flexbox. Na przykład:
(używając tylko prefiksu dostawcy Webkit tutaj.)
Następnie zamień divy, wskazując ich kolejność za pomocą:
źródło
W swoim CSS, przestaw pierwszy div przez lewy lub prawy. Unieś drugi div o lewą lub prawą stronę tak samo jak pierwszy. Zastosuj
clear: left
lubright
tak samo jak powyższe dwa div dla drugiego div.Na przykład:
źródło
Jeśli używasz tylko css, możesz użyć flex.
źródło
Szukałem sposobu, aby zmienić kolejność div tylko dla wersji mobilnej, więc mogę ładnie ją stylizować. Dzięki odpowiedzi na nick napisałem ten fragment kodu, który działał dobrze dla tego, czego chciałem, więc pomyślałem o udostępnieniu go wam:
źródło
Rozwiązanie z większą obsługą przeglądarki niż Flexbox (działa w IE≥9):
W przeciwieństwie do
display: table;
rozwiązania to rozwiązanie działa, gdy.wrapper
ma dowolną liczbę dzieci.źródło
Wystarczy użyć flex dla div div, określając
display: flex
iflex-direction : column
. Następnie użyj kolejności, aby ustalić, który z div dziecka jest pierwszyźródło
CSS naprawdę nie powinien być używany do restrukturyzacji zaplecza HTML. Jest to jednak możliwe, jeśli znasz wysokość obu elementów i czujesz się jak hack. Również zaznaczanie tekstu będzie pomieszane podczas przechodzenia między divami, ale to dlatego, że kolejność HTML i CSS jest odwrotna.
Gdzie XXX i YYY to odpowiednio wysokość firstDiv i secondDiv. Będzie to działać z końcowymi elementami, w przeciwieństwie do najwyższej odpowiedzi.
źródło
Mam znacznie lepszy kod, stworzony przeze mnie, jest tak duży, żeby pokazać obie rzeczy ... stworzyć tabelę 4x4 i wyrównać w pionie więcej niż jedną komórkę.
Nie używa żadnego hakowania IE, bez pionowego wyrównania: środek; w ogóle...
Nie służy do pionowego wyśrodkowywania tabeli, display: table-rom; display: komórka tabeli;
Wykorzystuje lewę kontenera, który ma dwa divy, jeden ukryty (pozycja nie jest poprawna, ale sprawia, że rodzic ma prawidłowy rozmiar zmiennej), jeden widoczny tuż po ukrytym, ale z górą: -50%; więc porusza się, aby poprawić pozycję.
Zobacz klasy div, które sprawiają, że podstęp: BloqueTipoContenedor BloqueTipoContenedor_VerticalmenteCentrado BloqueTipoContenido_VerticalmenteCentrado_Oculto BloqueTipoContenido_VerticalmenteCentrado_Visible
Przepraszam, że używam hiszpańskiego na nazwach zajęć (to dlatego, że mówię po hiszpańsku i jest to tak trudne, że jeśli używam angielskiego, zgubiłem się).
Pełny kod:
źródło
Trochę późno na imprezę, ale możesz też to zrobić:
źródło
Lub ustaw pozycję bezwzględną dla elementu i odsuń marginesy, deklarując je od krawędzi strony, a nie od krawędzi obiektu. Użyj%, ponieważ jest bardziej odpowiedni dla innych rozmiarów ekranu ect. W ten sposób pokonałem problem ... Dzięki, mam nadzieję, że tego właśnie szukasz ...
źródło
Tylko dla CSS rozwiązanie 1. Każda wysokość owijki powinna być stała lub 2. wysokość drugiego diva powinna być stała
źródło
źródło
To jest proste z css, po prostu użyj
display:block
iz-index
własnościOto przykład:
HTML:
CSS:
Edycja: Dobrze jest ustawić niektóre
background-color
z nich,div-s
aby prawidłowo widzieć rzeczy.źródło
Mam prosty sposób to zrobić.
źródło