SlideShare a Scribd company logo
ROLLING YOUR OWN
CSS METHODOLOGY
Dave Shea
section {
color: black;
}
section {
color: black;
}
.page section {
color: blue;
}
section {
color: black;
}
.page section {
color: blue;
}
.page section > ul {
color: black;
}
section {
color: black;
}
.page section {
color: blue;
}
.page section > ul {
color: black;
}
.page section > ul li:first-child {
color: blue;
}
section {
color: black;
}
.page section {
color: blue;
}
.page section > ul {
color: black;
}
.page section > ul li:first-child {
color: blue;
}
@media only screen and (min-width: 480px) {
section,
.page section,
.page section > ul,
.page section > ul li:first-child {
color: orange;
}
}
section {
color: black;
}
.page section {
color: blue;
}
.page section > ul {
color: black;
}
.page section > ul li:first-child {
color: blue;
}
@media only screen and (min-width: 480px) {
section,
.page section,
.page section > ul,
.page section > ul li:first-child {
color: orange;
}
}
* {
color: black !important;
}
CSS is Simple!
Rolling Your Own CSS Methodology
So maybe it’s not.
What are we going
to do about it?
WHO AM I?
@mezzoblue @mobify
Rolling Your Own CSS Methodology
LET’S TALK
ABOUT CSS
Why think
about this?
OUR PROBLEMS
TO SOLVE
Bloated Codebase
Development
friction
Growing team
The Goal
WHAT’S A CSS
METHODOLGY?
A Naming
System
PRIOR ART
• BEM
• OOCSS
• SMACSS
• SuitCSS
Why not use
the others?
Why not use
Bootstrap or
Foundation?
Framework !=
Methodology
The last thing
the world needs
is another one.
But we built
one anyway
It’s called Argon
Is Argon right
for you?
Truthfully…
probably not
This is a case study
What To Do
What To Do
WHAT WE WANT
FROM ARGON
Predictability
DRY
DRY
Don’t Repeat Yourself
.button {
display: inline-block;
padding: 0.5rem 1rem;
border-radius: 3px;
color: #fff;
background: gradient($grey20, $grey18, 50%);
font-size: 1rem;
text-decoration: none;
}
.input {
display: inline-block;
padding: 0.5rem 1rem;
border-radius: 3px;
color: #000;
background: #fff;
font-size: 1rem;
text-decoration: none;
}
.button, input {
display: inline-block;
padding: 0.5rem 1rem;
border-radius: 3px;
font-size: 1rem;
text-decoration: none;
}
.button {
color: #fff;
background: gradient($grey20, $grey18, 50%);
}
.input {
color: #000;
background: #fff;
}
Re-usability
.contactpage .submit-form div.inline-options .form-element {
display: inline-block;
float: left;
width: 25%;
}
.form .form-element {
display: inline-block;
float: left;
width: 25%;
}
Modularity
Rolling Your Own CSS Methodology
Rolling Your Own CSS Methodology
No specificity
battles
section {
color: black;
}
.page section {
color: blue;
}
.page section > ul {
color: black;
}
.page section > ul li:first-child {
color: blue;
}
@media only screen and (min-width: 480px) {
section,
.page section,
.page section > ul,
.page section > ul li:first-child {
color: orange;
}
}
* {
color: black !important;
}
Team-wide
consistency
Argon extra credits: @jam_sbryant & @kbingman
ANATOMY OF
A SELECTOR
AT-A-GLANCE UNDERSTANDING
.swift-project.-activeProject ._filterField {
width: 25%;
}
Ugly selectors?
You bet they are.
NAMESPACE
.swift-project.-activeProject ._filterField {
width: 25%;
}
(Maybe not our
best idea)
COMPONENT
.swift-project.-activeProject ._filterField {
width: 25%;
}
Rolling Your Own CSS Methodology
Rolling Your Own CSS Methodology
MODIFIER
.swift-project.-activeProject ._filterField {
width: 25%;
}
Rolling Your Own CSS Methodology
Rolling Your Own CSS Methodology
DESCENDANT (SUB-COMPONENT)
.swift-project.-activeProject ._filterField {
width: 25%;
}
Rolling Your Own CSS Methodology
Rolling Your Own CSS Methodology
Rolling Your Own CSS Methodology
ARGON IDEALS
Classes for
everything
No ID styling
Rolling Your Own CSS Methodology
#nav {
margin: 0;
}
.nav {
margin: 0;
}
No styling of
HTML elements
h2 {
font-size: 1rem;
}
.header-2 {
font-size: 1rem;
}
EXCEPTION
base-html.css
Don’t over-select
THIS IS UNACCEPTABLE
.panel { display: block; margin: 1rem 0; font-size: 0.8rem; }
.panel .panel-wrapper { padding: 1.5rem; }
.panel .panel-list { width: 50%; float: left; }
.panel .panel-list ul.item-list { margin: 0; list-style: none; }
.panel .panel-list ul.item-list li.item { display: block; margin: 0.5rem 0; }
.panel .panel-list ul.item-list li.item a { font-weight: bold; }
.panel .panel-list ul.item-list li.item a:hover,
.panel .panel-list ul.item-list li.item a:focus { text-decoration: underline; }
.panel .panel-list ul.item-list li.item a span.prompt::before { content: "$ "; }
.panel .panel-list ul.item-list li.item a i { font-style: normal; }
Rolling Your Own CSS Methodology
Rolling Your Own CSS Methodology
NO !important
Argon flattens
to BEM
.project__filterField-—conditionValue {
width: 25%;
}
.swift-project ._filterField.-conditionValue {
width: 25%;
}
.swift-project .__filterField.--conditionValue {
width: 25%;
}
.swift-project .__filterField.--conditionValue {
width: 25%;
}
.swift-project ._filterfield.-conditionvalue {
width: 25%;
}
.swift-project ._filterfield.-conditionvalue {
width: 25%;
}
NESTED ARGON
.swift-project {
._filterList {
width: 50%;
}
&.-activeProject {
._filterList {
width: 100%;
}
}
._filterField {
&.-conditionValue {
width: 25%;
}
}
}
vs. BEM
.swift-project__filterList {
width: 50%;
}
.swift-project--activeProject__filterList {
width: 100%;
}
.swift-project__filterField--conditionValue {
width: 25%;
}
HTML (ARGON)
<div class="swift-project -activeProject">
<div class="_filterList">
<input type="text" class="_filterField" />
<input type="text" class="_filterField" />
</div>
<button type="submit" class="_filterApply">
Okay
</button>
</div>
HTML (BEM)
<div class="swift-project--activeProject">
<div class="swift-project--activeProject__filterList">
<input type="text" class="swift-project--activeProject__filterField" />
<input type="text" class="swift-project--activeProject__filterField" />
</div>
<button type="submit" class="swift-project--activeProject__filterApply">
Okay
</button>
</div>
Exceptions
JAVASCRIPT? DON’T TOUCH!
.jsSwiftProject {
width: 25%; // NO! BAD!!!
}
STATES? ONLY VISIBILITY STYLING
.is-visible {
display: inline-block;
}
.is-hidden {
display: none;
}
OTHER STUFF WE HAVE RULES FOR
• White space
• Style rule ordering
• File structure
• z-index scale
• Typography scale
• Grid system
• Colour
• etc.
FURTHER READING / WATCHING
• High-level advice and guidelines for writing sane, manageable, scalable CSS
• The Modular CSS (BEM/OOCSS) naming conundrum
• Medium’s CSS is actually pretty f***ing good.
• Slaying the Dragon: Refactoring CSS for Maintainability – Alicia Liu at Front-Trends 2014
• Code Refactoring for America
• Pixels are expensive
• Let’s Play Nice with CSS Tools & Methodologies – Brad Westfall at HTML5DevConf
ROLLOUT
New features only
Rolling Your Own CSS Methodology
Rolling Your Own CSS Methodology
Rolling Your Own CSS Methodology
Rolling Your Own CSS Methodology
Rolling Your Own CSS Methodology
Rolling Your Own CSS Methodology
Rolling Your Own CSS Methodology
But, the design
changed!
Rolling Your Own CSS Methodology
Rolling Your Own CSS Methodology
OUTCOME
Ramp up?
NEED GREAT DOCS
Forces thought
Quick code reviews
Rolling Your Own CSS Methodology
Debugging
Rolling Your Own CSS Methodology
Rolling Your Own CSS Methodology
Over-reliance
on modifiers
File sizes?
Only works for
controlled systems
Will the cost:benefit
ratio break down?
WRAPPING UP
The big
breakthrough:
It’s not the syntax
It’s the discipline
Every project? No.
Favour shipping
Be wary of “The
Perfect Syntax”
The proof is in the
implementation
Build systems that
people understand
THANKS!
http://mezzoblue.com/presentations/2015/fitc
FURTHER RESOURCES
• A Maintainable Style Guide
• Combine matching media queries with Grunt
• Setting up Sass and Compass with source maps
• Using source maps with Sass 3.3
• csste.st - The How and Why of CSS Testing
• Code refactoring for America

More Related Content

Rolling Your Own CSS Methodology