Achieving consistency in large CSS projects — FullStackLX #2

76
Achieving consistency in large CSS projects @andr3 FullStackLX #2 Dec. 7th '2016 http://meet.andr3.net [email protected]

Transcript of Achieving consistency in large CSS projects — FullStackLX #2

Page 1: Achieving consistency in large CSS projects — FullStackLX #2

Achieving consistency in large CSS projects

@andr3

FullStackLX #2Dec. 7th '2016

http://[email protected]

Page 2: Achieving consistency in large CSS projects — FullStackLX #2

OH HAI!

Page 3: Achieving consistency in large CSS projects — FullStackLX #2
Page 4: Achieving consistency in large CSS projects — FullStackLX #2

CONSISTENCY

Page 5: Achieving consistency in large CSS projects — FullStackLX #2

CONSISTENCYin large CSS projects

Page 6: Achieving consistency in large CSS projects — FullStackLX #2

consistent(adj.) /kənˈsɪst(ə)nt/acting or done in the same way over time, especially so as to be fair or accurate.

Page 7: Achieving consistency in large CSS projects — FullStackLX #2

👀 💻code visuals

Page 8: Achieving consistency in large CSS projects — FullStackLX #2

👀 💻code visuals

Maintainability PredictabilityStability

Page 9: Achieving consistency in large CSS projects — FullStackLX #2

👀 💻code visuals

Maintainability PredictabilityStability

UsabilityBranding

Personality

Page 10: Achieving consistency in large CSS projects — FullStackLX #2

Shared Responsibility

Page 11: Achieving consistency in large CSS projects — FullStackLX #2

👀 💻code visuals

CSS Stats http://cssstats.comGulp/Grunt (with PostCSS)

How can we measure?

Page 12: Achieving consistency in large CSS projects — FullStackLX #2

How can we measure?How can we measure?

2016

2014Fixed layout.Using SCSS.Before redesign with consistency in mind.

Responsive/fixed layout (progressive redesign).Using SCSS.After redesign.A lot more components, content, pages, etc. From Fixed to Responsive (medium.com) ➡

seedrs.com

seedrs.com

cssstats.com

cssstats.com

Page 13: Achieving consistency in large CSS projects — FullStackLX #2

How can we measure?How can we measure?

2016

2014

Page 14: Achieving consistency in large CSS projects — FullStackLX #2

How can we measure?How can we measure?

43%

22%

31%

29% 29%

40%57%

46% 8%

34% 55%

28%

2016

2014

Page 15: Achieving consistency in large CSS projects — FullStackLX #2

How can we measure?How can we measure?

2016

2014

Page 16: Achieving consistency in large CSS projects — FullStackLX #2

How?

Page 17: Achieving consistency in large CSS projects — FullStackLX #2
Page 18: Achieving consistency in large CSS projects — FullStackLX #2

1. Typographic Scale

Page 19: Achieving consistency in large CSS projects — FullStackLX #2
Page 20: Achieving consistency in large CSS projects — FullStackLX #2

Robert Bringhurst

Page 21: Achieving consistency in large CSS projects — FullStackLX #2

Don’t compose without a scale

Robert Bringhurst

Page 22: Achieving consistency in large CSS projects — FullStackLX #2

Don’t compose without a scaleIn the sixteenth century, a series of common sizes developed among European typographers, and the series survived with little change and few additions for 400 years. […] Use the old familiar scale, or use new scales of your own devising, but limit yourself, at first, to a modest set of distinct and related intervals.”—in The Elements of Typographic Styleby Robert Bringhurst

Page 23: Achieving consistency in large CSS projects — FullStackLX #2

$type-scale-base: 1rem; $type-scale-adjustments: ( extra-small: -0.25, small: -0.125, normal: 0, medium: 0.125, large: 0.5, huge: 1, extra-huge: 2, extra-extra-huge: 3, );

_config.scss

// Usually*: // 12px // 14px // 16px // 18px // 24px // 32px // 48px // 64px

Page 24: Achieving consistency in large CSS projects — FullStackLX #2

@function type-scale($size) { @if map-has-key($type-scale-adjustments, $size) { $adjust: map-get($type-scale-adjustments, $size); $actual-size: $type-scale-base + $adjust;

@return $actual-size; } @else { @return $type-scale-base; } }

_typography-mixins.scss

Page 25: Achieving consistency in large CSS projects — FullStackLX #2

font-size: type-scale(extra-small); font-size: type-scale(small); font-size: type-scale(normal); font-size: type-scale(medium); …

