0

So I followed this tutorial on centering content, it's a two column layout. Tutorial

Here is the code for the completed product:

https://jsfiddle.net/dppttuvn/

My problem is, as soon as I change the #wrap width and then #main and #sidebar width so it fills the #wrap width, the layout completly screws up. As shown in this link:

https://jsfiddle.net/dwzvoarv/

The sidebar isn't to the right of the main section.

Can someone briefly explain why this happens and also fix it?

Thank you! (I'm still learning web development clearly lol)

4 Answers 4

1

It's because of the box-sizing. By default, browsers separate padding and width, so basically the total width of your element is padding + width.

Lets say your element is 1000px, with a padding-left: 100px. What the browser will do by default is paint the element as being 1100px because that extra padding isn't included in the width (by default).

Add this selector to the top of your stylesheet...

* {
  box-sizing: border-box;
}

...and what this is doing is telling every element on the page (thats what the * selector with no parent selectors does) and sets the box-sizing property of it to border-box, meaning that the browser will now respect the width property as the actual total width.

So now if you have a 1000px element with padding-left: 100px, then the total width will still actually be 1000px including that padding.

Sign up to request clarification or add additional context in comments.

Comments

1

You have to account for padding when you set widths. So to get 1000px you set #main to 700px and #sidebar to 300px. However since there is a 10px padding all around you have to subtract those pixels 10px left and 10px right. so your #main should be 680px and #sidebar should be 280px. Run this code in JS Fiddle and you can see it working.

         body,
     html {
        margin: 0;
        padding: 0;
        color: #000;
        background: white;
     }

     #wrap {
        width: 1000px;
        margin: 0 auto;
        background: #99c;
     }

     #header {
         padding:5px 10px;
         background:#ddd;
     }

     h1 {
         margin:0;
     }

     #nav {
         padding:5px 10px;
         background:#c99;
     }

     #main {
         float:left;
         width:680px;
         padding:10px;
         background:#9c9;
     }

     h2 {
         margin:0 0 1em;
     }

     #sidebar {
         float:right;
         width:280px;
         padding:10px;
         background:#99c;
     }

     #footer {
         clear:both;
         padding:5px 10px;
         background:#cc9;
     }

     #footer p {
         margin:0;
     }

     /* Navigation Bar */

     #nav ul {
        margin: 0;
        padding: 0;
        list-style: none;
     }

     #nav li {
        display: inline;
        margin: 0;
        padding: 0;
     }

Comments

1

That's because the actual size of the divs is width + padding + border. Use:

div{
  box-sizing:border-box;
}

To get the desired behaviour. Read more at https://developer.mozilla.org/en/docs/Web/CSS/box-sizing


Updated fiddle: https://jsfiddle.net/dwzvoarv/4/

Comments

0

Specifically for your example, you can fix it by changing the wrap width to 1040px:

   #wrap {
        width: 1040px;   /*instead of 1000px*/
    }

width of wrap = width of main + width of column + padding of main (right and left) + padding of column (right and left) = 700 + 300 + 20 + 20 = 1040px

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.