2 Stimmen

CSS-Ausrichtungsproblem

Ich versuche, eine Kopfzeile für eine Website zu gestalten, und ich möchte 4 Container in der Kopfzeile haben, in die ich verschiedene Benutzerelemente einfügen kann.

Die 4 Container müssen oben links, oben rechts, unten links und unten rechts innerhalb des Hauptcontainers der Kopfzeile positioniert werden.

Soweit kann ich das erreichen, was ich nicht kann, ist, dass der untere linke und der untere rechte Container mit den Böden ihrer Container auf der gleichen Höhe ausgerichtet sein müssen.

Wenn ich eine Höhe zuweisen #Bottom es funktioniert gut, aber ich will nicht, dies zu tun, da ich nicht vorhersagen kann, welche Steuerelemente auf der Seite sein wird und daher nicht wissen, welche Höhe zu setzen.

Es muss im IE7 funktionieren.

Ich hoffe, das macht alles Sinn.

Ich habe eine Beispielanwendung erstellt, um das Problem zu demonstrieren...

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
    <style type="text/css">

    .clearFloats
    {
        clear:both;
    }

    #topLeft
    {
        float:left;
        border: 1px solid blue;
        height:50px;
    }

    #topRight
    {
        float:right;
        border: 1px solid blue;
        height:50px;
    }

    #bottom
    {
        position:relative;
        border: 1px solid green;
    }

    #bottomLeft
    {
        float:left;
        border: 1px solid red;
        position:absolute;
        top:0;
    }

    #bottomRight
    {
        float:right;
        border: 1px solid red;
        position:absolute;
        top:0;
        right:0;
    }

    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <div id="topLeft">top left</div>
        <div id="topRight">top right</div>
        <div class="clearFloats" />
        <div id="bottom">
            <div id="bottomLeft">bottom left</div>
            <div id="bottomRight">bottom right<br />Some content<br />some more content</div>
            <div class="clearFloats" />
        </div>
    </div>
    </form>
</body>
</html>

3voto

Adam Bellaire Punkte 103525

Es tut mir leid, dass ich Ihnen nicht weiterhelfen kann, aber ich bin mir nicht sicher, ob dies angesichts der Einschränkungen, die Sie haben, möglich ist. Das Hauptproblem ist, dass Sie sich am unteren Rand des bottom div, aber da beide bottomRight y bottomLeft positioniert sind absolute überlaufen die Artikel den bottom div. Daher ist die Verwendung des bottom Eigenschaft richtet sie mit ihren Unterseiten an der (leeren) grünen Linie in Ihrem Beispiel aus.

Der einzige Gedanke, der mir einfällt, ist, dass Sie wissen müssen, welches Ihrer beiden Elemente höher sein wird. Sie müssen die spezifische Höhe nicht kennen, aber wenn Sie vorhersagen können, welches Element höher ist, und es festlegen ノット zu verwenden position:absolute dann funktioniert der Behälter und das andere (kleinere) Element wird an seinen Platz fallen. In Ihrem Beispiel, wenn Sie wissen, dass bottomRight wird größer sein:

#bottomLeft
{
    float:left;
    border: 1px solid red;
    position:absolute;
    bottom:0;
}

#bottomRight
{
    float:right;
    border: 1px solid red;
}

Wenn Sie nicht im Voraus wissen, was größer sein wird, weiß ich nicht, was Sie sonst tun können. Sie brauchen einige Inhalt innerhalb der bottom div, um ihm die richtige Höhe zu geben, so dass das " position: absolute; bottom: 0 "Stil wird die gewünschte Wirkung haben.

3voto

Jack Punkte 19711

Wie Adam sagte, um eine reine CSS-Lösung zu haben, müssten Sie wissen, welches untere Div mehr Text enthalten soll.

Unten habe ich javascript verwendet, um zu überprüfen, ob bottomLeft mehr Inhalt hat und dann das Styling umdrehen, wenn es tut... versuchen Sie dies unten... und dann versuchen, ändern, so dass bottomLeft mehr Inhalt hat und dann aktualisieren. Hoffentlich hilft das.

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
    <style type="text/css">

    .clearFloats
    {
        clear:both;
    }

    #topLeft
    {
        float:left;
        border: 1px solid blue;
        height:50px;
    }

    #topRight
    {
        float:right;
        border: 1px solid blue;
        height:50px;
    }

    #bottom
    {
        width:100%;
        border: 1px solid green;
        position:relative;
    }

    #bottomLeft
    {
        float:left;
        border: 1px solid red;
        position:absolute;
        bottom:0;
    }

    #bottomRight
    {
        float:right;
        border: 1px solid red;
    }

    </style>
</head>
<script type="text/javascript">

    window.onload = function() {
        var leftBot = document.getElementById('bottomLeft');
        var rightBot = document.getElementById('bottomRight');  
        //if the left is actually bigger than swap out their styling
        if (leftBot.innerHTML.length > rightBot.innerHTML.length) {
            leftBot.style.position='static';
            rightBot.style.position='absolute';
            rightBot.style.bottom = 0;
            rightBot.style.right = 0;   
        }
    }

</script>

<body >
    <form id="form1" runat="server">
    <div id="header">
        <div id="top">
            <div id="topLeft">top left</div>
            <div id="topRight">top right</div>
        </div>
        <div class="clearFloats" />
        <div id="bottom">
                <div id="bottomLeft">bottom left</div>
                <div id="bottomRight">bottom right<br />Some content<br />some more content<br/><br/>more more</div>
                <div class="clearFloats" />
        </div>
    </div>
    </form>
</body>
</html>

0voto

Adam Bellaire Punkte 103525

Ihre Positionierung zwischen bottomLeft y bottomRight ist nicht konsistent:

#bottomLeft
{
    bottom:0;
}

#bottomRight
{
    top:0;
}

Wenn Sie wollen bottomLeft sich zu verhalten wie bottomRight sollten sie die gleiche vertikale Positionierung haben. Oder sind sie beide falsch?

0voto

pixeldev Punkte 1443

Vielleicht lese ich das falsch, aber warum nicht so? *Warnwerte müssen geändert werden nur Konzept:

CSS:

#header{
  height:150px;
  width:350px;
  position:relative;
}
#header #topleft{
  position:absolute;
  top:0;
  left:0;
}
#header #topright{
  position:absolute;
  top:0;
  right:0;
}
#header #bottomleft{
  position:absolute;
  left:0;
  bottom:0;
}
#header #bottomright{
  position:absolute;
  right:0;
  bottom:0;
}

HTML:

<div id="header">
 <div id="topleft"></div>
 <div id="topright"></div>
 <div id="bottomleft"></div>
 <div id="bottomright"></div>
</div>

0voto

Simon Keep Punkte 9658

Vielen Dank an alle für ihre Zeit.

Ich habe mich für Adams Antwort entschieden, da ich im Moment vorhersagen kann, dass die Höhe des unteren rechten Containers größer sein wird als die des unteren linken, so dass dies funktionieren würde.

Mir gefällt auch die Javascript-Lösung von Jack.

Letztendlich glaube ich, dass ich versuche, hier zu flexibel zu sein. Vielleicht sollte ich eine Reihe von Benutzersteuerelementen haben, die die verschiedenen möglichen Kopfzeilen-Layouts definieren, und dann ein großes unteres Feld haben und das entsprechende Steuerelement dort einfügen. Jedes der Steuerelemente könnte dann genau so gestaltet werden, wie der Inhalt weitgehend statisch wäre.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X