Warum kann eine ul (mit absoluter Position) innerhalb einer li (mit relativer Position) keine automatische Größe haben?

8

EDIT: Siehe auch meine eigene Antwort unten (2016)

Zum Beispiel:

%Vor%

Dann gestylt:

%Vor%

ok. Also, ich habe das Hauptmenü, das horizontal angezeigt wird. Ich möchte auch, dass das Untermenü horizontal anzeigt. Aber aus irgendeinem Grund ändert sich die Größe der ul-Box nicht, um die gesamte li-Tags-Breite zu erreichen, so dass sie vertikal bleibt. Die Eltern-ul leiden nicht an diesem Problem. Ich könnte es schaffen, indem ich einfach eine richtige Breite zu der Kind-ul hinzufüge, aber das ist nicht die Art, die ich verwenden möchte.

Irgendeine Idee?

    
Stratboy 14.01.2011, 13:00
quelle

6 Antworten

0

Es gibt eine Dummheit: In den Untermenüs können Sie den sumbenus auf die innere Elementbreite zwingen, indem Sie einfach whitespace: no-wrap auf die inneren Elemente zwingen. Es funktioniert trotz jeder Technik oder Layout, das Sie verwenden - Haupt-LI-Elemente mit Display: Inline-Block oder moderne Flex-Layouts // und für die Subs, normale Anzeige keine / Block oder moderne CSS3 FX-Lösungen - Es ist egal. Ein rohe Beispiel kann genau das sein, in diesem Fall mit flexbox und fade / out fx für Subs (aber könnte etwas einfacher No-Flexbox oder älter sein, es ist wirklich egal):

%Vor%     
Stratboy 28.06.2016, 14:44
quelle
5

Es ist wichtig, das :hover zweimal zu haben, wenn Sie absolute Position verwenden; 1. auf der li , die die display: block auslöst, dann auf der ul , die beim Trigger angezeigt wird.
Und dann die Positionierung und das Styling getrennt halten: Ich habe die a und nicht die li

gestylt

Siehe hier: Ссылка

%Vor%

Sollte auch mit float:left funktionieren Ссылка

    
HerrSerker 14.11.2011 17:53
quelle
3

Elemente mit position: absolute nehmen die Größe ihrer untergeordneten Elemente an.

Sie können entweder width: 100%; auf der ul setzen oder left: 0; right: 0; setzen, wodurch auch die richtige Größe erreicht wird.

Vielleicht möchten Sie auch list-style:none; auf den verschachtelten ULs sowie auf der obersten Ebene setzen.

    
kapa 14.01.2011 13:05
quelle
3

Für die Person, die vorgeschlagen hat, dass Sie IDs und Klassen verwenden, ist es nicht notwendig, bis auf vielleicht die erste UL, die als "Menü" bezeichnet wird. Ich sage das, weil das, wonach Sie suchen, sehr starr und strukturiert ist.

Dies ist, was ich verstehe, was Sie erreichen möchten: Holen Sie sich ein horizontales Hauptmenü, das ein anderes horizontales Untermenü darunter zeigt, wenn Sie über das Hauptmenü "Links"

gehen

Wie hier gezeigt:

%Vor%

Ich kann Ihnen jetzt nicht sagen, wie Sie Ihre Menüs gestalten sollen. Aber wie du jetzt sehen kannst, bin ich mir nicht sicher, wie es funktionieren soll. Sollte das zweite Menü links neben dem Hauptpunkt des Hauptmenüs stehen, über dem es schwebte? Oder Soll das zweite Menü linksbündig auf das gesamte Menü ausgerichtet sein?

Wenn es der erste ist, wird der letzte Menüpunkt zu klein sein, um Links unter (ein oder zwei Max) zu haben, und wenn es die zweite Version ist, werden Leute frustriert sein, dass sie das Untermenü "verlieren" wenn Sie versuchen, die Links ganz nach links zu bewegen, wenn Sie über den letzten Menüpunkt fahren (in unserem Beispiel: Menüpunkt 3). Vertrauen Sie mir, die meisten Benutzer sind nicht so geschickt mit der Maus und vertrauen mir, die erste Version würde einfach schlecht aussehen.

