46
Web Components and Modular CSS @AndrewRota | CSS Dev Conf 2014 #components

Web Components and Modular CSS

Embed Size (px)

DESCRIPTION

Given at CSS Dev Conf 2014 in New Orleans on October 14, 2014. This full presentation written with Web Components can be viewed with Chrome 36+ online at http://andrewrota.github.io/web-components-and-modular-css-presentation/presentation/index.html#0. The source of the presentation is available on GitHub: https://github.com/andrewrota/web-components-and-modular-css-presentation.

Citation preview

Page 1: Web Components and Modular CSS

Web Components and Modular CSS

@AndrewRota | CSS Dev Conf 2014

#components

Page 2: Web Components and Modular CSS

Modularity

Page 4: Web Components and Modular CSS

CSS Features

Encapsulation

Scope

Interfaces

Modularity

Page 6: Web Components and Modular CSS

BEM/* Block */.nav { }

/* Element */.nav__item { }

/* Block with Modifier */.nav--hidden { }

/* Element with Modifier */.nav__item--current { }

Page 7: Web Components and Modular CSS

SMACSS/* Module */.nav { }

/* Module with State */.nav.is-current { }

/* Module with Semantic Element Selector */.nav > h2 { }

/* Layout Style */.l-inline { }

Page 8: Web Components and Modular CSS

Web Components

Web Components usher in anew era of web developmentbased on encapsulated andinteroperable custom elementsthat extend HTML itself. - Polymer

Page 9: Web Components and Modular CSS

Web Components APIs

Custom Elements

HTML Templates

HTML Imports

Shadow DOM

Page 10: Web Components and Modular CSS

Web Components APIs

Custom Elements

HTML Templates

HTML Imports

Shadow DOM

Page 11: Web Components and Modular CSS

Custom Elements

<my-element>Hello World.</my-element>

var MyElement = document.registerElement('my-element', { prototype: Object.create(HTMLElement.prototype)});

Page 12: Web Components and Modular CSS

Web Components APIs

Custom Elements

HTML Templates

HTML Imports

Shadow DOM

Page 13: Web Components and Modular CSS

HTML Templates<template id="my-template"> <p>Hello World.</p> <!-- This image won't be downloaded on page load --> <img src="example.jpg" alt="Example"></template>

document.importNode( document.getElementById('my-template').content, true);

Page 14: Web Components and Modular CSS

Web Components APIs

Custom Elements

HTML Templates

HTML Imports

Shadow DOM

Page 15: Web Components and Modular CSS

HTML Imports<link rel="import" href="/imports/my-component.html">

Page 16: Web Components and Modular CSS

Web Components APIs

Custom Elements

HTML Templates

HTML Imports

Shadow DOM

Page 17: Web Components and Modular CSS

Shadow DOM// Create Shadow Rootdocument.getElementById('my-element').createShadowRoot();// Access Shadow Rootdocument.getElementById('my-element').shadowRoot;

Page 18: Web Components and Modular CSS

User Agent Shadow DOM<video src="#" controls></video>

0:00

Page 19: Web Components and Modular CSS

User Agent Shadow DOM<input type="date">

mm/dd/yyyy

Page 20: Web Components and Modular CSS

Shadow DOMShadow DOM.

Light DOM.<div id="my-first-element"></div><p>Light DOM.</p>

// Create Shadow Rootvar s = document.getElementById('my-first-element').createShadowRoot// Add Styles and Texts.innerHTML += '<style>p { color: crimson; margin: 5px 0 5px 0;}</style>'s.innerHTML += '<p>Shadow DOM.</p>';

Page 21: Web Components and Modular CSS

Content Insertion Points<div id="my-second-element"> <content></content></div>

Page 22: Web Components and Modular CSS

Shadow DOM and <content>Shadow DOM Start.

Hello!Shadow DOM End.<div id="my-second-element"><p>Hello!</p></div>

var s = document.getElementById('my-second-element').createShadowRoots.innerHTML += '<p>Shadow DOM Start.</p>';s.innerHTML += '<style>p { color: crimson; margin: 5px 0; }</style>'s.innerHTML += '<content></content>';s.innerHTML += '<p>Shadow DOM End.</p>';

Page 23: Web Components and Modular CSS

Multiple <content> ElementsHello, CSS Dev Conf!

<div id="my-third-element"> <span class="name">CSS Dev Conf</span> <span class="greeting">Hello</span></div>

var s = document.getElementById('my-third-element').createShadowRoots.innerHTML += '<content select=".greeting"></content>, ';s.innerHTML += '<content select=".name"></content>!';

Page 24: Web Components and Modular CSS

Into the Light/* pseudo-class for host element*/:host { }/* functional pseudo-class, for host if it matches the selector argument */:host() { }/* functional pseudo-class, for host node with parent that matches selector argument */:host-context() { }/* pseudo-element, for distributed notes rendered via a <content> element */::content { }

