🔒 Closed Css | responsive menu without any java-script

Status
Not open for further replies.

_iamkurt

Honorary Poster
Hello PHC.

After sa long graveyard of work, I would like to show you today how to create responsive menus without any javascript. By the end of this post, you should have this output below:

xi4G31.webp
BH4xiJ.webp
With that said, let us start with a simple markup shown below:
HTML:
<input type="checkbox" id="mobile-menu">
<label for="mobile-menu">Menus</label>

<nav>
      <a href="#">home</a>
      <a href="#">tech</a>
      <a href="#">news</a>
      <a href="#">media</a>
      <a href="#">contact</a>
</nav>

NsuBLI.webp
Still, I will use SCSS for easy markup and avoid confusion how the layout works. This time, let us work with mobile first approach!

The mobile-first approach is exactly as it sounds: designing for the smallest screen and working your way up. It is one of the best strategies to create either a responsive or adaptive design.

If you find this tutorial overwhelming for starters, you may bookmark this post instead, and check this out later. If you are ready, let us style our navigation on a mobile device first:
Code:
nav{
  background-color: rgba(0,0,0,0.9);
  padding: 1.5rem 0rem;

  a{
    padding: 1rem;
  }
}
Output:
ax8Snw.webp

For starters, you may be wondering why we have input and a label element. Let us used them as controls for our dropdown menu in a mobile device, see the markup below:
HTML:
<input type="checkbox" id="mobile-menu">
<label for="mobile-menu">Menus</label>
What will happen here is, if you click on label, the input tag will be checked, for example:
4dDJf6.webp
This way, we can then toggle the checkbox input by clicking the label menu. Please note, this will work if you have id set for your checkbox and a for an attribute in your label targetting the checkbox id:

<input type="checkbox" id="mobile-menu">
<label for="mobile-menu">Menus</label>

Amazing diba? Yes, I know how it feels. Now, let us hide the checkbox input, then move the label tag to the far right.
Code:
#mobile-menu{
  display: none;

   + label{
    position: absolute;
    right: 1rem;
    top: 1rem;
  }
}
Output:
JgmnzW.webp
Of course, set the color to white, for both a tag and label tag.
Code:
a, label{
  color: #fff;
  text-decoration: none;
}
Output:
a1pjbG.webp
WOW magic!

Of course, for a tags, this should be hidden, and only the "Menus" should be visible sa screen. At this point, you should have these rules below:
Code:
a, label{
  color: #fff;
  text-decoration: none;
} 

nav{
  background-color: rgba(0,0,0,0.9);
  padding: 1.5rem 0rem;

  a{
    display: none;     <<<<<<<<<< hide the a tags.
    padding: 1rem;
  }
}

#mobile-menu{
  display: none;

   + label{
    position: absolute;
    right: 1rem;
    top: 1rem;
  }
}
Output:
ufIikh.webp
Our label "Menus" is not functional at the moment, and to go about this, let us create a CSS rule when a checkbox input is checked? then show a tags inside the nav element.
Code:
#mobile-menu{
  display: none;

   + label{
    position: absolute;
    right: 1rem;
    top: 1rem;
  }
 
  &:checked{    <<<<<<<<<< ito yun.
    ~ nav a{
      display: block;
    }
  }
}
Output:
xi4G31.webp
Promising diba? All in all, we should have this rules below:
Code:
a, label{
  color: #fff;
  text-decoration: none;
}

nav{
  background-color: rgba(0,0,0,0.9);
  padding: 1.5rem 0rem;

  a{
    display: none;
    padding: 1rem;
  }
}

#mobile-menu{
  display: none;

  + label{
    position: absolute;
    right: 1rem;
    top: 1rem;
  }

  &:checked{
    ~ nav a{
      display: block;
    }
  }
}

Di maging responsive if we do not have any media queries.

What are media queries?

The @media rule is used in media queries to apply different styles for different media types/devices.

Simply, we will remove the CSS rules we place on our mobile layout, then replace with your desktop layout, after the minimum width of your browser to 600px.
Code:
@media (min-width: 600px){

  #mobile-menu{
    + label{
      display: none;
    }
  }
  nav{
    padding: 0rem;
    display: flex;
    flex-wrap: wrap;
    justify-content: center; 

    a{
      display: inline-block;
      margin: 0rem!important;
    }
  }
}
Output:

Before 600px width of your browser.
syXR52.webp
After 600px widthof your browser.
YqLP9l.webp

If you wish to see these in action, please see
You do not have permission to view the full content of this post. Log in or register now.

I hope this will help starters in some ways. More powers for future Web Devs.
 
Status
Not open for further replies.

About this Thread

  • 8
    Replies
  • 870
    Views
  • 4
    Participants
Last reply from:
_iamkurt

Trending Topics

Online now

Members online
1,024
Guests online
1,032
Total visitors
2,056

Forum statistics

Threads
2,274,739
Posts
28,957,893
Members
1,233,411
Latest member
marti
Back
Top