My CSS reset
Many frontend developers begin styling their websites with Normalize. Some developers have personal preferences they add on to Normalize.css. I have my preferences too.
In this article, I want to share these preferences with you. personal CSS reset (that I use in addition to Normalize.css) with you.
I categorize the resets into 8 categories:
- Box sizing
- Removing margins and paddings
- Lists
- Forms and buttons
- Images and embeds
- Tables
- The hidden attribute
- Noscript
Box Sizing
The box-sizing
property changes how the CSS Box model works. It changes how width
, height
, padding
, border
, and margin
properties are calculated.
The default setting for box-sizing
is content-box
. I prefer changing this to border-box
because it’s easier for me to style padding
and width
.
For more info on Box Sizing, you might be interested in ”Understanding Box sizing“.
html {
box-sizing: border-box;
}
*,
*::before,
*::after {
box-sizing: inherit;
}
Removing margins and paddings
Browsers set different margins and paddings for different elements. These default settings throw me off when I’m not aware. When I code, I prefer to set all margins and paddings myself.
/* Reset margins and paddings on most elements */
body,
h1,
h2,
h3,
h4,
h5,
h6,
ul,
ol,
li,
p,
pre,
blockquote,
figure,
hr {
margin: 0;
padding: 0;
}
Lists
I use unordered lists in many situations, and I don’t need a disc
style in most of them. Here, I set list-style
to none. When I need the disc
style, I set it back manually on the specific <ul>
/* Removes discs from ul */
ul {
list-style: none;
}
Forms and buttons
Browsers don’t inherit typography for forms and buttons. They set font
to 400 11px system-ui
. I find this mind-boggling and weird. I always have to make them inherit from ancestor elements manually.
input,
textarea,
select,
button {
color: inherit;
font: inherit;
letter-spacing: inherit;
}
Different browsers have style the borders for forms elements and buttons differently. I dislike these default styles, and would prefer to set them to 1px solid gray
.
input,
textarea,
button {
border: 1px solid gray;
}
I made a few more adjustments to buttons:
- Set button padding to
0.75em
and1em
because they seem like sensible defaults from my experience. - Removed the default
border-radius
that’s applied to buttons. - Forced background color to be transparent
button {
border-radius: 0;
padding: 0.75em 1em;
background-color: transparent;
}
Finally, I set pointer-events: none
to elements within a button. This is mainly used for JavaScript interaction.
(When users click on something in a button, event.target
is the thing they clicked on, not the button. This style makes it easier to work with click
events if there are HTML elements inside a button).
button * {
pointer-events: none;
}
Media elements
Media elements include images, videos, objects, iframes, and embed. I tend to let these elements conform to the width of their containers.
I also set these elements to display: block
because inline-block
creates an unwanted whitespace at the bottom of the element.
embed,
iframe,
img,
object,
video {
display: block;
max-width: 100%;
}
Tables
I rarely use tables, but there may be useful sometimes. Here’s the default styles I’ll begin with:
table {
table-layout: fixed;
width: 100%;
}
The hidden attribute
When an element has a hidden
attribute, they should be hidden from view. Normalize.css does this for us already.
[hidden] {
display: none;
}
The problem with this style is its low specificity.
I often add hidden
to other elements I style with a class. A class’s specificity is high than an attribute, and the display: none
property doesn’t work.
This is why I opt to bump up [hidden]
’s specificity with !important
.
[hidden] {
display: none !important;
}
Noscript
If a component requires JavaScript to work, I’ll add a <noscript>
tag to let users know (if they’ve disabled JavaScript).
This creates default styles for the <noscript>
tag.
/* noscript styles */
noscript {
display: block;
margin-bottom: 1em;
margin-top: 1em;
}
Wrapping up
Everyone begins their projects differently. Please feel free to use any of these styles I mentioned. Here’s a Github repo of my personal CSS Resets.
Do you have any recommendations that would help improve this CSS Reset file? If you do, feel free to reach out and let me know!