Text im falschen Container

Grünschnabel

Neues Mitglied
Guten Tag,
ich habe ein, vermutlich, sehr kleines Problem, aber ich komme unglücklicherweise nicht auf die Lösung.
Folgendes Problem beschäftigt mich seit geraumer Zeit intensiv:
Ich habe einen Container, welcher ein Bild und einen Text beinhaltet. Soweit ist noch alles in Ordnung.
Anschließend habe ich einen weiteren Container. Dieser sollte eigentlich unter dem "richtigen" Container stehen, aber bedauernswerterweise, steht der allem Anschein nach mitten im erst genannten Container.
Nun zu meiner Frage: Wie bekomme ich es hin, ohne feste Abstände eingeben zu müssen, dass der2. Container ganz normal unter dem 1. erscheint?
Der Übersichtlichkeit halber, habe ich hier mal einen Haufen Screenshots eingefügt.

https://i.postimg.cc/25M1MKLy/Bild1.png
https://i.postimg.cc/VvGQZ35H/Bild2.png
https://i.postimg.cc/tg30G1Y6/Bild3.png
 
Herzlich willkommen im Forum, @Grünschnabel!
Wäre es vielleicht möglich, dass du anstatt der Bilder, den Code hier mit den entsprechenden Code-Blöcken postest? Das erleichtert es, deine Frage zu beantworten.
 
Danke für die Wilkommensgrüße.
Ich versuche mein Glück einmal.
Zuerst folgt der HTML code:


HTML:
<!DOCTYPE html>
<html lang="de">
    <head>
        <title>
            Hilfe
        </title>
        <meta charset="UTF-8" />
        <link rel="stylesheet" href="Bild.css" />
        <meta name="description" content="Hilfe" />
        <meta name="keywords" content="Hilfe" />
    </head>
    <body>
        <div>
            <img src="Bild/Bild1.jpg" class="Bild" />
            <p class="Text">Hier steht ein Text, daneben befindet sich ein Bild. Das ist so weit in Ordnung</p>
        </div>

        <div>Dieser Text soll unter dem oberen Div Container stehen, steht aber mitten drin</div>
    </body>
</html>



Und nun folgt der CSS Code:

CSS:
.Bild {
    width: 50%;
    float: right;
}

.Text {
    position: relative;
    left: 20%;
    top: 80px;
}
 
Ich hoffe, diese Visualisierung hilft dir, die Container besser zu verstehen:

(die roten linien durch div { border: 1px solid red; } )

Serviervorschlag:
<!DOCTYPE html>
<html lang="de">
    <head>
        <title>
            Hilfe
        </title>
        <meta charset="UTF-8" />
        <meta name="description" content="Hilfe" />
        <meta name="keywords" content="Hilfe" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    </head>
    <body>
        <div>
            <div class="container">
                <p class="text">
                    Hier steht ein Text, daneben befindet sich ein Bild. Das ist so weit in Ordnung.
                </p>
                <div class="bild-container">
                    <img src="https://picsum.photos/300/200" class="bild" />
                </div>
            </div>
        </div>
        <div>
            <p class="text">
                Dieser Text soll unter dem oberen Div Container stehen, steht aber mitten drin
            </p>
        </div>
    </body>
</html>

CSS:
div {
    border: 1px solid red;
}

.container {
    display: flex;
    flex-direction: row;
    margin: 20px;
}

.bild {
    width: 100%;
}

.bild-container {
    width: 50%;
    text-align: right;
}

.text {
    margin-bottom: 10px;
}

.text-container {
    width: 50%;
    text-align: left;
}

Achtung, das ist keine Musterlösung, sondern nur zusammengeklatscht. Ich kenne mich mit CSS nicht aus.
 
Danke erst einmal für die schnelle und ausführliche Antwort. Wenn ich das so übernehme steht das Bild allerdings aus einem mir unbekannten Grund immer unter dem Text aus dem ersten Container. Auch, wenn ich Float: right etc verwende. Nur wenn ich Abstände in Pixel angebe, passt das. Aber ich will keine festen Abstände angeben, da sonst auf allen anderen Geräten, Auflösungen,.. das Ganze dann vogelwild aussieht.
 
Wie bekomme ich es hin, ohne feste Abstände eingeben zu müssen, dass der2. Container ganz normal unter dem 1. erscheint?
Du stellst schon mal keine so schlechte Frage. Das Problem ist weniger der zweite Container als der erste.

