Skip to content

iurevych/coding-standards-front-end

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 

Repository files navigation

#Coding standards front end

##Code formatting

##HTML

  • Use Polygot Markup with the following emphasis:
    • Use XHTML compliant Boolean attributes e.g. <input type="text" required="required" />.
    • Use double quotation marks for attributes.
    • Use the minimized tag syntax, with a space before the closing slash, for void elements, e.g. <br />. *Use consistent line breaks:
    • Add line breaks only between sibling sectioning elements & ARIA landmark roles.
    • Place inline tags on the same line.
    • Place block-level tags on a new line and indented.
    • Include templating serverside code as part of the nesting of elements.
    • Wrap long lines of text and treat as block-level elements, using 150 char length as a guide.

##CSS

###Example of style

/* header */
	.action .action-information,
	.button .information:last-child {
		background: url("../images/generic-logo.png") no-repeat center 0 #fff;
		background-image:
			url("../images/generic-bg-bottom.png"),
			url("../images/generic-bg-top.png");
		border: 1px solid #000;
		-webkit-box-shadow: /* multiple properties on different lines */
			0 1px 3px rgba(0, 0, 0, .2),
			0 2px 6px rgba(0, 0, 0, .1);
		-moz-box-shadow:
			0 1px 3px rgba(0, 0, 0, .2),
			0 2px 6px rgba(0, 0, 0, .1);
		-ms-box-shadow:
			0 1px 3px rgba(0, 0, 0, .2),
			0 2px 6px rgba(0, 0, 0, .1);
		-o-box-shadow:
			0 1px 3px rgba(0, 0, 0, .2),
			0 2px 6px rgba(0, 0, 0, .1);
		box-shadow:
			0 1px 3px rgba(0, 0, 0, .2),
			0 2px 6px rgba(0, 0, 0, .1);
		color: #333;
		display: block;
		font-family: Helmet, Freesans, sans-serif; /* bbc glue font stack /*
		font-size: 1.3em; /* only use ems for font-sizes (including on the body) */
		padding: 5px 0 2% 0;
		-webkit-transition: all 700ms ease; /* use ms for duration */
		-moz-transition:    all 700ms ease;
		-ms-transition:     all 700ms ease;
		-o-transition:      all 700ms ease;
		transition:         all 700ms ease;
		z-index: 3;
	}

	.action a {
		color: rgba(0, 0, 0, .2);
	}

###Structure of a style

Use "semi-expanded" structure.

	[selector][comma][carriage-return]
	[selector][space][open-curly-bracket][carriage-return]
	[tab][property][colon][space][property-value][semi-colon][carriage-return]
	[close-curly-bracket][carriage-return]
	[carriage-return]

###Selector naming

  • Use only lowercase.
  • Use only hyphens to separate words.

###Property order

  • Alphabetical.

  • By the length of prefix (long to short) for vendor prefixed properties.

  • Carry on the alphabetical order for multiple properties (e.g. border-bottom, border-left...):

      .download {
      	border-bottom: 1px solid #000;
      	border-left: 2px solid #000;
      	border-right: 1px solid #000;
      	border-top: 2px solid #000;
      }
    

###Property value order

	background: [colour] ["url"] [scroll] [repeat] [position];
	border: [size] [type] [colour];

###Prefixed Property value spacing

	.download {
		-webkit-transition: all 700ms ease;
		-moz-transition:    all 700ms ease;
		-ms-transition:     all 700ms ease;
		-o-transition:      all 700ms ease;
		transition:         all 700ms ease;
	}

###Text formatting

  • Use consistent, version-control-friendly text formatting:
    • Use tabs for indentation - length of 4 spaces.
    • Use UNIX-style line endings.
    • Trim trailing whitespace from lines. *Ensure all text-based files end with a newline character.

###Media assets naming conventions

  • Use only lowercase.
  • Use only hyphens to separate words e.g. "home-logo.png".

##Development Guidelines

###Foundation

Use HTML5 Boilerplate as a foundation:

  • Use modernizr.
  • Use the non-semantic helper classes:
    • Use the class="clearfix" approach to clearing floats.
    • Use the image replacement and text hiding classes.
  • Adhere to the W3C's Mobile best practises on every project.
  • Use polyfills.
  • Use HTML5 semantic tags e.g. sectioning and form elements.
  • Use Microformats and HTML5 microdata.
  • Use WAI-ARIA landmark roles - see this blog post for more information. Never use ARIA roles to target CSS styles.
  • Place all Javascript before the closing </body> tag, except modernizr.
  • Use Classes over IDs with the exception of:
    • In-page navigation.

With the following exceptions:

  • Use an IE conditional class and "safe hacks".
  • Order the <head> as follows:
    1. <meta>
      1. Charset first.
      2. Then alphabetically ordered.
    2. <title>
    3. <link>
    4. <script>

###CSS

Structure of a stylesheet

  1. fonts (including url to licence)
  2. normalise html5
  3. default styles (based on boilerplate/normalise)
    1. html
    2. body
    3. links: a, a:hover, a:active, a:visited
    4. sectioning content: aside, article, nav, section
    5. heading content: h1 – h6, hgroup
    6. text-level semantics: address, blockquote, code, em, pre, strong
    7. grouping content
      1. lists: dl, dt, dd, ul, ol, li
      2. paragraphs
      3. tables: table, thead, tr, th, tbody, td
    8. form content: form, fieldset, legend, label, input, textarea, select, option
    9. embedding content: audio, canvas, embed, iframe, img, object, video
  4. helper classes (non-semantic)
  5. shared states
  6. style patterns: ordered by complexity
  7. layout patterns (non-semantic)
  8. @media queries
    1. device width (linearised content first)
      1. default styles (based on boilerplate/normalise)
      2. helper classes (non-semantic)
      3. shared states
      4. style patterns: ordered by complexity
      5. layout patterns (non-semantic)
    2. print

