Using CSS Media Queries in Responsive Web Design

That’s right! The post of the day is going to be on how to use CSS media queries to make a responsive web page or application. The project I’m working on requires me to create a responsive events calendar application that looks good in all sized browser windows as well as mobile devices including iPhone and Android phones and tablets. This can be done very well with CSS media queries and a basic understanding of HTML and CSS. Making today’s task a little more challenging is the fact that we will be using HTML table elements. If you have any experience with HTML tables, you probably know that they can be tricky to size according to specific requirements most times. We will overcome the table cell sizing limitations in this article however.

Common Screen Sizes

One of the most important things to take into consideration when developing a fully responsive web application for both computers and mobile devices is your users screen size. What are your users likely to be using? Some will be on a PC, some on a tablet, others on an iPhone and yet others will be on an Android or other device. The ugly truth is that there are a lot of possibilities. I have found from experience that it’s best to take into consideration the most commonly used screen sizes. I program for the most common and try to make it work resonably well in the uncommon sized screens as well because roughly up to 3% of your users could be using an odd sized screen that you haven’t programmed for. While 3% may not sound very significant, think of it like this: If your site has 1000 visitors a day like mine does, then that means up to 30 people a day are viewing your site on a less-common screen size. 30 is 3% of 1000. Here are some of the latest statistics I could find on common screen sizes used:

First I want to show you common screen sizes of Mobile Devices since they are probably the fasting growing segment of 2016:

2016 Total iOS* Android Windows Others
February 5.15 % 1.08 % 3.49 % 0.42 % 0.16 %
January 5.38 % 1.17 % 3.69 % 0.37 % 0.15 %

The above information was collected by the website w3schools.com. The data represents the users of their website according to information collected by thier servers. It shows that only slightly greater than 5% of thier website viewers view thier site on a mobile device, but your site could have more because I think the w3schools website is one that developers reference a lot and developers do their work on a computer more often than on a mobile device. That may account for some of the low figures for mobile users. Now lets look at the most commone screen sizes according to rapidtables.com:

Common screen resolutions of rapidtables.com visitors (2/2014):

Screen resolution Display
ratio
Usage Screen size / type
1366×768 16:9 19.1% 14” Notebook / 15.6” Laptop / 18.5” monitor
1920×1080 16:9 9.4% 21.5” monitor / 23” monitor / 1080p TV
1280×800 8:5 8.5% 14” Notebook
320×568 9:16 6.4% 4” iPhone 5
1440×900 8:5 5.7% 19” monitor
1280×1024 5:4 5.5% 19” monitor
320×480 2:3 5.2% 3.5” iPhone
1600×900 16:9 4.6% 20” monitor
768×1024 3:4 4.5% 9.7” iPad
1024×768 4:3 3.9% 15” monitor
1680×1050 8:5 2.8% 22” monitor
360×640 9:16 2.3%
1920×1200 8:5 1.7% 24” monitor
720×1280 9:16 1.6% 4.8” Galaxy S
480×800 3:5 1.1%
1360×768 16:9 0.9%
1280×720 16:9 0.9% 720p TV

If you study the numbers above, they suggest that rapidtables.com visitors are much more likely to be on a smaller screen size device or mobile device than are w3scools.com users. I guess from reading the above data that their website has roughly up to 12% of their users using smaller screened devices such as iPhones, Androids and other mobile devices. Start working with a Seattle web developer to obtain custom and unique designs.

CSS Media Queries

I choose to use one simple type of CSS media queries in this challenge. I like to call it the max-width technique for sizing web pages at various sizes. This is due to the fact that the technique uses ony the max-width media query as you will see with the demonstration code below.

From studying the more common screen sizes, I’ve come up with a simple plan to make my calendar application look good on just about any possible screen size. Here is my rudimentary logic:

I plan to set the maximum with of the calendar to 1000 pixels and centering it on the page. By doing this I eliminate the need for any media queries for screens over 1000 px wide! As you can see from the charts above,  there are 17 screen sizes represented and 11 of them are over 1000px wide! We have already made our work a lot easier since we only have 4 other screen widths to worry about(because 3 of them have 320px wide screens). Obviously 320px is of great concern as it is one of the most common widts on mobile phones, but I’ll also take into considertion the widths of 360px, 480px, 720px and 768px. However, some will be taken care of by the same media queries as you’ll soon discover. Here are the basic rules we will go by when making out calendar application:

  • web page will be no wider than 1000px and centered.
  • first media query will be set for max-width of 800px meaning that if the page size is under 800px wide the styles inside of the media query definition will be altered.
  • A second media query set for a max-width of 500px will apply changes for any screen size under 500px down to the next media query.
  • A third media query set for a max-width of 400px will account for any screen between400px and the next media query.
  • A forth and final media query set for max-width of  320px will account for the common screen sizes of 320px and under which are the smallest group of mobile phones, so no other media queries after this one will be required.