Dein Code macht im Grunde genau das, was zu erwarten wäre, aber dir fehlt an dem Punkt noch ein Stück weit das grundlegende Verständnis der angewandten Techniken und das Wissen, wann und wie man sie richtig anwendet.
Kein Problem, das kommt mit der Zeit!

Wie schon gesagt, ist deine Frage an einem Punkt gar nicht so falsch. Du willst keine festen Abständen eingeben und den zweiten Container irgendwie mit viel Gefrickel unter den ersten positionieren müssen.

Das Problem ist ein relativ typischer Anfängerfehler bzw. eigentlich sind es im Wesentlichen zwei.

1. Du nutzt CSS Floats, um das Bild neben dem Text auszurichten. Das kann man grundsätzlich machen, mittlerweile gibt es aber deutlich bessere und flexiblere Mittel, um die verschiedensten Positionierungen und Layouts zu erreichen.

Die modernen Alternativen wären CSS Flexbox und/oder Grid, aber lassen wir das erstmal beiseite, da es für den konkreten Fall wahrscheinlich zu viele Fragen aufwirft und dich eventuell mehr verwirrt als dass es dir hilft. Trotzdem: Für die Nahe Zukunft auf jeden Fall mit Flexbox und Grid auseinandersetzen.

Das Problem mit Floats ist, dass du damit den Dokumentenfluss beeinflusst und wenn einmal angewandt, alle nachfolgenden Elemente sich entsprechend auch gemäß dem Float anordnen. In deinem Fall werden also alle nachfolgenden Elemente nach links neben das Bild positioniert, weil das Bild mit float: right nach rechts positioniert wurde und damit dafür sorgt, dass der Dokumentenfluss sozusagen links an dem Bild vorbei fließt, wenn du verstehst, was ich meine. :D

Google ggf. für bessere Erklärungen mal nach CSS floats, dort sollte eigentlich fast überall auf die Problematik eingegangen werden.

Wie löst man das Ganze? Nun, eigentlich indem man Floats nicht mehr nutzt, aber es gibt eine Möglichkeit, um die Floats sozusagen in einem bestimmten Container zu halten und nach diesem Container den normalen Dokumentenfluss wieder herzustellen. Das Ganze nennt sich Clearfix.
Hierfür findest du online wahrscheinlich tausende unterschiedliche Lösungen, aber hier mal exemplarisch eine Lösung, die ich früher verwendet habe:

CSS:
.clearfix::after {
    content: ".";
    display: block;
    clear: both;
    font-size: 0;
    height: 0;
    visibility: hidden;
}

Letztendlich ist das einfach etwas, was man sich einmal rauskopiert und dann einfach anwenden kann.

Angewendet wird es, indem du dem Container, der sozusagen dein gefloatetes Element (in deinem Fall das Bild) beinhaltet, die entsprechende Klasse clearfix zuweist.
Das sorgt dann dafür, dass nachfolgende Elemente, die nicht gefloatet werden sollen, wieder im normalen Dokumentenfluss liegen.

Sieht dann bei dir so aus:

HTML:
<div class="clearfix">
    <img src="Bild/Bild1.jpg" class="Bild" />
    <p class="Text">Hier steht ein Text, daneben befindet sich ein Bild. Das ist so weit in Ordnung</p>
</div>

<div>Dieser Text soll unter dem oberen Div Container stehen, steht aber mitten drin</div>

2. Du nutzt absolute/relative Positionierung in einer Weise, die so nicht gedacht ist.
position: absolute respektive position: relative sind mächtige Werkzeuge, die es dir theoretisch ermöglichen, Elemente an beliebiger Stelle zu platzieren, und das auf den Pixel genau. Dafür ist die absolute/relative Positionierung aber nicht gedacht, vor allen Dingen nicht, um ganze Layouts oder die Ausrichtung von Elementen zueinander zu bestimmen, wie du es in deinem Fall machst.
Anfänger sollten im Grunde eigentlich erstmal die Finger davon lassen, da man sonst dazu neigt, die Technik falsch anzuwenden.
Bei richtiger Anwendung nutzt man absolute/relative Positionierung eigentlich nur noch für kleine Spezialfälle, aber niemals als grundsätzliche Layout-Technik.
Ein Beispiel wären Elemente, die sich überlapppen/aufeinander liegen sollen oder sonstwie sich komplett anders verhalten und außerhalb des Hauptlayouts und Dokumentenflusses liegen sollen.