// If you want, create a mixin for easier use: // @include type-scale(large);

How to use it:

Page 26: Achieving consistency in large CSS projects — FullStackLX #2

font-size: type-scale(extra-small); font-size: type-scale(small); font-size: type-scale(normal); font-size: type-scale(medium); …

// If you want, create a mixin for easier use: // @include type-scale(large);

How to use it:

padding-top: type-scale(large);

Page 27: Achieving consistency in large CSS projects — FullStackLX #2
Page 28: Achieving consistency in large CSS projects — FullStackLX #2

2. Vertical spacing scale

Page 29: Achieving consistency in large CSS projects — FullStackLX #2
Page 30: Achieving consistency in large CSS projects — FullStackLX #2
Page 31: Achieving consistency in large CSS projects — FullStackLX #2
Page 32: Achieving consistency in large CSS projects — FullStackLX #2
Page 33: Achieving consistency in large CSS projects — FullStackLX #2
Page 34: Achieving consistency in large CSS projects — FullStackLX #2

before

after

Page 35: Achieving consistency in large CSS projects — FullStackLX #2

before

after

margin

margin

Page 36: Achieving consistency in large CSS projects — FullStackLX #2

before

after

margin

margin

padding

padding

Page 37: Achieving consistency in large CSS projects — FullStackLX #2

$vertical-space-values: ( extra-small: 0.5, small: 1, medium: 1.5, large: 2.5, huge: 4, extra-huge: 6 );

_config.scss

// In rems. Usually*: // 8px // 16px // 24px // 40px // 64px // 96px

Page 38: Achieving consistency in large CSS projects — FullStackLX #2

@function vertical-space($space) { $space-value: map-get($vertical-space-values, $space);

@return #{$space-value}rem; }@mixin before-padding($space) {

padding-top: vertical-space($space); }@mixin before-margin($space) { margin-top: vertical-space($space);}

_typography-mixins.scss

Page 39: Achieving consistency in large CSS projects — FullStackLX #2

.example { @include before-padding(small); @include after-padding(small); @include before-margin(large); @include after-margin(large);

}// For convenience, create mixins like: // @include before-and-after-padding(small); // @include before-and-after-margin(large);

How to use it:

Page 40: Achieving consistency in large CSS projects — FullStackLX #2

3. Container paddings (horizontal)

Page 41: Achieving consistency in large CSS projects — FullStackLX #2

small screens large screens

Page 42: Achieving consistency in large CSS projects — FullStackLX #2

$container-paddings: ( small: 1, medium: 2, large: 3 );

_config.scss

// in multiples // of gutters

Page 43: Achieving consistency in large CSS projects — FullStackLX #2

@function container-padding($size) { $multiplier: 1;

@if map-has-key($container-paddings, $size) { $multiplier: map-get($container-paddings, $size); }

@return $multiplier * gutter(); }

_grid-mixins.scss

Page 44: Achieving consistency in large CSS projects — FullStackLX #2

@function container-padding($size) { $multiplier: 1;

@if map-has-key($container-paddings, $size) { $multiplier: map-get($container-paddings, $size); }

@return $multiplier * gutter(); }

_grid-mixins.scss

varies dependingon the context(small/large).

Page 45: Achieving consistency in large CSS projects — FullStackLX #2

@mixin container-padding($size) { $value: container-padding($size);

padding-left: $value; padding-right: $value; }

_grid-mixins.scss

Page 46: Achieving consistency in large CSS projects — FullStackLX #2

.example { @include container-paddings(small);

}

How to use it:

.another { padding: vertical-spacing(huge) container-paddings(small);

}

Page 47: Achieving consistency in large CSS projects — FullStackLX #2

Semi-manual checks via bookmarklet

Page 48: Achieving consistency in large CSS projects — FullStackLX #2

4. Color palettes with alpha

Page 49: Achieving consistency in large CSS projects — FullStackLX #2

Name your colors.$color1 $primary-color $color-red

Page 50: Achieving consistency in large CSS projects — FullStackLX #2

http://chir.ag/projects/name-that-color/#4AA6FFhttp://vmi.u7.xsl.pt

http://sipapp.io/http://vmi.ud.xsl.pt

Page 51: Achieving consistency in large CSS projects — FullStackLX #2
Page 52: Achieving consistency in large CSS projects — FullStackLX #2