I have outlined my logic above, now I can add my media queries to my CSS style sheet as follows:

/*add styles for screen sizes of 800px and up. These don't need to be inside of a media query because the table's width for the calendar will be set to 1000px and centered. Tables are generally flexible enough to be reduced from 1000 to 800px without any problems given it is styled and tested correctly.*/

@media(max-width: 800px) {
//add styles for screen sizes from 500 to 800px:
}

@media(max-width: 500px) {
//add styles for screen sizes from 400 to 500px:
}

@media(max-width: 400px) {
//add styles for screen sizes from 320 to 400px:
}

@media(max-width: 320px) {
//add styles for screen sizes 320px and under:
}

The above is a good way to start your CSS style sheet for a resposive design. You may find that you may not need to use one or more of the media query definitions. You may also find yourself adding one or two media query definitions. None-the-less, this is a good start.

Writing and Testing your CSS Code

When I make a responsive web page, I first make the basic page with basic CSS and no media queries. Then when the basic page is complete, I start testing it at different screen sizes by making my browser window smaller and larger and seeing how the page looks at every possible width and height. Then I add styles to media queries and edit them until the page looks good at every possible size. Finally I test on actual devices such as an iPhone, Android phone and a tablet while making final adjustments according to how the page looks on the actual devices.

How to Make a Completely Responsive Website Quickly

In today’s blog post, I’m going to show you one way you can make a completely responsive web site with six pages while only coding one HTML file and one CSS file! I will also demonstrate how to make a horizontal responsive navigation menu for your site. If you want a vertical responsive menu, you can adapt the code accordingly yourself. This tutorial also demonstrates an alternative to using image maps as I believe the method I use here for navigation menus with images works better than image maps. The advantage to using an image or several images for your navigation menu is that they respond better at different screen sizes than text does.

Here’s a link to the final product. Note that I used a very plan image for the navigation text, but you can use any type of image you want for yours. I also used a single image where you could use one for each navigation link with a little modification of the code. I am trying to say that this demonstrates the code only and the look and feel you will need to make your own because mine is ugly as it is for demonstrating code only:

http://jafty.com/ResponsiveSite.html

Using Divs Instead of Image Maps

While this tutorial is technically about doing a responsive website with a image for a navigation menu, this exact same method can be used in place of image maps because, if you’ve tried to make a responsive page that has an image map in it, you know it doesn’t work well.

Building a Responsive Navigation Menu

Starting at the top of our page, the first thing we will do is build our .html file with a top navigation menu. Okay, lets’ start our HTML:

<html>
<head>
<title>test</title>
<link rel="stylesheet" type="text/css" href="mystyle.css">
</head>
<body>
<div id="page">
<div id="header-menu-overlay">
<img src="topnav0map.png" style="width:100%;"  border="0" alt="top navigation menu"/>
<div>
    <div>
        <div><a href=""></a></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </div>
</div>
</div>
</div>
</body>
</html>

To follow along with the tutorial, copy and paste the above code into a new notepad document and save it as test.html. The first div includes an img tag in it as you can see above. Here is the actual image to give you a better idea of what I have done here. So “topnav0map.png” refers to the following image:

topnav0map.png:
topnav0map

Again, if you’re following along, right click on the above image and save it to the same directory as your test.html file. I put the image in a blue background here so you can see it because it is mostly white over a transparent layer done in Photoshop. The reason I use an image here is because it is responsive when you set the width to 100% and height to auto. This is about when I got the idea for an image map to link the items in the nav as you see them in the above image, but quickly found out that image maps do not resize well when changing either the page size or the zoom level when looking at the page live. therefore I used divs as they are more responsive when used properly with percentages as you’ll see below when I get to the CSS part.

Responsive CSS Layout

The most important part is probably the responsive CSS code. Here is what I used:

#page{
position:relative;
width:100%;
max-width:900px;
background-color:#222288;
margin:0 auto;
min-height:1200px;
margin-top:25px;
}

.header_menu_overlay{
position: absolute;
top: 100px;
left:0px;
width: 100%;
min-height: 30px;
text-align: center;
z-index: 99999;
}
.navwrap{
top:-20px;
min-height:27px;
position: relative;
}

.nav_item_wrap{
position:relative;
width:100%;
max-width:1125px;
height:27px;
border: 1px solid brown;
margin:0 auto;
}

.nav_item{
position: relative;
border: 1px solid red;
height: 33px;
display: block;
float: left;
z-index: 999;
}

.nav_item a{
width: 100%;
height: 100%;
position: relative;
display: block;
}

