[gelöst] Navbar mit Flexbox angefangen und mässig Erfolg gehabt

  • Es will nicht so richtig klappen

    Hab das Tut genau befolgt diese hier aber seht selbst . Hab es mal hochgeladen

    https://my2.emess62.de/


    HTML

    CSS

    Javascript

    Code
    const toggleButton = document.getElementsByClassName("toggle-button")[0]
    const listContainer = document.getElementsByClassName("list-container")[0]
    
    toggleButton.addEventListener("click",() =>{
        listContainer.classList.toggle("active")
    })

    Das waren sechs Stunden tippen und testen

    Ich finde auch den Fehler nicht.

    Gruß und gute nacht

  • Ne, Javascript braucht keine Semikolons, auch wenns schöner ist.


    Du hast ein entscheidendes Detail vergessen:

    Code
    <script type="text/javascript" src="script.js" defer></script>

    Wo liegt da der Unterschied zu Deinem Code?


    Was bei Dir passiert:

    Die Seite lädt, er kommt zum Script-Tag, führt das Javascript aus, das nicht funktioniert weil zu diesem Zeitpunkt der Button gar noch nicht da ist.

    Hättest du wohl gemerkt, wenn du in die Entwicklerconsole des Browsers geguckt hättest.

    Dort steht:

    Code
    Uncaught TypeError: toggleButton is undefined
        <anonymous> https://my2.emess62.de/js/script.js:4

    Alternative zum defer ist das ganze in DOMContentLoaded zu packen.


    Window: DOMContentLoaded event - Web APIs | MDN
    The DOMContentLoaded event fires when the HTML document has been completely parsed, and all deferred scripts (<script defer src="…"> and <script…
    developer.mozilla.org

  • Ne, Javascript braucht keine Semikolons

    Ja deswegen auch der Zungensmiley.

    Werde nächstes Mal ein paar hintereinander machen, damit das auch jeder versteht...


    Ich hab keine bessere Antwort gegeben, da Emess genau dieses Problem mit dem Eventzeitpunkt ein paar Fragen zuvor schon hatte und ich ihm dann auch zur Konsole geraten habe...


    Dachte er kommt noch von selbst drauf.

  • Das geht ja ein wenig hektisch voran in diesem Video ;), da wundert es mich nicht, dass das eine oder andere verloren geht.

    Positiv auf jeden Fall, dass der Tutor Flex verwendet. Negativ, dass er, wie so viele, der Meinung ist, dass überall ein überflüssiger div-Container drum herum sein muss. Und dass ein a-href-Tag als Button missbraucht wird.

    Dass er die Semikolons im Javascript weg lässt ist ein wenig nachlässig, beeinträchtigt jedoch die Funktion nicht.

    Sehe ich mir das Ergebnis deines Codes an, fällt sofort folgendes auf:


    In der Desktop-Ansicht sind die Menüpunkte untereinander angeordnet. Also das flex-direction: column; in die Mediaquery hinein verschieben.


    In der Desktop-Ansicht ist der Hamburger-Button sichtbar. Also ein display: none; hinzu fügen und den Button in der Mediaquery mit display:flex; sichtbar machen.


    Haben wir dich schon auf die Entwicklerwerkzeuge deines Browsers hingewiesen? Siehe hier:

    Grundlagen/Webprojekte/testen – SELFHTML-Wiki

    Dort findest Du auch die Console, die häufig wichtige Hinweise auf Fehler liefert. In diesem Fall, dass toggleButton nicht definiert bzw. null ist. Das liegt daran, dass Du das Javascript im head einbindest, dort sind die betr. Elemente noch nicht definiert. Verschiebe die Zeile an das Ende des body:

    Code
         <script type="text/javascript" src="js/script.js" ></script>
        </body>

    Das müsste schon einiges verbessern.

  • Was Javascript angeht habe ich bisher immer fertige kopiert da ich noch kein Javascript kann. Deshalb kann ich auch nicht die Fehler die mir gezeigt würden interpretieren.

    Ist ist jetzt zwar schon einiges verbessert aber es einfach nicht klappen.

    Ich habe das script im verdacht

    Code
    const toggleButton = document.getElementsByClassName("toggle-button")[0]
    const listContainer = document.getElementsByClassName("list-container")[0]
    
    toggleButton.addEventListener("click",() =>{
        listContainer.classList.toggle("active");
    });

    teilen der überarbeitete css

    ist auch alles neu hochgeladen

  • Da hat sich ja schon einiges verbessert: Menü klappt auf und zu, d. h. das Javascript funktioniert.

    Jetzt muss noch in der Desktop-Ansicht das Menü horizontal angeordnet werden, d. h. hier das "flex-direction: column;" löschen:

    Code
    .list-container ul {
        /* flex-direction: column; */
        width: 100%;
    }

    und in der Mediaquery hinzu fügen:

    In der Desktop-Ansicht hängen jetzt die Borders ein Stück unten, das liegt daran, dass die Listenelemente sowohl padding als auch border haben. Wir müssen dies bei der Berechnung der Höhe berücksichtigen:

    Code
    nav ul li {
        height: calc(100% - 64px);
        padding: 30px;
        list-style-type: none;
        border-bottom: 4px solid rgb(42,42,42);
    }

    Letzteres gefällt mir weniger, mit Flex geht es eleganter:

    Code
    nav ul li {
        /* height: calc(100% - 64px); */
        padding: 30px;
        list-style-type: none;
        border-bottom: 4px solid transparent;
    }

    und

    Code
    nav ul {
        display: flex;
        align-items: flex-end;
    }
  • Habe deine Vorschläge umgesetzt.

    Aber es wird einfach vertikal angezeigt und es klappt bei mir garnicht.

    Es bewegt sich leider nichts.

    Also wenn ich zusammenschiebe schon dann stimmt es aber in der Desktopansicht soll es ja Horizontal ausgerichtet sein.

  • Bei mir sieht es gar nicht schlecht aus, klappt bei Klick auf den Hamburger auf und zu, mobil vertikal und Desktop horizontal. Nur die Borders in vertikaler Anordnung hängen ein wenig weit unten. Wahrscheinlich musst Du das padding-bottom ein wenig kleiner machen.

    Möglicher Weise macht dir der Cache Probleme, Du hast ja Javascript und CSS ausgelagert. Lade mal mit Strg+F5 neu, ob es dann besser wird.

  • Es scheint jetzt zu funktionieren.

    Habe es geschaft das menü rechts auszurichten. doch wie bekomme ich den .brand (Michael Schlegel) nach links mit einfach display:flex-start;

    klapp es nicht.

    Meiner Meinung nach musste dass doch auch in die <ul> was ich aber auch nicht hinbekommen habe ?(

  • flex-start wirkt nur auf die Querachse zusammen mit align-items. Bei dem was Du online hast, brauchst Du nur das flex-direction: column; bei nav zu löschen, dann bekommst Du was Du brauchst:


    align-menu.png


    Durch das space-between wird ein Zwischenraum zwischen dem Namen und der Nav erzeugt.

  • Das müsste ja schon volle breite sein. Aber mir ist aufgefallen dass meine css 2x die Regel nav hat.

    1. am Anfang dann in der @media.

    Vielleicht sollte ich es alles noch mal von Anfang an machen. Denn irgendwo habe ich einen Fehler gemacht. ?(

  • Lade doch deinen neuesten Stand noch mal hoch, sicher erkennt man dann schnell, was das Problem ist.

    Dieses ist übrigens fehlerhaft: align-items: 100%; für align-items gibt es nur wenige feste Begriffe.


    CSS hat leicht die Tendenz, unübersichtlich zu werden. Wenn Du neu anfängst bist Du wahrscheinlich irgend wann wieder da wo Du jetzt bist.

  • Du bekommst den Abstand zwischen Brand und Nav nicht weil Du Brand in das ul hinein verschoben hast.

    1. Ist das nicht valide, denn ein ul kann nur li-Element enthalten
    2. Passt es semantisch nicht weil Brand mit der Nav nichts zu tun hat.
    3. Wird es schwieriger, den Abstand zwischen Brand und Nav hinzubekommen.

    Ändere das HTML wieder zurück:

    Und um Brand mittig zu bekommen, lasse das Margin weg und zentriere es vertikal:

    Code
    .brand {
        /* margin: 20px; */
        font-size: 1.2em;
        font-weight: bold;
        color: aqua;
        /* Wir zentrieren es vertikal
        align-self wirkt nur auf dieses Element */
        align-self: center;
    }
  • Einfach das "align-self" auf "start" setzen.


    Edit:

    Mach bei deiner nav in der Desktopansicht "flex-direction: colum" weg und setze "align-items: center". Das "align-self: center" beim .brand brauchst du dann nicht mehr.

    Ich würde deinen Code aber noch folgendermaßen anpassen:

    • Beim script-Tag brauchst du kein "type=text/javascript" angeben.
    • Ich würde innerhalb des nav's nur das eigentliche Menü & den Menübutton hineinpacken. Den div komplett weg und das "Logo" über nav innerhalb des headers
    • Keinen Link für deinen Menübutton, weil sinnlos! Nimm lieber einen button-Tag.
    • Ich persönlich habe Javascript IMMER im head und nutze DOMContentLoaded zur Umsetzung. Script im body mag ich einfach nicht, aber ist nur meine Meinung... ;)


    Würde es ungefähr so machen:

    JavaScript
    document.addEventListener("DOMContentLoaded",() => {
        
        const menu_button = document.querySelector("#menu>button");
        const menu_list = document.querySelector("#menu>ul");
    
        menu_button.addEventListener("click",() => {
            menu_list.classList.toggle("active");
        });
    });

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!