So verwenden Leute vertikale Untermenüs, wenn das Hauptmenü horizontal ist, aber ich werde nicht wieder Ihre Motive in Frage stellen. Ich werde versuchen, deine Frage so gut wie möglich zu beantworten, was letztendlich der zweite Weg sein wird, der so eingerichtet wird:

%Vor%

Erstens ist Ihr Code nicht einmal so eingerichtet, dass er so funktioniert. Die Art und Weise, wie Ihr Code gerade geschrieben wird, endet wie das erste Beispiel, das ich Ihnen gezeigt habe (was, wie ich erklärt habe, sehr wenig horizontalen Platz für den letzten Menüpunkt haben wird, wenn Ihr Menü die Breite Ihrer Seite einnimmt natürlich)

Um dieses Ziel zu erreichen, müssen Sie die relative Positionierung Ihres li loswerden. Eine andere Idee, wenn Sie es aus irgendeinem Grund relativ haben müssen, ist, dass jeder Li Ihres Hauptmenüs auf einen anderen Z-Index gesetzt wird und sie linken Rand / Padding sowie rechten Rand / Padding als "passen" Sie Ihren gesamten Speisekarte. Ich finde das ein "Hack" und würde eher die relative Positionierung Ihres Li auslassen.

Die absolute Ebene ist unter Ihrem relativen Objekt verschachtelt (was auch immer es ist, in diesem Fall ist es das Menü

)
  • ) kann nur so viel Platz einnehmen, wie Sie festgelegt haben. In diesem Fall ist 100% nur die Größe des Li, unter dem es verschachtelt ist. Sie könnten es auf etwas Größer als 100% setzen, z. B. 500px, aber das würde aus zwei Gründen ein Problem verursachen: 1) Sie werden nicht in der Lage sein, alle Untermenüs auf das absolute Menü zu setzen, wie Sie es wahrscheinlich wollen, denn die absolute linke Seite des verschachtelten Elements ist nur der linke Punkt des Li, unter dem es verschachtelt ist. und 2) Das ist nicht gut, weil die Unterpunkte des rechten Menüs auf der rechten Seite des Gesamtmenüs abdriften.

    Wenn Sie das Hauptmenü relativ positionieren müssen, müssen Sie die linke Position jeder verschachtelten ul manuell individuell einstellen. Und für alle außer dem ersten wird dies eine negative Zahl sein und wird keine exakte Wissenschaft sein, da nicht alle Browser die gleiche Schriftart anzeigen (und somit geringfügige Änderungen in der Breite der Menüelemente verursachen werden, um dem entgegen zu wirken müssen Bilder für die perfekte Breite in allen Browsern aller Altersgruppen verwenden). Aber dies lenkt von der Schönheit von CSS ab, die wenige Zeilen verwendet, um mehrere Elemente zu entwerfen.

    Es wäre viel einfacher, die "relative" Positionierung aus dem Hauptmenü li zu entfernen (# main-menu & gt; ul & gt; li) und etwas unteres Padding hinzuzufügen, sonst wirst du niemals in der Lage sein zu schweben Über das Untermenü wird es jedes Mal verschwinden. Wenn ich raten müsste, was du machst und ich das CSS / HTML programmiere, würde ich es so machen:

    HTML:     

    %Vor%

    CSS:

    %Vor%

    Ich habe das in meinem eigenen Browser getestet und es scheint so zu funktionieren, wie du es willst. Inzwischen sollten Sie zwei andere Möglichkeiten kennen, um dies zu erreichen, aber mit unterschiedlichen Ergebnissen und mehr Arbeit als diese Version.

        
  • victoroux 20.11.2011 05:50
    quelle
    0

    Wenn Sie sicher sind, dass die Elemente immer in einer Zeile stehen, können Sie "position: relative" verschieben. an Eltern ul, und entfernen Sie "links: 0;" von der zweiten ul wird es tun, was Sie wollen, aber wenn es am Ende der Zeile zu viele Elemente geben wird, werden sie abgeschnitten.

    Beispiel: Ссылка

        
    Alexey Ivanov 14.11.2011 16:35
    quelle
    0

    Da Sie dies in Ihrem Code angegeben haben %Code% Es wäre am besten, wenn du #main-menu > ul > li:hover ul { display:inline-block; } machst so könnte es die volle Breite des li-Tags gehen

    %Vor%

    Dies sollte den Trick machen.

        
    Charming Prince 16.11.2011 10:14
    quelle

    Tags und Links