Common Mistakes
Not Using a Proper CSS
Reset
Web browsers are our fickle friends. Their
inconsistencies can make any developer want to tear their hair out. But at the
end of the day, they’re what will present your website, so you better do what
you have to do to please them.
One of the sillier things browsers do is
provide default styling for HTML elements. I suppose you can’t really blame
them: what if a "webmaster" chose not to style their page? There has
to be a fallback mechanism for people who choose not to use CSS.
In any case, there’s rarely a case of two
browsers providing identical default styling, so the only real way to make sure
your styles are effective is to use a CSS reset.
What a CSS reset entails is resetting (or,
rather, setting) all the styles of all the HTML elements to a predictable
baseline value. The beauty of this is that once you include a CSS reset
effectively, you can style all the elements on your page as if they were all
the same to start with. It’s a blank slate, really.
There are many CSS reset codebases on the
web that you can incorporate into your work. I personally use a modified
version of the popular Eric Meyer reset and
Six Revisions uses a modified version of YUI
Reset CSS. You can also build your own reset if you
think it would work better.
What many of us do is utilizing a simple
universal selector margin/padding reset.
* { margin:0; padding:0; }
Though this works, it’s not a full reset.
You also need to reset, for example, borders, underlines, and colors of
elements like list items, links, and tables so that you don’t run into
unexpected inconsistencies between web browsers.
Learn more about resetting your styles via
this guide: Resetting Your Styles with CSS Reset.
Over-Qualifying Selectors
Being overly specific when selecting
elements to style is not good practice. The following selector is a perfect
example of what I’m talking about:
ul#navigation li a { ... }
Typically the structure of a primary
navigation list is a
First things first: There’s no reason for
the ul before #navigation as
an ID is already the most specific selector. Also, you don’t have to put li in
the selector syntax because all the a elements inside the
navigation are inside list items, so there’s no reason for that bit of
specificity.
Thus, you can condense that selector as:
#navigation a { ... }
This is an overly simplistic example
because you might have nested list items that you want to style differently
(i.e. #navigation
li a is different from #navigation li ul li a); but if you don’t, then there’s no need for the
excessive specificity.
I also want to talk about the need for an
ID in this situation. Let’s assume for a minute that this navigation list is
inside a header div (#header).
Let us also assume that you will have no other unordered list in the header
besides the navigation list. If that is the case, we can even remove the ID
from the unordered list in our HTML markup, and then we can select it in CSS as
such:
#header ul a { ... }
Here’s what I want you to take away from
this example: Always write your CSS selectors with the very minimum level of
specificity necessary for it to work. Including all that extra fluff may make
it look more
safe and precise, but when it comes to CSS selectors, there
are only two levels of specificity: specific,
and not specific enough.
Not Using Shorthand
Properties
Take a look at the following property list:
#selector {
margin-top: 50px;
margin-right: 0;
margin-bottom:
50px;
margin-left 0;
}
What is wrong with this picture? I hope
that alarm bells are ringing in your head as you notice how much we’re
repeating ourselves.
Fortunately, there is a solution, and it’s
using CSS shorthand
properties. The following has the same effect as the
above style declaration, but we’ve reduced our code by three lines.
#selector {
margin: 50px 0;
}
Check out this list of properties that
deals with font styles:
font-family: Helvetica;
font-size: 14px;
font-weight: bold;
line-height: 1.5;
We can condense all that into one line:
font: bold 14px/1.5 Helvetica;
We can also do this for background properties.
The following:
background-image: url(background.png);
background-repeat: repeat-y;
background-position: center top;
Can be written in shorthand CSS as such:
background: url(background.png) repeat-y center top;
Using shorthand
CSS improves efficiency and makes it easier to maintain our code. For more
information on CSS shorthand properties, check out this cheatsheet of CSS shorthand properties.
Using 0px instead of 0
Say you want to add a 20px margin to the
bottom of an element. You might use something like this:
#selector { margin: 20px 0px 20px 0px; }
Don’t. This is excessive. There’s no need
to include the px after 0. While this may seem like I’m nitpicking and that it may
not seem like much, when you’re working with a huge file, removing all those
superfluous px can
reduce the size of your file (which is never a bad thing).
Using Color Names Instead
of Hexadecimal
Declaring red for color values is the
lazy man’s #FF0000. By saying:
color: red;
You’re essentially saying that the browser
should display what it thinks red is. If you’ve learned anything from making stuff function
correctly in all browsers — and the hours of frustration you’ve accumulated
because of a stupid list-bullet misalignment that can only be seen in IE7 —
it’s that you should never let the browser decide how to display your web
pages.
Instead, you should go to the effort to
find the actual hex value for the color you’re trying to use. That way, you can
make sure it’s the same color displayed across all browsers. You can use a color cheatsheet that provides a preview
and the hex value of a color.
This may seem trivial, but when it comes to
CSS, it’s the tiny things that often lead to the big gotchas.
Redundant Selectors
My process for writing styles is to start
with all the typography, and then work on the structure, and finally on styling
all the colors and backgrounds. That’s what works for me. Since I don’t focus
on just one element at a time, I commonly find myself accidentally typing out a
redundant style declaration.
I always do a final check after I’m done so
that I can make sure that I haven’t repeated any selectors; and if I have, I’ll
merge them. This sort of mistake is fine to make while you’re developing, but
just try to make sure they don’t make it into production.
Check out this list of CSS optimizers that can help you
automate the search for inefficient and redundant selectors.
Redundant Properties
Similar to the one above, I often find
myself having to apply the same properties to multiple selectors. This could be
styling an
in the header to look exactly like the
in the footer, making the ‘s and
‘s the same size, or any number of things in between.
In the final review of my CSS, I will look
to make sure that I haven’t repeated too many properties. For example, if I see
two selectors doing the same thing, such as this:
#selector-1 {
font-style: italic;
color: #e7e7e7;
margin: 5px;
padding: 20px
}
.selector-2 {
font-style:
italic;
color: #e7e7e7;
margin: 5px;
padding: 20px
}
I will combine them, with the selectors
separated by a comma (,):
#selector-1, .selector-2 {
font-style:
italic;
color: #e7e7e7;
margin: 5px;
padding: 20px
}
I hope you’re seeing the trend here: Try to
be as terse and as efficient as possible. It pays dividends in maintenance time
and page-load speed.
Not Providing Fallback
Fonts
In a perfect world, every computer would
always have every font you would ever want to use installed. Unfortunately, we
don’t live in a perfect world. @font-faceaside,
web designers are pretty much limited to the few so called web-safe fonts (e.g.
Arial, Georgia, serif, etc.).
There is a plus side, though. You can still
use fonts like Helvetica that aren’t necessarily installed on every computer.
The secret lies in font
stacks.
Font stacks are a way for developers to
provide fallback fonts for the browser to display if the user doesn’t have the
preferred font installed.
For example:
#selector {
font-family:
Helvetica;
}
Can be expanded with fallback fonts as
such:
#selector {
font-family:
Helvetica, Arial, sans-serif;
}
Now, if the user doesn’t have Helvetica,
they can see your site in Arial, and if that doesn’t work, it’ll just default
to any sans-serif font installed.
By defining fallback fonts,
you gain more control as to how your web pages are rendered.
Unnecessary Whitespace
When it comes to trying to reduce your CSS
file sizes for performance, every space counts. When you’re developing, it’s OK
to format your code in the way that you’re comfortable with. However, there is
absolutely no reason not to take out excess characters (a process known as minification)
when you actually push your project onto the web where the size of your files
really counts.
Too many developers simply don’t minify
their files before launching their websites, and I think that’s a huge mistake.
Although it may not feel like it makes much of a difference, when you have huge
CSS files, it can improve your page response times.
Not Organizing Your CSS in
a Logical Way
When you’re writing CSS, do yourself a favor
and organize your code. Through comments, you can insure that the next time you
come to make a change to a file you’ll still be able to navigate it.
How you choose to organize your styles is
completely up to you, whatever works. I
personally like to organize my styles by how the HTML that I’m styling is
structured. This means that I have comments that distinguish the header, body,
sidebar, and footer.
A common CSS-authoring mistake I see is
people just writing up their styles as soon as they think of them. The next
time you try to change something and can’t find the style declaration, you’ll
be silently cursing yourself for not organizing your CSS well enough.
Using Only One Stylesheet
for Everything
This one’s subjective, so bear with me
while I give you my perspective.
I am of the belief, as are others, that it
is better to split stylesheets into a few different ones for big sites for
easier maintenance and for better modularity. Maybe I’ll have one for a CSS
reset, one for IE-specific fixes, and so on.
By organizing CSS into disparate stylesheets,
I’ll know immediately where to find a style I want to change. You can do this
by importing all the stylesheets into a stylesheet like so:
@import url("reset.css");
@import url("ie.css");
@import url("typography.css");
@import url("layout.css");
Let me stress, however, that this is what
works for me and many other developers. You may prefer to squeeze them all in
one file, and that’s okay; there’s nothing wrong with that. But if you’re
having a hard time maintaining a single file, try splitting your CSS up.
Not Providing a Print
Stylesheet
In order to style your site on pages that
will be printed, all you have to do is utilize and include a print stylesheet.
It’s as easy as:
Using a stylesheet for print allows you to
hide elements you don’t want printed (such as your navigation menu), reset the
background color to white, provide alternative typography for paragraphs so
that it’s better suited on a piece of paper, and so forth.
The important thing is that you think about
how your page will look when printed. Too many people just don’t think about
it, so their sites will simply print the same way you see them on the screen.
Forgetting to Close a Tag
This
is very common, especially in beginners. Several tags require closing tags such
as divs, strong tags, and links to name a few. Other tags require a closing
slash to end the line such as an img tag.
Text inside the div.