####Comments and indentation

Comment within a stylesheet to aid other developers.

  • Title

  • Colour swatch

  • Index

  • Sectioning comments

  • Property comments

      /*
       * standards and conventions
       *
       * colour swatch:
       * light blue = #005
       * dark blue = #00C
       *
       * index:
       * 1. fonts
       * 2. normalise html5
       * 3. default styles (based on boilerplate/normalise)
       * 4. helper classes (non-semantic)
       * 5. shared states
       * 6. style patterns
       * 7. layout patterns (non-semantic)
       * 8. @mediaqueries
       */
    

Use indentation and comments to section a stylesheet. There are two types of comments:

  1. Sectioning comments.

  2. Property comments.

     /* sectioning comment e.g. "header" */
     	header {
     		margin: 0;
     	}
    
     	/* sectioning comment e.g. "primary navigation" */
     		header nav {
     			float: left;
     		}
    
     	/* sectioning comment e.g. "search box" */
     		header search {
     			display: inline; /* property comment e.g. ie double margin fix */
     		}
    

###Selector naming

  • Use:

    • Plurals for groupings.
    • Nouns for specific objects.
    • Adjectives (where possible) or verbs for variations
    • Past-participle verbs for states.
    • The following for pattern parts:
      • <pattern name>–inner → for inner wrapper
      • <pattern name>–item → for the most common and repeating element in the pattern
      • <pattern name>–content → for containing both media and text
      • <pattern name>–media → for targeting imgs, swf, video
      • <pattern name>–copy → for containing only text e.g. headings and paragraphs
  • Do not mimic tag names when naming classes, unless they are prefixed. e.g. .component-body.

      .actions (grouping - plural)
      	.action (pattern - noun) .action-collapse (sub pattern - verb)
      		.action-inner (pattern part)
      			.action-item (pattern part)
      				.action-content (pattern part)
      					.action-media (pattern part)
      					.action-copy (pattern part)
    
      .folder .is-collapsed (state - past participle)
    

###Progressive enhancement in CSS

####Modernizr

  • Use forward-facing support (i.e. assume feature support and target lack of with the "no-" classes) with the exceptions of:
    • JS → assume no JS and target support with the "js" class.
    • Touch → assume a no-touch device and target support with the "touch" class.

####Backgrounds (language feature)

	.text-area {
		background: url("/images/background-000-50.png") repeat; /* IE fix */
		background: rgba(0, 0, 0, 0.5);
	}
  • Start with fall back definition to support older browsers.
  • Implement newer definition last.

###Fonts and Font Face

Use tweaked (letter/word spacing etc) web-safe fonts first. Then webfonts, but sparingly, with the following caveats:

  • Ensure the font is correctly licensed. Find a licence using a webfont service.
  • Ensure the rendering quality of the font is acceptable in all browsers.
  • Ensure acceptable loading times are maintained as fonts are added.
  • Ensure the correct font weights are included and linked correctly.

##Media assets

###File structure

  • Limit of 10 files per folder before subfolder is created

  • All vendor/3rd Party scripts to be found in "/vendor" including all assets.

  • Creation of child folders within structure below are on a per project basis

      /assets
      	/fonts
      	/images
      		/sprites
      			vignettes.png
      		background.jpg
      		spacer.gif
      	/scripts
      		project.js
      		jquery.standout.js
      	/styles
      		project-name.css
      	/swfs
      	/vendor
      		jquery.js
      		modernizr.js
      		/fancybox
      		jquery.scrollTo.js
    

###Images

####Spritesheets

Use spritesheets only for grouped sets of icons.

####Image Formats

  • Use JPEG for photos and complex images/icons.
  • Use PNG 8 for small and simple images/icons.
  • Use PNG 24 for multi-channel transparency.

##Accessibility

  • Adhere to the WCAG Samurai checklist.
  • Do not check using accessibility validators.

Development Process

  1. Annotate designs to:
    1. Identify a colour palette.
    2. Identify the "base styles" using a "typography-first" approach:
      1. Identify the body copy (the most common block of copy) and its following properties:
        • Font family.
        • Font size.
        • Line height.
      2. Identify text-based grouping elements (and their box models):
        • Paragraphs.
        • Lists.
        • Heading groups.
      3. Identify six levels of headings.
      4. Identify form elements
        • Legends.
        • Labels.
        • Inputs.
    3. Identify style patterns, subpatterns and pattern parts (starting with most common and smallest first):
      • Actions
      • Navigation
      • Content blocks
      • etc...
    4. Identify layout patterns:
      • Grids
      • Positioning
      • etc...
    5. Identify animation patterns:
      • Colour transitions (e.g. on simple links)
      • Show & hide (e.g. reveals, slides, fades)
      • etc...
    6. Identify interaction patterns:
      • Clicks
      • Drags
      • Hovers (including simple links)
      • etc...
  2. Produce a draft mapping of the relationships between patterns in each set.
  3. Build a toolkit:
    • with the following sections:
      • Base styles
      • Demo of style patterns.
      • Demo of layout patterns.
      • Demo of animation patterns.
      • Demo of interaction patterns.
      • Components built from the patterns.
    • and with the following features:
      • Self-annotating and with common language between design and development.
      • A reference for default typography, padding, margin etc.
      • Built-in relationship mapping.
      • Testable.

A collection of best practise standards from around the web and for our specific project needs.

This work is licensed under a Creative Commons License by the contributors.