.nav1{
width: 7%;
margin-left: 9%;
}

.nav2{
width: 10%;
margin-left: 1%;
}

.nav3{
width: 10%;
margin-left: 1%;
}

.nav4{
width: 20%;
margin-left: 1%;
}

.nav5{
width: 19%;
margin-left: 1%;
}

.nav6{
width: 10%;
margin-left: 1%;
}

.pg{
position:relative;
width:100%;
max-width:900px;
min-width: 225px;
background-color:#8a1734;
margin:0 auto;
min-height:600px;
margin-top:125px;
}

First, I used the “page” div as a page wrapper by setting a standard 900px width which you may adjust to your needs. I also set width to 100% which is very important for responsive designs, but also notice the max-width is set to 900px this is so your page won’t go crazy-wide when you open a large browser window on a PC. If you want to always cover the width of the screen regardless, then you could remove this, but I recommend using a maximum width myself for most scenarios. Next I’ll include a short description for each CSS declaration after “page” which I just explained:

  • header_menu_overlay – is used to position the overall navigation menu where you want. You’ll see I decided to put it a hundred pixels from the top of the page, but you can put yours wherever you need it even at the bottom of the page for a footer menu if that’s what you need. the header-menu-overlay div is the one that holds the image as well as the rest of navigation divs. Be sure to set the width only of the image in this div and set that width to 100% so it is responsive.
  • navwrap – is the div that wraps the other divs we will use for our links. we set it’s position to relative and top to a negative number to force it on top of the image above it.
  • nav_item_wrap – wraps around the individual menu items and has a margin of “0 auto” so it centers the group of menu items to the rest of the page nicely.
  • nav_item – this class is set to all of the navigation item divs and is used to set their height, display and to float them left which is important for responsiveness.
  • nav_item a – is a style definition for the anchor/link tags inside of the nav_item div. Without this the links will not work. It sets the width and height to 100% of the containing element. You have to set “position: relative”, width and height for this to work.
  • nav1 – nav6 – the next six CSS declarations are used to set each individual menu item’s width and margin-left properties since they can all be different.

Add CSS Classes & Content to HTML:

Okay now we just need to add the classes above in the proper spots in our original HTML code and add some content for each page so that your new HTML page looks like this:

<!DOCTYPE html>
<html>
<head>
<title>test</title>
<link rel=”stylesheet” type=”text/css” href=”mystyle.css”>
</head>
<body>
<div id=”page”>
<div id=”header_menu_overlay”>
<img src=”topnav0map.png” style=”width:100%;” border=”0″ alt=”top navigation menu”/>
<div class=”navwrap”>
<div class=”nav_item_wrap”>
<div class=”nav_item nav1″><a href=”#pg1″></a></div>
<div class=”nav_item nav2″><a href=”#pg2″></a></div>
<div class=”nav_item nav3″><a href=”#pg3″></a></div>
<div class=”nav_item nav4″><a href=”#pg4″></a></div>
<div class=”nav_item nav5″><a href=”#pg5″></a></div>
<div class=”nav_item nav6″><a href=”#pg6″></a></div>
</div>
</div>
</div>

<div class=”pg”><a name=”pg1″>page 1</a>
<h1>Place all of your page 1 content here…</h1>
</div>

<div class=”pg”><a name=”pg2″>page 2</a>
<h1>Place all of your page 2 content here…</h1>
</div>

<div class=”pg”><a name=”pg3″>page 3</a>
<h1>Place all of your page 3 content here…</h1>
</div>

<div class=”pg”><a name=”pg4″>page 4</a>
<h1>Place all of your page 4 content here…</h1>
</div>

<div class=”pg”><a name=”pg5″>page 5</a>
<h1>Place all of your page 5 content here…</h1>
</div>

<div class=”pg”><a name=”pg6″>page 6</a>
<h1>Place all of your page 6 content here…</h1>
</div>
</div>
</body>
</html>

Now you should be done and you have a completely responsive website in no time at all! All you need to do is go back and add page code to each page’s section. Simply replace the existing code inside of the H1 tags to make your page headers and add more content below each to build out your content. If you followed the tutorial to the tee, your page should look like my finished example page here:

http://jafty.com/ResponsiveSite.html

Summary

So if you followed this tutorial, you should have learned quite a bit about responsive design. Not only should you be able to grasp how to develop a navigation menu from this article, but you should now be able to understand how to replace an inline image map with responsive divs and even how to make an entire responsive website using the techniques demonstrated here. Remember to use percentages instead of pixels for widths and even heights wherever you can and your design will be responsive and evenly laid out for all devices. Congratulations, you are now a responsive developer if you understood all of this. Good Luck!