Incorrect DOCTYPE
HTML
requires that you start out the document with the correct DOCTYPE declaration.
It needs to be before anything else in the code, starting the document by declaring
what type of HTML you’re using. Here’s the DOCTYPE for XHTML 1.0 Transitional.
Improperly nesting tags
It’s
very important to open and close tags in the proper order. Once something (for
example a div) has opened, it must close before anything above it can close.
The following is incorrect.
text
Capitalizing tags
This
is just considered bad practice, but won’t result in your code not being
validated. You should always use lowercase for tags like divs, links, and
images. The following is incorrect.
Forgetting to open or close
quotes
I’ve
seen this a lot in beginners and will result in broken code and things not
functioning properly. HTML requires double quotes that open and close
correctly. Here’s an example of correct usage.

Using Inline Styles
This
is another one that is considered bad practice. Inline styles do work but will
result in headaches later on! Items should be styled globally through an
external stylesheet. It will be much easier to edit and add styles to in the
future. An example of inline styles:
link name
Not Encoding Special
Characters
Characters
like “©” and “&” should be shown with the proper HTML code for the
character. Here’s a great list of characters and their HTML counterparts that you
should use.
Confusing Classes and Ids
Classes
are for items that are used more than once on one page. This can be a link
style that you’ll call in multiple times on one page but doesn’t follow the
global link styling. Ids are items that are called in just once, like the
header div. Classes and ids are often overused and used in unnecessary places
as well. Stick to the minimum amount of classifications that you need.
CSS
Forgetting to Close Things
Properly
Each
div or item called in starts with the opening curly bracket and ends with the
closing curly bracket. Each style called in needs to end with a semicolon. The
last declaration within an item doesn’t need a semicolon, but it’s best to use
it in case you plan on adding more items later on, you may forget to add it
back in. An example of proper use:
#divname {
width: 40px;
height: 30px;
}
Condensing
your stylesheet and putting all declarations for a div on one line is up for
debate. I prefer to put each declaration on its own line, I think it’s easier
to edit that way, but some may say that it just produces longer code.
Not Using Global Styles
Many
things should be styled globally like paragraph and heading styles for text as
well as link styles. This will reduce the risk of mistakes and will also cut
down on the amount of code in your stylesheet.
Not Using Unique Names for
Ids and Classes
It’s
very important to choose names that are unique so that it’s easy to edit later
on, and easy to identify in your stylesheet. Name your divs specific things
like #home-left-column which is better than just #left.
Not Using Shorthand Code
Shorthand
code is another way to condense your stylesheet, which is helpful for speeding
up user load times as well as finding things when you’re editing later on.
Instead of calling in padding-top, -left, -bottom, and -right you can just use:
padding: 5px 10px 0 10px;
Shorthand
code can be used for many declarations including: padding, margin, border, and
font.
Not Using Shortened Color
Declarations
Hex
numbers that repeat like #ffffff and #000000 can be condensed to #fff and #000.
This is another way to condense your code and keep things short and easy to
look at.
Incorrectly Using
Positioning
Positioning is tough to understand when you’re
first starting out with CSS. Your choices are static, relative, absolute, and
fixed. Static is the default option and is positioned according to the normal
page flow. A relative item is positioned relative to itself, meaning you can
move it up, down, left or right, based on where it would normally sit. Absolute
allows you to place an item anywhere on the page, and is the most misused
positioning statement. The values you set for it will be relative to the last
parent item with relative or absolute, and if there aren’t any, it defaults
back to the html tag, allowing you to position it anywhere by declaring top
left right or bottom values. Fixed is positioned relative to the browser
window, so an item will stay in place if a user has to scroll. Learning how to
use positioning correctly is important, but shouldn’t be used excessively. I
rarely use these at all in my stylesheets.
Validate
Validating
your HTML and CSS files will help in reducing errors and
figuring out where a problem might be coming from. Your website may function
correctly with some of the common HTML and CSS mistakes, but it doesn’t make it
good practice or valid code. The validator will help identify these problems
and you’ll be able to adjust the way you code for the future.
No comments:
Post a Comment