Best practices and guidelines for writing HTML and CSS with approachable formatting, syntax, and more.
<p>
tag. Never use multiple <br>
tags.<ul>
, <ol>
, or <dl>
. Never use a set of <div>
or <p>
.<label>
tag. Especially radio or checkbox elements.<!-- /.element -->
. This just adds to page load time. Plus, most editors have indentation guides and open-close tag highlighting.<br>
, <hr>
, <img>
, and <input>
.tabindex
manually—rely on the browser to set the order.Many attributes don’t require a value to be set, like disabled
or checked
, so don’t set them.
For more information, read the WhatWG section.
Whenever possible, avoid superfluous parent elements when writing HTML. Many times this requires iteration and refactoring, but produces less HTML. For example:
<label>
s. No need for for
attributes here—the wrapping automatically associates the two.type
. Use primary buttons for the type="submit"
button and regular buttons for type="button"
.float: right;
on each button.Make use of <thead>
, <tfoot>
, <tbody>
, and <th>
tags (and scope
attribute) when appropriate. (Note: <tfoot>
goes above <tbody>
for speed reasons. You want the browser to load the footer before a table full of data.)
:
in property declarations.{
in rule declarations.#000
unless using rgba()
in raw CSS (SCSS’ rgba()
function is overloaded to accept hex colors as a param, e.g., rgba(#000, .5)
).//
for comment blocks (instead of /* */
).margin: 0;
instead of margin: 0px;
.As a rule of thumb, avoid unnecessary nesting in SCSS. At most, aim for three levels. If you cannot help it, step back and rethink your overall strategy (either the specificity needed, or the layout of the nesting).
Here are some good examples that apply the above guidelines:
In general, a flat directory of files works best, but at GitHub we break things down by bundles (separate compiled CSS files) and sections (directories of related content).
GitHub.com uses a handful of bundles. Here’s a simplified representation of our two desktop bundles (split to support IE9’s maximum selector limit per CSS file) and a dedicated mobile bundle for our separate mobile views.
Previously we used Sprockets to require files in Primer and at GitHub. Nowadays, we use explicit lists of imports to control the cascade, specificity, and more.
This is also how Primer’s styles are to be included, should you need them.
Use px
for font-size
, because it offers absolute control over text. Additionally, unit-less line-height
is preferred because it does not inherit a percentage value of its parent element, but instead is based on a multiplier of the font-size
.
Never reference js-
prefixed class names from CSS files. js-
are used exclusively from JS files.
Use the is-
prefix for state rules that are shared between CSS and JS.
Elements that occur exactly once inside a page should use IDs, otherwise, use classes. When in doubt, use a class name.
When styling a component, start with an element + class namespace (prefer class names over ids), prefer direct descendant selectors by default, and use as little specificity as possible. Here is a good example:
#selector
) make sure that you have no more than one in your rule declaration. A rule like #header .search #quicksearch { ... }
is considered harmful..listings-layout.bigger
use rules like .listings-layout.listings-bigger
. Think about ack/grep
ing your code in the future.disabled
, mousedown
, danger
, hover
, selected
, and active
should always be namespaced by a class (button.selected
is a good example).
s