$palette: ( "celery-green": ( x-light: #e5f1d5, light: #cce4ac, mid-light: #b2d683, base: #99c95a, mid-dark: #7fbb30, dark: #6fa32b, x-dark: #5c8723 ), "dodger-blue": ( x-light: #e8f4ff, light: #d1e8ff, mid-light: #8ec7ff,

_colors.scss

Page 53: Achieving consistency in large CSS projects — FullStackLX #2

@function color($hue, $tone: "base") { $color: rgba(204, 255, 0, 0.2);

@if map-has-key($palette, $hue) { $palette-color: map-get($palette, $hue);

@if map-has-key($palette-color, $tone) { $color: map-get($palette-color, $tone); } }

@return $color; }

_colors.scss

Page 54: Achieving consistency in large CSS projects — FullStackLX #2

.example { color: color(celery-green, x-dark);

}

How to use it:

Page 55: Achieving consistency in large CSS projects — FullStackLX #2

$alpha-palette: ( "black": #000, "white": #fff, "corn-yellow": #edb800, "sky-blue": #1d8fff );

_colors.scss

$alpha-levels: ( "0": 0, "10": 0.1, "20": 0.2, "40": 0.4, "60": 0.6, "80": 0.8, "100": 1 );

Page 56: Achieving consistency in large CSS projects — FullStackLX #2

@function alpha-color($hue, $alpha: "100") { $color: rgba(204, 255, 0, 0.2);

@if map-has-key($alpha-palette, $hue) { $palette-color: map-get($alpha-palette, $hue);

@if map-has-key($alpha-levels, $alpha) { $color: rgba($palette-color, map-get($alpha-levels, $alpha)); } }

@return $color; }

_colors.scss

Page 57: Achieving consistency in large CSS projects — FullStackLX #2

.example { color: alpha-color(black, 80);

}

How to use it:

Page 58: Achieving consistency in large CSS projects — FullStackLX #2

5. Naming convention

Page 59: Achieving consistency in large CSS projects — FullStackLX #2

2016

2014

Page 60: Achieving consistency in large CSS projects — FullStackLX #2

.section { .header { .logo a {

… }

.image { …

} }

… }

Before

Page 61: Achieving consistency in large CSS projects — FullStackLX #2

.Component { … } .Component-logo { … } .Component-coverImage { … }

After

Page 62: Achieving consistency in large CSS projects — FullStackLX #2

BEM

SUIT

block element modifier.block .block__element .block__element--modifier

.Component

.Component-subComponent

.Component--modifier

.is-transientState

.u-tilityClasses

Page 63: Achieving consistency in large CSS projects — FullStackLX #2

BEM

SUIT style… for ui… tools… you know.

block element modifier.block .block__element .block__element--modifier

.Component

.Component-subComponent

.Component--modifier

.is-transientState

.u-tilityClasses

Page 64: Achieving consistency in large CSS projects — FullStackLX #2

Which is best?

Page 65: Achieving consistency in large CSS projects — FullStackLX #2

It depends.But use one that lowers specificity.

Page 66: Achieving consistency in large CSS projects — FullStackLX #2

This next one should go without saying but…

Page 67: Achieving consistency in large CSS projects — FullStackLX #2

6. Lint your SCSS/less/css

Page 68: Achieving consistency in large CSS projects — FullStackLX #2

That’s pretty much it, lint it. No excuses.

Page 69: Achieving consistency in large CSS projects — FullStackLX #2

That’s pretty much it, lint it. No excuses.Exceptions must befollowed by a reason.

// scss-lint:disable NestingDepth // Reason: This rule depends on the // state of the previous item. No way

// to minimize depth here.

Page 70: Achieving consistency in large CSS projects — FullStackLX #2

CONSISTENCYin large CSS projects

In conclusion...

Page 71: Achieving consistency in large CSS projects — FullStackLX #2

“We shape our buildings and afterward our buildings shape us."—Winston Churchill

Page 72: Achieving consistency in large CSS projects — FullStackLX #2

We become what we behold. First we shape our tools, thereafter they shape us.—Marshall McLuhan

Page 73: Achieving consistency in large CSS projects — FullStackLX #2

"SHAPE Y0’SELVES."

Page 74: Achieving consistency in large CSS projects — FullStackLX #2

Before I go...

Page 75: Achieving consistency in large CSS projects — FullStackLX #2

THANK YOU

Page 76: Achieving consistency in large CSS projects — FullStackLX #2

Achieving consistency in large CSS projects

@andr3

FullStackLX #2Dec. 7th '2016

http://[email protected]

http://talks.andr3.net/2016/consistency.pdf

cbna

http://codepen.io/andr3pt/pen/pNVVdG

Lalezar , SuperClarendon & Fira Code