Das führt uns auch zum Grund, warum der zweite Container so komisch irgendwo neben dem Bild erscheint, in Kombination mit dem Floating-Problem selbstverständlich.

Mit position: relative sagst du einem Element (in dem Fall deinem Text), es soll sich doch bitte an der gewünschten Position definiert mit left, top, usw. einfinden. Und zwar relativ zur eigentlichen, normalen Position im Dokumentenfluss/auf deiner Seite. Gleichzeitig soll dieser Platz, den das Element ursprünglich vor der relativen "Verschiebung" eingenommen hätte, reserviert werden. Dort entsteht dann praktisch eine leere Stelle, die nicht von anderen Elementen in Anspruch genommen wird.
Dies erkennt man auch daran, dass der Text des zweiten Containers nicht ganz oben am Rand steht, sondern etwas versetzt nach unten.

Hättest du absolute Positionierung verwendet, wäre kein Platz reserviert worden. Dann wäre das Element einfach aus dem Dokumentenfluss rausgenommen und nachfolgende Elemente könnten den Platz einnehmen.

Merke also, dass du mit absoluter/relativer Positionierung (und auch Floats) immer das jeweilige Element aus dem normalen Dokumentenfluss rausnimmst, sprich: es verhält sich nicht mehr wie erwartet und ordnet sich nicht einfach in die nächste "Zeile" darunter an, sondern wird damit praktisch auf eine zweite Ebene gelegt und kann dort unabhängig positioniert werden.

Wie kannst du es also besser machen?
Nun, das führt uns leider zurück zu Flexbox und Grid. Für grundlegende Layouts und Positionierungen sollte mittlerweile eigentlich (fast) immer Flexbox und/oder Grid angewandt werden.

Da @Mat schon was in eine ähnliche Richtung zusammengebastelt hat, hier mal eine abgeänderte, einfache Lösung meinerseits. Die genaue Implementierung hängt aber natürlich davon ab, wie du genau dein Text positionieren willst.

Dies wäre einfach nebeneinander:

HTML:
<div class="container">
    <p>Hier steht ein Text, daneben befindet sich ein Bild. Das ist so weit in Ordnung</p>

    <img src="//picsum.photos/800/600" />
</div>

<div><p>Dieser Text soll unter dem oberen Div Container stehen, steht aber mitten drin</p></div>

CSS:
.container {
    display: flex;
    gap: 1rem;
}

.container img {
    width: 50%;
}

Wenn du deinen Text aber z.B. innerhalb der linken Hälfte neben dem Bild zentrieren willst, könntest du Folgendes machen:

CSS:
.container {
    display: flex;
    align-items: center; /* vertikale Zentrierung */
    gap: 1rem;
}

.container p {
    text-align: center;
}

.container img {
    width: 50%;
}

Dies setzt voraus, dass dein Container nur einen Textblock enthält. Wenn du mehr brauchst, bräuchte es einen separaten Container für den Text.
 
Das ist mal eine sehr ausführliche Antwort und dazu auch noch sehr gut beschrieben. Diese bringt mich einen großen Schritt weiter, da ich jetzt weiß wo meine Probleme liegen. Nur, dass diese so massiv sind, hätte ich mir nicht erträumt :oops:. Ich werde mich dahingehend auf jeden Fall einmal mit den von dir genannten Punkten in Form von Flexbox und Grid sowie den Positionierungen tiefer beschäftigen, als es mein sehr oberflächliches HTML und CSS Buch für Dummies hergibt, um das Problem künftig auf die vonm dir genannte Weise lösen zu können.
 
Freut mich, wenn ich helfen konnte.
Falls du an irgendeiner Stelle nicht weiter kommst, kannst du ja hier im Forum fragen.

CSS macht erst so richtig Spaß, wenn man die ganzen Probleme der vergangenen Techniken hinter sich lassen kann (siehe Floats) und die modernen Mittel wie Flexbox und Grid einigermaßen beherrscht. Damit sind dann auch responsive Layouts irgendwann ein Kinderspiel. :)
 
Zurück
Oben Unten