Page 25: Web Components and Modular CSS

Into the Dark/* pseudo-element for shadow roots */::shadow { }

/* combinator for selecting through shadow boundaries */body /deep/ p { }

[/deep/] is basically a super-descendant combinator.- CSS Scoping Module Draft, Issue 6

Page 26: Web Components and Modular CSS

Let's Write a ComponentHello world, I am a web component.

<link rel="import" href="../assets/hello-world.html">

<hello-world>I am a <strong>web component</strong></hello-world

Page 27: Web Components and Modular CSS

Let's Write a ComponentHello world, I am a web component.

<template id="hw"> <style> ::content strong { color: crimson; } p { margin: 2px 20px 2px 0; } :host { border: 1px solid FireBrick; display: block; margin-right .hello { color: #91D4D; } </style> <p><span class="hello">Hello world</span>, <content></content</template>

Page 28: Web Components and Modular CSS

Let's Write a ComponentHello world, I am a web component.

var importedDoc = document.currentScript.ownerDocument;var elementPrototype = Object.create(HTMLElement.prototype);elementPrototype.createdCallback = function() { var template = importedDoc.getElementById('hw').content; var clone = document.importNode(template, true); this.createShadowRoot().appendChild(clone);};document.registerElement('hello-world', {prototype: elementPrototype

Page 29: Web Components and Modular CSS

Can I Use???Custom

ElementsHTML

TemplatesHTML

ImportsShadow

DOM

✓ ✓ ✓ ✓

✓ ✓ ✓ ✓

Flag ✓ Flag Flag

X ✓ X X

X X X X

Page 30: Web Components and Modular CSS

Polyfills

Page 31: Web Components and Modular CSS

When To Use Web Components?

Third Party Widgets?

Third Party UI Libraries?

Internal UI Libraries?

Web Component All the Things!?

Page 32: Web Components and Modular CSS

Third Party Widgets<google-map latitude="29.954356" longitude="-90.067863"></google-map>

Page 33: Web Components and Modular CSS

Third Party UI Libraries

<paper-radio-group selected="css"> <paper-radio-button name="css" label="CSS"></paper-radio-button</paper-radio-group>

<paper-slider value="10"></paper-slider>

CSS HTML JS

Page 34: Web Components and Modular CSS

Third Party UI Libraries

<paper-input label="Type something here." required error="This is a required field." layout="" vertical="" class="invalid"></paper-input>

This is a required field.

Type something here.

Page 35: Web Components and Modular CSS

Styling UI Librariespaper-slider { width: 95%;}paper-slider::shadow #sliderBar::shadow #activeProgress { background-color: #91D4D4;}paper-slider::shadow #sliderKnobInner { background-color: #b68abd;}paper-slider::shadow #sliderKnobInner::before { background-color: #b68abd;}paper-slider::shadow #sliderKnobInner::after { color: #b68abd;}

Page 36: Web Components and Modular CSS

Styling UI Libraries (Sass)paper-slider { width: 95%; &::shadow { #sliderBar::shadow #activeProgress { background-color: $quinary; } #sliderKnobInner { background-color: $quaternary; &::before { background-color: $quaternary } &::after { color: $quaternary; } } }

Page 37: Web Components and Modular CSS

}

Page 38: Web Components and Modular CSS

Internal UI Libraries<cssdevconf-menu> <cssdevconf-menu-item>Home</cssdevconf-menu-item> <cssdevconf-menu-item selected>About</cssdevconf-menu-item> <cssdevconf-menu-item>Contact Us</cssdevconf-menu-item></cssdevconf-menu>

<cssdevconf-login-form ajax url="login.php"></cssdevconf-login-form>

Page 39: Web Components and Modular CSS

Web Component Everything??<cssdevconf-app> <cssdevconf-menu></cssdevconf-menu> <cssdevconf-content></cssdevconf-content> <cssdevconf-footer></cssdevconf-footer></cssdevconf-app>

Page 40: Web Components and Modular CSS

Probably Not (and that's OK)

I don't ever see us going all inon Custom Elements for everypossible thing ... Use nativeelements and controls whenpossible and supplement withcustom elements. - Joshua Peek, Github Programmer

Page 41: Web Components and Modular CSS

Small

Open for Extension

Documented

Unit Tested

Accessible

Responsive

Best Practices

Page 43: Web Components and Modular CSS

Frameworks

Page 44: Web Components and Modular CSS

Towards a Component Driven Web

Page 45: Web Components and Modular CSS

Thanks!

Resources- WebComponents.org- Web Components: A Tectonic Shift for Web Development by Eric Bidelman- Web Components by Jarrod Overson and Jason Strimpel- Ten Principles for Great General Purpose Web Components

Colophon

This presentation was built with Shadow DOM, HTML Templates, HTMLImports, and the Custom Elements <slide-show> and <slide-content>using Web Component Slides.

Page 46: Web Components and Modular CSS