Wie ist es bei einer Vorlage, bei der der HTML-Code aufgrund anderer Anforderungen nicht geändert werden kann, möglich, eine div
übereinander anzuzeigen (neu anzuordnen), div
wenn sie im HTML-Code nicht in dieser Reihenfolge vorliegen? Beide div
s enthalten Daten, die sich in Höhe und Breite unterscheiden.
<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
Hoffentlich ist es offensichtlich, dass das gewünschte Ergebnis ist:
Content to be above in this situation
Content to be below in this situation
Other elements
Wenn die Abmessungen festgelegt sind, ist es einfach, sie bei Bedarf zu positionieren, aber ich brauche einige Ideen, wenn der Inhalt variabel ist. Für dieses Szenario betrachten Sie bitte einfach, dass die Breite bei beiden 100% beträgt.
Ich bin speziell auf der Suche nach einer Nur-CSS-Lösung (und sie muss wahrscheinlich mit anderen Lösungen erfüllt werden, wenn dies nicht gelingt).
Es folgen weitere Elemente. Angesichts des begrenzten Szenarios, das ich demonstriert habe, wurde ein guter Vorschlag erwähnt - da dies möglicherweise die beste Antwort ist, möchte ich jedoch auch sicherstellen, dass die darauf folgenden Elemente nicht beeinflusst werden.
img { max-width: 100% }
nicht in den neu geordneten Elementen.Eine reine CSS-Lösung (funktioniert für IE10 + ) - Verwenden Sie die
order
Eigenschaft von Flexbox :Demo: http://jsfiddle.net/hqya7q6o/596/
Weitere Informationen: https://developer.mozilla.org/en-US/docs/Web/CSS/order
quelle
#flex { display: flex; flex-direction: column; }
zeigt Zeilen mit 100% Breite an. jsfiddle.net/2fcj8s9etransform
mit einem breiteren Browser-Support durchgeführt werdenWie andere gesagt haben, möchten Sie dies nicht in CSS tun. Sie können es mit absoluter Positionierung und seltsamen Rändern fummeln, aber es ist einfach keine robuste Lösung. Die beste Option in Ihrem Fall wäre, sich Javascript zuzuwenden. In jQuery ist dies eine sehr einfache Aufgabe:
oder allgemeiner:
quelle
Dies kann mit Flexbox erfolgen.
Erstellen Sie einen Container, der sowohl display: flex als auch flex-flow: column-reverse anwendet .
Quellen:
quelle
Es gibt absolut keine Möglichkeit, das, was Sie wollen, allein durch CSS zu erreichen, während Sie Pre-Flexbox-Benutzeragenten ( meistens alter IE ) unterstützen - es sei denn :
Wenn das oben Gesagte zutrifft, können Sie tun, was Sie wollen, indem Sie die Elemente absolut positionieren -
Wenn Sie die gewünschte Höhe für mindestens #firstDiv nicht kennen, können Sie das, was Sie möchten, nicht allein über CSS tun. Wenn einer dieser Inhalte dynamisch ist, müssen Sie Javascript verwenden.
quelle
Hier ist eine Lösung:
Aber ich vermute, Sie haben einige Inhalte, die dem Wrapper Div folgen ...
quelle
Mit dem CSS3-Flexbox-Layoutmodul können Sie Divs bestellen.
quelle
Wenn Sie die Größe des zu übergeordneten Elements kennen oder erzwingen können, können Sie sie verwenden
In Ihrem CSS und geben Sie den Divs ihre Position.
Andernfalls scheint Javascript der einzige Weg zu sein:
oder etwas ähnliches.
edit: Ich habe gerade das gefunden, was nützlich sein könnte: w3 document css3 move-to
quelle
Negative obere Ränder können diesen Effekt erzielen, müssen jedoch für jede Seite angepasst werden. Zum Beispiel dieses Markup ...
... und dieses CSS ...
... würde es Ihnen ermöglichen, den zweiten Absatz über den ersten zu ziehen.
Natürlich müssen Sie Ihr CSS manuell für unterschiedliche Beschreibungslängen anpassen, damit der Intro-Absatz um den entsprechenden Betrag springt. Wenn Sie jedoch nur begrenzte Kontrolle über die anderen Teile und vollständige Kontrolle über Markup und CSS haben, ist dies möglicherweise eine Option .
quelle
Nun, mit ein bisschen absoluter Positionierung und einigen zwielichtigen Randeinstellungen kann ich näher kommen, aber es ist nicht perfekt oder hübsch:
Das "margin-top: 4em" ist das besonders unangenehme Bit: Dieser Rand muss entsprechend der Menge an Inhalten im firstDiv angepasst werden. Abhängig von Ihren genauen Anforderungen ist dies möglicherweise möglich, aber ich hoffe trotzdem, dass jemand darauf aufbauen kann, um eine solide Lösung zu finden.
Erics Kommentar zu JavaScript sollte wahrscheinlich weiterverfolgt werden.
quelle
Dies ist nur mit CSS möglich!
Bitte überprüfen Sie meine Antwort auf diese ähnliche Frage:
https://stackoverflow.com/a/25462829/1077230
Ich möchte meine Antwort nicht doppelt posten, aber kurz gesagt, der Elternteil muss ein Flexbox-Element werden. Z.B:
(Verwenden Sie hier nur das Webkit-Herstellerpräfix.)
Tauschen Sie dann die Divs aus, indem Sie ihre Reihenfolge angeben mit:
quelle
Schweben Sie in Ihrem CSS das erste Div nach links oder rechts. Schweben Sie das zweite Div wie das erste nach links oder rechts. Übernehmen
clear: left
oderright
gleich wie die beiden oben genannten Divs für den zweiten Div.Beispielsweise:
quelle
Wenn Sie nur CSS verwenden, können Sie Flex verwenden.
quelle
Ich suchte nach einer Möglichkeit, die Reihenfolge der Divs nur für die mobile Version zu ändern, damit ich sie gut gestalten kann. Dank der Antwort von nickf konnte ich diesen Code erstellen, der gut für das funktionierte, was ich wollte, also dachte ich daran, ihn mit euch zu teilen:
quelle
Eine Lösung mit einer größeren Browserunterstützung als die Flexbox (funktioniert in IE≥9):
Im Gegensatz zur
display: table;
Lösung funktioniert diese Lösung, wenn.wrapper
eine beliebige Anzahl von Kindern vorhanden ist.quelle
Verwenden Sie einfach flex für das übergeordnete div, indem Sie
display: flex
und angebenflex-direction : column
. Verwenden Sie dann die Reihenfolge, um zu bestimmen, welches der untergeordneten Div zuerst kommtquelle
CSS sollte wirklich nicht zur Umstrukturierung des HTML-Backends verwendet werden. Es ist jedoch möglich, wenn Sie die Höhe beider beteiligten Elemente kennen und sich hackisch fühlen. Auch die Textauswahl wird beim Wechseln zwischen den Divs durcheinander gebracht, aber das liegt daran, dass die HTML- und CSS-Reihenfolge entgegengesetzt sind.
Wobei XXX und YYY die Höhen von firstDiv bzw. secondDiv sind. Dies funktioniert im Gegensatz zur Top-Antwort mit nachfolgenden Elementen.
quelle
Ich habe einen viel besseren Code, der von mir erstellt wurde. Er ist so groß, dass er nur beides zeigt. Erstellen Sie eine 4x4-Tabelle und richten Sie mehr als nur eine Zelle vertikal aus.
Es wird kein IE-Hack verwendet, keine vertikale Ausrichtung: Mitte; überhaupt...
Es wird nicht für die vertikale Zentrierung verwendet. Display-table, display: table-rom; Anzeige: Tabellenzelle;
Es wird der Trick eines Containers verwendet, der zwei Divs hat, einen ausgeblendeten (Position ist nicht die richtige, aber Eltern haben die richtige Variablengröße), einen direkt nach dem ausgeblendeten, aber mit oben: -50%; es ist also beweglich, die Position zu korrigieren.
Siehe div-Klassen, die den Trick machen: BloqueTipoContenedor BloqueTipoContenedor_VerticalmenteCentrado BloqueTipoContenido_VerticalmenteCentrado_Oculto BloqueTipoContenido_VerticalmenteCentrado_Visible
Bitte entschuldigen Sie, dass Sie Spanisch für Klassennamen verwenden (weil ich Spanisch spreche und dies so schwierig ist, dass ich mich verliere, wenn ich Englisch verwende).
Der vollständige Code:
quelle
Etwas spät zur Party, aber Sie können dies auch tun:
quelle
Oder legen Sie eine absolute Position für das Element fest und bearbeiten Sie die Ränder, indem Sie sie vom Rand der Seite und nicht vom Rand des Objekts aus deklarieren. Verwenden Sie%, da es besser für andere Bildschirmgrößen geeignet ist. So habe ich das Problem überwunden ... Danke, ich hoffe, es ist das, wonach Sie suchen ...
quelle
Nur für CSS-Lösung 1. Entweder sollte die Höhe des Wrappers fest sein oder 2. Die Höhe des zweiten Div sollte fest sein
quelle
quelle
Es ist einfach mit CSS, nur verwenden
display:block
undz-index
EigentumHier ist ein Beispiel:
HTML:
CSS:
Bearbeiten: Es ist gut, einige
background-color
auf diediv-s
zu setzen, um die Dinge richtig zu sehen.quelle
Ich habe einen einfachen Weg, dies zu tun.
quelle