Ankündigung

Einklappen
Keine Ankündigung bisher.

Menu ohne JS

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Menu ohne JS

    Mit folgendem Code kann ich ein Menu aufbauen ohne JS:

    Was mich stört ist, dass ich diese paar Codezeilen (wenns auch nicht viele sind) so oft wiederholen muss wie ich Reiter hab.
    Gibts ne Möglichkeit (nur CSS) dies zu vermeiden ?

    Code:
    body:has(input[type="radio"][value="menu1"]:checked)  .content.one { 
    display: block;
    border: 2px solid black;}

    HTML
    Code:
    <body>
    
    <menu>
      
      <input type="radio" id="menu1" name="menu" value="menu1">
      <label for="menu1">MENU-1</label>
     
      
     <input type="radio" id="menu2" name="menu" value="menu2">
      <label for="menu2">MENU-2</label>
     
      
     <input type="radio" id="menu3" name="menu" value="menu3">
      <label for="menu3">MENU-3</label>
     
    </menu>
    
     <div class="content one">
                <div class='form-row'>
                <label for='id'>Id</label>
                <input name='customer[Id]' id='id' size='10' disabled>
                <label for='created_at'>Angelegt</label>
                <input type='date' name='customer[created_at]' id='created_at' disabled> 
                <label for='last_modified'>Bearbeitet</label>
                <input type='datetime-local' name='customer[last_modified]' id='last_modified' disabled>
            </div>                                  
                                        
            <div class='form-row'>
                <label for='company'>Firma</label>
                <input type='text' name='customer[company]' id='company'>
            </div>
    
            <div class='form-row'>
                <label for='vat'>MwSt. Nr.</label>
                <input type='text' name='customer[vat]' id='vat'>
            </div>
    
            <div class='form-row'>
                <label for='salutation'>Anrede</label>
                <select name='customer[salutation]' id='salutation' required>
                    <option style='display:none'></option>
                    <option value = 'Herr'>Herr</option>
                    <option value = 'Frau'>Frau</option>
                    <option value = 'Fräulein'>Fräulein</option>
                </select>
                <label for='title'>Titel</label>
                <select name='customer[title]' id='title'>
                    <option value = ''></option>
                    <option value = 'Dr'>Dr.</option>
                    <option value = 'Professor'>Professor</option>
                    <option value = 'Professorin'>Professorin</option>
                </select>
            </div>  
                                                
            <div class='form-row'>
                <label for='family_name'>Familienname</label>
                <input type='text' name='customer[family_name]' id='family_name'>
            </div>
                                                
            <div class='form-row'>
                <label for='first_name'>Vorname</label>
                <input type='text' name='customer[first_name]' id='first_name'>
            </div>
                                            
            <div class='form-row'>
                <label for='street'>Straße+Nr.</label>
                <input type='text' name='customer[street]' id='street' required>
            </div>
                                                
            <div class='form-row'>
                <label for='postal_code'>Plz</label>
                <input name='customer[postal_code]' id='postal_code' size='4' maxlength='7' required>
                <label for='city'>Stadt</label>
                <input type='text' name='customer[city]' id='city' required>
            </div>  
                                                
            <div class='form-row'>
                <label for='country_code'>Ländercode</label>
                <input oninput='this.value = this.value.toUpperCase()' name = 'customer[country_code]' id='country_code' size='1' maxlength='2' required>
                <label for='country'>Land</label>
                <select name='customer[country]' id='country'></select>
            </div>  
                                                
            <div class='form-row'>
                <label for='date_of_birth'>Geburtsdatum</label>
                <input type='date' name='customer[date_of_birth]' id='date_of_birth' >
                <label for='national_registration_number'>Nationalregisternummer</label>
                <input type='text' name='customer[national_registration_number]' id='national_registration_number'>               
            </div>
                                                
            <div class='form-row'>
                <label for='phone'>Telefon</label>
                <input type='text' name='customer[phone]' id='phone'>
            </div>
    
    </div> 
    
    <div class="content two">
    content 2
    </div> 
    
    <div class="content three">
    content 3
    </div> 
    
    </body>
    CSS
    Code:
    menu {
      display: flex;
      gap: 1em;
    }
    
    .content {display: none;}
    
    menu label {
      flex: 1;
      background-color: blue;
      color: white;
      padding: 1em;
      &:hover  {
        cursor: pointer;
        transform: scale(1.1);
        }
        
    }
    
    input[type="radio"]  {
      display: none;
      }
      
    body:has(input[type="radio"][value="menu1"]:checked)  .content.one { 
    display: block;
    border: 2px solid black;}
    
    body:has(input[type="radio"][value="menu2"]:checked)  .content.two { 
    display: block;
    border: 2px solid black;}
    
    body:has(input[type="radio"][value="menu3"]:checked)  .content.three { 
    display: block;
    border: 2px solid black;}
    
    input[type="radio"]:checked + label {background-color: black;}

  • #2
    Nach all den zahlreichen Hinweisen () hab ich mir folgendes überlegt :

    Ich teile mein Menu via Grid auf und per Klick auf den jeweiligen Menu-Reiter erscheint der passende Text, ... ABER ...
    ich hätte gern dass der jeweilige Tex (der sich im p Element befindet) immer auf der linken Seite des Grids anfängt und nicht unter dem jeweiligen aktiven Reiter.

    Müsste doch mit Grid start und Grid end zu schaffen sein, oder ?

    Kriegs aber nicht hin und Öffnen der Devil tools mit Detail des Grids hat mich ehrlich gesagt noch mehr verwirrt.

    Code:
    <menu>
    
    <div class="flex-container">
        <input type="radio" id="basicInfo" name="menu">
        <label for="basicInfo">STAMMDATEN</label>
           <p>Hier stehen Basis Daten dfdgfgfgfgffhhhgjhjhjhjhjhjhjhj</p>
     </div>
     
    <div class="flex-container"> 
        <input type="radio" id="bankInfo" name="menu">
        <label for="bankInfo">BANKDATEN</label>
         <p>Hier stehen Bank Daten hjhjhjhjhjhjhjhjhjhjhj</p>
     </div>    
     
     
    <div class="flex-container"> 
        <input type="radio" id="deliveryInfo" name="menu">
        <label for="deliveryInfo">LIEFERADRESSEN</label>
         <p>Hier stehen Lieferadressen hjzuztvgrthzjzjuukuk</p>
    
    </div>
    
    </menu>
    Code:
    * {  
      margin: 0;
      padding: 0;
    }
    
    label {
      background: blue;
      color: white;
      padding: 1em;
      &:hover { 
      cursor: pointer;
      }
    }
    
    input[type="radio"] {
      display:none;
      &:checked + label + p  {
        display: block;
        grid-column: 1 / -1;    ==========> funtzt nicht
      }
    }
    
    
    
    .flex-container {
      display: flex;
      flex-direction: column;
    }
    
    menu {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    }
        
    p {
      display: none;
    }

    Kommentar


    • #3
      moin,
      Nach all den zahlreichen Hinweisen ()
      kenn ich

      von solchen sachen hab ich leider weniger ahnung als nichts.
      alles was nicht auf der seite ist:
      https://get.foundation/sites/docs/kitchen-sink.html
      kann ich nicht.

      mein vorschlag jedoch wäre, poste es doch mal da:

      https://htmlfiddle.net/

      verlinke. kann ja sein, dass jemand on the fly damit rumspielen mag, der/die/* sich auskennt


      pS schöne adventszeit allen

      Kommentar


      • #4
        Zitat von Midget Beitrag anzeigen
        Ich teile mein Menu via Grid auf und per Klick auf den jeweiligen Menu-Reiter erscheint der passende Text, ... ABER ...
        ich hätte gern dass der jeweilige Tex (der sich im p Element befindet) immer auf der linken Seite des Grids anfängt und nicht unter dem jeweiligen aktiven Reiter.

        Müsste doch mit Grid start und Grid end zu schaffen sein, oder ?
        Nein. Die p-Elemente sind keine Kindelemente von menu und sind damit kein Teil des grid-Layouts.

        Kommentar


        • #5
          von solchen sachen hab ich leider weniger ahnung als nichts.
          dann fühl ich mich wenigstens nicht so allein

          Nein. Die p-Elemente sind keine Kindelemente von menu und sind damit kein Teil des grid-Layouts.
          ja leider nur die 3 divs sind Grid Elemente.
          Hab mal mit sub-Grid rum experimentiert, um die p Elemente zu "stretchen", hab aber kein Erfolg gehabt

          Kommentar


          • #6
            Zitat von Midget Beitrag anzeigen
            ja leider nur die 3 divs sind Grid Elemente.
            Hab mal mit sub-Grid rum experimentiert, um die p Elemente zu "stretchen", hab aber kein Erfolg gehabt
            Logisch, ein Sub-Grid wirkt ja nur innerhalb des eigenen Containers, das p kann nicht über die Grenzen des Eltern-Div hinauswachsen.

            Kommentar


            • #7
              Habs geschafft, hier meine funktionnierende Lösung :


              Code:
              <div class="menu">
                  
                      <div class="menu-title">
                          <input type="radio" id="radio1" name="menu" value="menu1">
                          <label for="radio1">REITER-1</label>
                           <div class="menu-content">
                              Content von Reiter1 blaabbbbllaaaaaaaaaaaaaaaaaaaa
                           </div>
               
                      </div>
                  
                     <div class="menu-title">
                          <input type="radio" id="radio2" name="menu" value="menu2">
                          <label for="radio2">REITER-2</label>
                          <div class="menu-content">
                              Content von Reiter2
                           </div>
                      </div>
                      
                       <div class="menu-title">
                          
                         <input type="radio" id="radio3" name="menu" value="menu3">
                          <label for="radio3">REITER-3</label>
                          <div class="menu-content">
                              Content von Reiter3
                           </div>
                        </div>
                  
                 </div>
              Code:
              * {
                margin: 0;
                padding: 0
                box-sizing: border-box;
              }
              
              .menu {
                display: flex;
              }
              
              input[type="radio"], .menu-content {
                display: none;
                }
              
              .menu-title {
                padding: 0.5em;
                flex: 1;
                background: blue;
                label {
                  color: white;
                }
                label:hover {
                  cursor: pointer;
                  font-weight: 900;
                }
              }
              
              input[type="radio"]:checked + label {
                display: block;
                background: darkblue;
                font-weight: 900;
                padding-left: 0.25em;
                + .menu-content {
                    display: block;
                    position: absolute;
                    left: 0.5em;
                    margin-top: 1em;
                  }
                }

              Kommentar

              Lädt...
              X