SlideShare una empresa de Scribd logo
1 de 38
Descargar para leer sin conexión
Styling 
Components 
with JavaScript 
@bensmithett
Warning 
» Not a tutorial for use in production! 
» I'm not even using any of this outside 
late night hacks 
But there are some interesting new ideas. 
Let's explore them & challenge CSS best 
practices!
Components are awesome! 
Nobody builds pages any more. 
Here's an example Profile component: 
components/ 
Profile/ 
index.hbs 
index.css 
index.js
HTML Template 
<div class="profile"> 
<img class="profile__avatar" src="{{avatarUrl}}.jpg" /> 
<strong>{{username}}</strong> 
</div> 
Style 
.profile { 
border: 1px solid #ddd; 
overflow: hidden; 
} 
.profile__avatar { 
float: left; 
margin-right: 10px; 
}
Behaviour 
var Profile = function (el) { 
el.addEventListener("click", function () { 
console.log("hai!"); 
}); 
this.el = el; 
this.tmpl = Handlebars.compile(someTemplateString); 
}; 
Profile.prototype.render = function (state) { 
this.el.innerHTML = this.tmpl(state); 
};
React combines HTML structure & behaviour 
var React = require("react"); 
var Profile = React.createClass({ 
handleClick: function () { 
console.log("hai"); 
}, 
render: function () { 
return ( 
<div class="profile"> 
<img class="profile__avatar" src="{this.props.avatarUrl}.jpg" 
onClick={this.handleClick} /> 
<strong>{this.props.username}</strong> 
</div> 
); 
} 
}); 
module.exports = Profile;
That's a big dirty lie 
The component's CSS is one of its 
concerns, but it's off in some random 
other file. 
components/ 
Profile/ 
index.css 
index.jsx
The only connection: a class name 
// JS 
render: function () { 
return ( 
<div class="profile"> 
// ... 
</div> 
) 
} 
/* CSS */ 
.profile 
border: 1px solid #ddd; 
overflow: hidden;
Most things 
» JS Dependencies are explicitly required 
» HTML structure is right there in the 
file 
» JS behaviour is right there in the file 
CSS 
» In another file, the classes might have 
the same name ¯_()_/¯ 
It's a crappy, vague connection.
CSS builds are a bit backwards 
//app.scss 
@import vendor/Normalize.css; 
@import base; 
@import components/Header; 
@import components/Profile; 
@import components/Footer; 
You need to know which bits of CSS your 
app requires. Lame.
What if our JS build automatically 
created a stylesheet based only on the 
components we use? 
// app.js 
var Profile = require(./components/Profile); 
var Header = require(./components/Header); 
var Footer = require(./components/Footer); 
// app.css 
// Somehow... 
// components/Profile/index.css 
// components/Header/index.css 
// components/Footer/index.css 
// ... end up here?
http://webpack.github.io/
var React = require(react); 
require(./index.css); 
var Profile = React.createClass({ 
render: function () { 
return ( 
div class=profile / 
); 
} 
}); 
module.exports = Profile;
// app.js 
var Profile = require(./components/Profile); 
var Header = require(./components/Header); 
var Footer = require(./components/Footer); 
// app.css generated by webpack 
.profile { ... } 
.profile__avatar { ... } 
.header { ... } 
.footer { ... }
Hooray! 
CSS is just another dependency we can 
require() in our component
Hooray? 
components/ 
Profile/ 
index.css 
index.jsx 
» Still working across 2 files 
» Need to maintain class names across 2 
files 
... still a bit lame.
React can do inline styles 
// Profile/index.js 
var Profile = React.createClass({ 
styles: { 
border: 1px solid #ddd, 
overflow: hidden 
}, 
render: function () { 
return( 
div style={this.styles} / 
); 
} 
}); 
!-- DOM generated by React -- 
div style=border: 1px solid #ddd; overflow: hidden; 
/div
Nobody likes inline 
styles though
What we really want: 
» Declare styles in the component, like 
we do with inline styles 
» Build process that... 
» converts them to a CSS class 
» spits out a shiny, auto-generated 
app.css 
» component knows to use that class 
name
React-style does that! 
» https://github.com/SanderSpies/react-style 
» http://andreypopp.com/posts/2014-08-06- 
react-style.html 
(with a little help from webpack)
var React = require(react/addons); 
var ReactStyle = require(react-style); 
var Profile = React.createClass({ 
styles: ReactStyle(function () { 
return { 
backgroundColor: green, 
border: 1px solid #ddd 
}; 
}), 
render: function () { 
return( 
div styles={this.styles()} / 
); 
} 
}); 
module.exports = Profile;
!-- DOM generated by React -- 
div class=a 
... 
/div 
// app.css generated by React-style  Webpack 
.a { 
background-color: green; 
border: 1px solid #ddd; 
}
Demo 
Compiling with default compressed class 
names
Demo 
Formatting class names
Do you even need 
a CSS naming 
convention?
not really... 
» Styles are tightly coupled part of the 
component, not a separate thing 
» CSS class naming conventions are a 
project setting, not an inherent 
property of the component 
» Dev: BEM class names for easy 
debugging 
» Prod: Tiny compressed class names
I 3 Sass 
$red: #f00; 
$grid-columns: 12; 
$base-font-size: 16px; 
@function px-to-em($px, $base: $base-font-size) { 
@return ($px / $base) * 1em; 
} 
%placeholder { 
color: $red; 
} 
.thing { 
@extend %placeholder; 
padding: 10px; 
}
What is a Preprocessor? 
A language that helps us generate blocks 
of key:value pairs. 
selector { 
property: value; 
other-property: other-value; 
}
What is a Preprocessor? 
A language that helps us generate blocks 
of key:value pairs. 
selector = { 
property: value, 
other-property: other-value 
}; 
JavaScript can do that!
JS already has lots of Real Programming 
Language Things TM 
» Variables 
» Functions 
» Arrays  Objects 
» Loops 
» Maths 
» String manipulation 
» Dependency management
Warning! 
Total pseudocode, nothing past this point 
actually works
Example: color variables 
var colors = require(./color_palette); 
var Profile = React.createClass({ 
styles: ReactStyle(function () { 
return { 
color: colors[hotPink], 
}; 
}), 
render: function () { 
return( 
div styles={this.styles()} / 
); 
} 
});
Example: Generate a grid 
var gridColumns = 12; 
var styles = {}; 
for (var i = 1; i = gridColumns; i++) { 
var width = (i / gridColumns) * 100; 
styles[span- + i] = ReactStyle(function () { 
return { 
float: left, 
width: width + % 
} 
}); 
} 
var GridColumn = React.createClass({ 
styles: styles, 
render: function () { 
var columns = span- + this.props.columns; 
return( 
div styles={this.styles[columns]()} / 
); 
} 
});
2015 Hipster Preprocessor 
JavaScript?!
The end :) 
@bensmithett 
https://github.com/bensmithett/react-style-example 
https://github.com/SanderSpies/react-style 
https://github.com/chenglou/rcss 
https://github.com/hedgerwang/react-styles 
https://github.com/elierotenberg/react-css

Más contenido relacionado

La actualidad más candente

SharePoint and jQuery Essentials
SharePoint and jQuery EssentialsSharePoint and jQuery Essentials
SharePoint and jQuery EssentialsMark Rackley
 
JavaScript and jQuery Basics
JavaScript and jQuery BasicsJavaScript and jQuery Basics
JavaScript and jQuery BasicsKaloyan Kosev
 
Real World Web components
Real World Web componentsReal World Web components
Real World Web componentsJarrod Overson
 
Cartegraph Live HTML, CSS, JavaScript and jQuery Training
Cartegraph Live HTML, CSS, JavaScript and jQuery TrainingCartegraph Live HTML, CSS, JavaScript and jQuery Training
Cartegraph Live HTML, CSS, JavaScript and jQuery TrainingShane Church
 
Introduction to javascript templating using handlebars.js
Introduction to javascript templating using handlebars.jsIntroduction to javascript templating using handlebars.js
Introduction to javascript templating using handlebars.jsMindfire Solutions
 
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012crokitta
 
Building Web Sites that Work Everywhere
Building Web Sites that Work EverywhereBuilding Web Sites that Work Everywhere
Building Web Sites that Work EverywhereDoris Chen
 
Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology
Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology
Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology Ayes Chinmay
 
How I Learned to Stop Worrying and Love jQuery (Jan 2013)
How I Learned to Stop Worrying and Love jQuery (Jan 2013)How I Learned to Stop Worrying and Love jQuery (Jan 2013)
How I Learned to Stop Worrying and Love jQuery (Jan 2013)David Giard
 
Short intro to JQuery and Modernizr
Short intro to JQuery and ModernizrShort intro to JQuery and Modernizr
Short intro to JQuery and ModernizrJussi Pohjolainen
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterpriseDave Artz
 
Managing JavaScript Dependencies With RequireJS
Managing JavaScript Dependencies With RequireJSManaging JavaScript Dependencies With RequireJS
Managing JavaScript Dependencies With RequireJSDen Odell
 
jQuery Tips Tricks Trivia
jQuery Tips Tricks TriviajQuery Tips Tricks Trivia
jQuery Tips Tricks TriviaCognizant
 
JsViews - Next Generation jQuery Templates
JsViews - Next Generation jQuery TemplatesJsViews - Next Generation jQuery Templates
JsViews - Next Generation jQuery TemplatesBorisMoore
 

La actualidad más candente (19)

RequireJS & Handlebars
RequireJS & HandlebarsRequireJS & Handlebars
RequireJS & Handlebars
 
SharePoint and jQuery Essentials
SharePoint and jQuery EssentialsSharePoint and jQuery Essentials
SharePoint and jQuery Essentials
 
JavaScript and jQuery Basics
JavaScript and jQuery BasicsJavaScript and jQuery Basics
JavaScript and jQuery Basics
 
Real World Web components
Real World Web componentsReal World Web components
Real World Web components
 
Cartegraph Live HTML, CSS, JavaScript and jQuery Training
Cartegraph Live HTML, CSS, JavaScript and jQuery TrainingCartegraph Live HTML, CSS, JavaScript and jQuery Training
Cartegraph Live HTML, CSS, JavaScript and jQuery Training
 
Introduction to javascript templating using handlebars.js
Introduction to javascript templating using handlebars.jsIntroduction to javascript templating using handlebars.js
Introduction to javascript templating using handlebars.js
 
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
 
Building Web Sites that Work Everywhere
Building Web Sites that Work EverywhereBuilding Web Sites that Work Everywhere
Building Web Sites that Work Everywhere
 
Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology
Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology
Internet and Web Technology (CLASS-10) [Node.js] | NIC/NIELIT Web Technology
 
J query
J queryJ query
J query
 
How I Learned to Stop Worrying and Love jQuery (Jan 2013)
How I Learned to Stop Worrying and Love jQuery (Jan 2013)How I Learned to Stop Worrying and Love jQuery (Jan 2013)
How I Learned to Stop Worrying and Love jQuery (Jan 2013)
 
Short intro to JQuery and Modernizr
Short intro to JQuery and ModernizrShort intro to JQuery and Modernizr
Short intro to JQuery and Modernizr
 
JQuery
JQueryJQuery
JQuery
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] Enterprise
 
DirectToWeb 2.0
DirectToWeb 2.0DirectToWeb 2.0
DirectToWeb 2.0
 
Managing JavaScript Dependencies With RequireJS
Managing JavaScript Dependencies With RequireJSManaging JavaScript Dependencies With RequireJS
Managing JavaScript Dependencies With RequireJS
 
jQuery Tips Tricks Trivia
jQuery Tips Tricks TriviajQuery Tips Tricks Trivia
jQuery Tips Tricks Trivia
 
JQuery
JQueryJQuery
JQuery
 
JsViews - Next Generation jQuery Templates
JsViews - Next Generation jQuery TemplatesJsViews - Next Generation jQuery Templates
JsViews - Next Generation jQuery Templates
 

Destacado

Modern networking for php developers - Dutch PHP conference 2015
Modern networking for php developers - Dutch PHP conference 2015Modern networking for php developers - Dutch PHP conference 2015
Modern networking for php developers - Dutch PHP conference 2015SynchroM
 
UX, ethnography and possibilities: for Libraries, Museums and Archives
UX, ethnography and possibilities: for Libraries, Museums and ArchivesUX, ethnography and possibilities: for Libraries, Museums and Archives
UX, ethnography and possibilities: for Libraries, Museums and ArchivesNed Potter
 
Designing Teams for Emerging Challenges
Designing Teams for Emerging ChallengesDesigning Teams for Emerging Challenges
Designing Teams for Emerging ChallengesAaron Irizarry
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with DataSeth Familian
 
3 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 20173 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 2017Drift
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheLeslie Samuel
 

Destacado (6)

Modern networking for php developers - Dutch PHP conference 2015
Modern networking for php developers - Dutch PHP conference 2015Modern networking for php developers - Dutch PHP conference 2015
Modern networking for php developers - Dutch PHP conference 2015
 
UX, ethnography and possibilities: for Libraries, Museums and Archives
UX, ethnography and possibilities: for Libraries, Museums and ArchivesUX, ethnography and possibilities: for Libraries, Museums and Archives
UX, ethnography and possibilities: for Libraries, Museums and Archives
 
Designing Teams for Emerging Challenges
Designing Teams for Emerging ChallengesDesigning Teams for Emerging Challenges
Designing Teams for Emerging Challenges
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with Data
 
3 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 20173 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 2017
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
 

Similar a Styling components with JavaScript

Practical HTML5: Using It Today
Practical HTML5: Using It TodayPractical HTML5: Using It Today
Practical HTML5: Using It TodayDoris Chen
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenerytoddbr
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVCAlive Kuo
 
Guia de Sobrevivência JS no mundo Open Source
Guia de Sobrevivência JS no mundo Open SourceGuia de Sobrevivência JS no mundo Open Source
Guia de Sobrevivência JS no mundo Open SourceLeonardo Balter
 
Web performance essentials - Goodies
Web performance essentials - GoodiesWeb performance essentials - Goodies
Web performance essentials - GoodiesJerry Emmanuel
 
Web Development for UX Designers
Web Development for UX DesignersWeb Development for UX Designers
Web Development for UX DesignersAshlimarie
 
Jquery presentation
Jquery presentationJquery presentation
Jquery presentationMevin Mohan
 
Jarv.us Showcase — SenchaCon 2011
Jarv.us Showcase — SenchaCon 2011Jarv.us Showcase — SenchaCon 2011
Jarv.us Showcase — SenchaCon 2011Chris Alfano
 
J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012ghnash
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...tdc-globalcode
 
Django Rest Framework and React and Redux, Oh My!
Django Rest Framework and React and Redux, Oh My!Django Rest Framework and React and Redux, Oh My!
Django Rest Framework and React and Redux, Oh My!Eric Palakovich Carr
 
Integrating React.js Into a PHP Application
Integrating React.js Into a PHP ApplicationIntegrating React.js Into a PHP Application
Integrating React.js Into a PHP ApplicationAndrew Rota
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e bigAndy Peterson
 
jQuery & 10,000 Global Functions: Working with Legacy JavaScript
jQuery & 10,000 Global Functions: Working with Legacy JavaScriptjQuery & 10,000 Global Functions: Working with Legacy JavaScript
jQuery & 10,000 Global Functions: Working with Legacy JavaScriptGuy Royse
 

Similar a Styling components with JavaScript (20)

Practical HTML5: Using It Today
Practical HTML5: Using It TodayPractical HTML5: Using It Today
Practical HTML5: Using It Today
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenery
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC
 
Guia de Sobrevivência JS no mundo Open Source
Guia de Sobrevivência JS no mundo Open SourceGuia de Sobrevivência JS no mundo Open Source
Guia de Sobrevivência JS no mundo Open Source
 
Wt unit 2 ppts client sied technology
Wt unit 2 ppts client sied technologyWt unit 2 ppts client sied technology
Wt unit 2 ppts client sied technology
 
Wt unit 2 ppts client side technology
Wt unit 2 ppts client side technologyWt unit 2 ppts client side technology
Wt unit 2 ppts client side technology
 
Web performance essentials - Goodies
Web performance essentials - GoodiesWeb performance essentials - Goodies
Web performance essentials - Goodies
 
Having Fun with Play
Having Fun with PlayHaving Fun with Play
Having Fun with Play
 
Web Development for UX Designers
Web Development for UX DesignersWeb Development for UX Designers
Web Development for UX Designers
 
Webpack
Webpack Webpack
Webpack
 
RequireJS
RequireJSRequireJS
RequireJS
 
Jquery presentation
Jquery presentationJquery presentation
Jquery presentation
 
Jarv.us Showcase — SenchaCon 2011
Jarv.us Showcase — SenchaCon 2011Jarv.us Showcase — SenchaCon 2011
Jarv.us Showcase — SenchaCon 2011
 
J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
 
Django Rest Framework and React and Redux, Oh My!
Django Rest Framework and React and Redux, Oh My!Django Rest Framework and React and Redux, Oh My!
Django Rest Framework and React and Redux, Oh My!
 
Integrating React.js Into a PHP Application
Integrating React.js Into a PHP ApplicationIntegrating React.js Into a PHP Application
Integrating React.js Into a PHP Application
 
Assetic (Zendcon)
Assetic (Zendcon)Assetic (Zendcon)
Assetic (Zendcon)
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
 
jQuery & 10,000 Global Functions: Working with Legacy JavaScript
jQuery & 10,000 Global Functions: Working with Legacy JavaScriptjQuery & 10,000 Global Functions: Working with Legacy JavaScript
jQuery & 10,000 Global Functions: Working with Legacy JavaScript
 

Último

What are the advantages and disadvantages of membrane structures.pptx
What are the advantages and disadvantages of membrane structures.pptxWhat are the advantages and disadvantages of membrane structures.pptx
What are the advantages and disadvantages of membrane structures.pptxwendy cai
 
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdf
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdfCCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdf
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdfAsst.prof M.Gokilavani
 
Correctly Loading Incremental Data at Scale
Correctly Loading Incremental Data at ScaleCorrectly Loading Incremental Data at Scale
Correctly Loading Incremental Data at ScaleAlluxio, Inc.
 
computer application and construction management
computer application and construction managementcomputer application and construction management
computer application and construction managementMariconPadriquez1
 
Call Girls Narol 7397865700 Independent Call Girls
Call Girls Narol 7397865700 Independent Call GirlsCall Girls Narol 7397865700 Independent Call Girls
Call Girls Narol 7397865700 Independent Call Girlsssuser7cb4ff
 
Call Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile serviceCall Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile servicerehmti665
 
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...srsj9000
 
Past, Present and Future of Generative AI
Past, Present and Future of Generative AIPast, Present and Future of Generative AI
Past, Present and Future of Generative AIabhishek36461
 
Introduction to Machine Learning Unit-3 for II MECH
Introduction to Machine Learning Unit-3 for II MECHIntroduction to Machine Learning Unit-3 for II MECH
Introduction to Machine Learning Unit-3 for II MECHC Sai Kiran
 
INFLUENCE OF NANOSILICA ON THE PROPERTIES OF CONCRETE
INFLUENCE OF NANOSILICA ON THE PROPERTIES OF CONCRETEINFLUENCE OF NANOSILICA ON THE PROPERTIES OF CONCRETE
INFLUENCE OF NANOSILICA ON THE PROPERTIES OF CONCRETEroselinkalist12
 
complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...asadnawaz62
 
Oxy acetylene welding presentation note.
Oxy acetylene welding presentation note.Oxy acetylene welding presentation note.
Oxy acetylene welding presentation note.eptoze12
 
Work Experience-Dalton Park.pptxfvvvvvvv
Work Experience-Dalton Park.pptxfvvvvvvvWork Experience-Dalton Park.pptxfvvvvvvv
Work Experience-Dalton Park.pptxfvvvvvvvLewisJB
 
Application of Residue Theorem to evaluate real integrations.pptx
Application of Residue Theorem to evaluate real integrations.pptxApplication of Residue Theorem to evaluate real integrations.pptx
Application of Residue Theorem to evaluate real integrations.pptx959SahilShah
 
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort serviceGurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort servicejennyeacort
 
Instrumentation, measurement and control of bio process parameters ( Temperat...
Instrumentation, measurement and control of bio process parameters ( Temperat...Instrumentation, measurement and control of bio process parameters ( Temperat...
Instrumentation, measurement and control of bio process parameters ( Temperat...121011101441
 
An introduction to Semiconductor and its types.pptx
An introduction to Semiconductor and its types.pptxAn introduction to Semiconductor and its types.pptx
An introduction to Semiconductor and its types.pptxPurva Nikam
 
UNIT III ANALOG ELECTRONICS (BASIC ELECTRONICS)
UNIT III ANALOG ELECTRONICS (BASIC ELECTRONICS)UNIT III ANALOG ELECTRONICS (BASIC ELECTRONICS)
UNIT III ANALOG ELECTRONICS (BASIC ELECTRONICS)Dr SOUNDIRARAJ N
 

Último (20)

young call girls in Green Park🔝 9953056974 🔝 escort Service
young call girls in Green Park🔝 9953056974 🔝 escort Serviceyoung call girls in Green Park🔝 9953056974 🔝 escort Service
young call girls in Green Park🔝 9953056974 🔝 escort Service
 
What are the advantages and disadvantages of membrane structures.pptx
What are the advantages and disadvantages of membrane structures.pptxWhat are the advantages and disadvantages of membrane structures.pptx
What are the advantages and disadvantages of membrane structures.pptx
 
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdf
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdfCCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdf
CCS355 Neural Network & Deep Learning Unit II Notes with Question bank .pdf
 
POWER SYSTEMS-1 Complete notes examples
POWER SYSTEMS-1 Complete notes  examplesPOWER SYSTEMS-1 Complete notes  examples
POWER SYSTEMS-1 Complete notes examples
 
Correctly Loading Incremental Data at Scale
Correctly Loading Incremental Data at ScaleCorrectly Loading Incremental Data at Scale
Correctly Loading Incremental Data at Scale
 
computer application and construction management
computer application and construction managementcomputer application and construction management
computer application and construction management
 
Call Girls Narol 7397865700 Independent Call Girls
Call Girls Narol 7397865700 Independent Call GirlsCall Girls Narol 7397865700 Independent Call Girls
Call Girls Narol 7397865700 Independent Call Girls
 
Call Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile serviceCall Girls Delhi {Jodhpur} 9711199012 high profile service
Call Girls Delhi {Jodhpur} 9711199012 high profile service
 
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
Gfe Mayur Vihar Call Girls Service WhatsApp -> 9999965857 Available 24x7 ^ De...
 
Past, Present and Future of Generative AI
Past, Present and Future of Generative AIPast, Present and Future of Generative AI
Past, Present and Future of Generative AI
 
Introduction to Machine Learning Unit-3 for II MECH
Introduction to Machine Learning Unit-3 for II MECHIntroduction to Machine Learning Unit-3 for II MECH
Introduction to Machine Learning Unit-3 for II MECH
 
INFLUENCE OF NANOSILICA ON THE PROPERTIES OF CONCRETE
INFLUENCE OF NANOSILICA ON THE PROPERTIES OF CONCRETEINFLUENCE OF NANOSILICA ON THE PROPERTIES OF CONCRETE
INFLUENCE OF NANOSILICA ON THE PROPERTIES OF CONCRETE
 
complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...complete construction, environmental and economics information of biomass com...
complete construction, environmental and economics information of biomass com...
 
Oxy acetylene welding presentation note.
Oxy acetylene welding presentation note.Oxy acetylene welding presentation note.
Oxy acetylene welding presentation note.
 
Work Experience-Dalton Park.pptxfvvvvvvv
Work Experience-Dalton Park.pptxfvvvvvvvWork Experience-Dalton Park.pptxfvvvvvvv
Work Experience-Dalton Park.pptxfvvvvvvv
 
Application of Residue Theorem to evaluate real integrations.pptx
Application of Residue Theorem to evaluate real integrations.pptxApplication of Residue Theorem to evaluate real integrations.pptx
Application of Residue Theorem to evaluate real integrations.pptx
 
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort serviceGurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
 
Instrumentation, measurement and control of bio process parameters ( Temperat...
Instrumentation, measurement and control of bio process parameters ( Temperat...Instrumentation, measurement and control of bio process parameters ( Temperat...
Instrumentation, measurement and control of bio process parameters ( Temperat...
 
An introduction to Semiconductor and its types.pptx
An introduction to Semiconductor and its types.pptxAn introduction to Semiconductor and its types.pptx
An introduction to Semiconductor and its types.pptx
 
UNIT III ANALOG ELECTRONICS (BASIC ELECTRONICS)
UNIT III ANALOG ELECTRONICS (BASIC ELECTRONICS)UNIT III ANALOG ELECTRONICS (BASIC ELECTRONICS)
UNIT III ANALOG ELECTRONICS (BASIC ELECTRONICS)
 

Styling components with JavaScript

  • 1. Styling Components with JavaScript @bensmithett
  • 2. Warning » Not a tutorial for use in production! » I'm not even using any of this outside late night hacks But there are some interesting new ideas. Let's explore them & challenge CSS best practices!
  • 3. Components are awesome! Nobody builds pages any more. Here's an example Profile component: components/ Profile/ index.hbs index.css index.js
  • 4. HTML Template <div class="profile"> <img class="profile__avatar" src="{{avatarUrl}}.jpg" /> <strong>{{username}}</strong> </div> Style .profile { border: 1px solid #ddd; overflow: hidden; } .profile__avatar { float: left; margin-right: 10px; }
  • 5. Behaviour var Profile = function (el) { el.addEventListener("click", function () { console.log("hai!"); }); this.el = el; this.tmpl = Handlebars.compile(someTemplateString); }; Profile.prototype.render = function (state) { this.el.innerHTML = this.tmpl(state); };
  • 6.
  • 7. React combines HTML structure & behaviour var React = require("react"); var Profile = React.createClass({ handleClick: function () { console.log("hai"); }, render: function () { return ( <div class="profile"> <img class="profile__avatar" src="{this.props.avatarUrl}.jpg" onClick={this.handleClick} /> <strong>{this.props.username}</strong> </div> ); } }); module.exports = Profile;
  • 8.
  • 9. That's a big dirty lie The component's CSS is one of its concerns, but it's off in some random other file. components/ Profile/ index.css index.jsx
  • 10. The only connection: a class name // JS render: function () { return ( <div class="profile"> // ... </div> ) } /* CSS */ .profile border: 1px solid #ddd; overflow: hidden;
  • 11. Most things » JS Dependencies are explicitly required » HTML structure is right there in the file » JS behaviour is right there in the file CSS » In another file, the classes might have the same name ¯_()_/¯ It's a crappy, vague connection.
  • 12. CSS builds are a bit backwards //app.scss @import vendor/Normalize.css; @import base; @import components/Header; @import components/Profile; @import components/Footer; You need to know which bits of CSS your app requires. Lame.
  • 13. What if our JS build automatically created a stylesheet based only on the components we use? // app.js var Profile = require(./components/Profile); var Header = require(./components/Header); var Footer = require(./components/Footer); // app.css // Somehow... // components/Profile/index.css // components/Header/index.css // components/Footer/index.css // ... end up here?
  • 14.
  • 16. var React = require(react); require(./index.css); var Profile = React.createClass({ render: function () { return ( div class=profile / ); } }); module.exports = Profile;
  • 17. // app.js var Profile = require(./components/Profile); var Header = require(./components/Header); var Footer = require(./components/Footer); // app.css generated by webpack .profile { ... } .profile__avatar { ... } .header { ... } .footer { ... }
  • 18. Hooray! CSS is just another dependency we can require() in our component
  • 19. Hooray? components/ Profile/ index.css index.jsx » Still working across 2 files » Need to maintain class names across 2 files ... still a bit lame.
  • 20. React can do inline styles // Profile/index.js var Profile = React.createClass({ styles: { border: 1px solid #ddd, overflow: hidden }, render: function () { return( div style={this.styles} / ); } }); !-- DOM generated by React -- div style=border: 1px solid #ddd; overflow: hidden; /div
  • 21. Nobody likes inline styles though
  • 22. What we really want: » Declare styles in the component, like we do with inline styles » Build process that... » converts them to a CSS class » spits out a shiny, auto-generated app.css » component knows to use that class name
  • 23. React-style does that! » https://github.com/SanderSpies/react-style » http://andreypopp.com/posts/2014-08-06- react-style.html (with a little help from webpack)
  • 24. var React = require(react/addons); var ReactStyle = require(react-style); var Profile = React.createClass({ styles: ReactStyle(function () { return { backgroundColor: green, border: 1px solid #ddd }; }), render: function () { return( div styles={this.styles()} / ); } }); module.exports = Profile;
  • 25. !-- DOM generated by React -- div class=a ... /div // app.css generated by React-style Webpack .a { background-color: green; border: 1px solid #ddd; }
  • 26. Demo Compiling with default compressed class names
  • 28. Do you even need a CSS naming convention?
  • 29. not really... » Styles are tightly coupled part of the component, not a separate thing » CSS class naming conventions are a project setting, not an inherent property of the component » Dev: BEM class names for easy debugging » Prod: Tiny compressed class names
  • 30. I 3 Sass $red: #f00; $grid-columns: 12; $base-font-size: 16px; @function px-to-em($px, $base: $base-font-size) { @return ($px / $base) * 1em; } %placeholder { color: $red; } .thing { @extend %placeholder; padding: 10px; }
  • 31. What is a Preprocessor? A language that helps us generate blocks of key:value pairs. selector { property: value; other-property: other-value; }
  • 32. What is a Preprocessor? A language that helps us generate blocks of key:value pairs. selector = { property: value, other-property: other-value }; JavaScript can do that!
  • 33. JS already has lots of Real Programming Language Things TM » Variables » Functions » Arrays Objects » Loops » Maths » String manipulation » Dependency management
  • 34. Warning! Total pseudocode, nothing past this point actually works
  • 35. Example: color variables var colors = require(./color_palette); var Profile = React.createClass({ styles: ReactStyle(function () { return { color: colors[hotPink], }; }), render: function () { return( div styles={this.styles()} / ); } });
  • 36. Example: Generate a grid var gridColumns = 12; var styles = {}; for (var i = 1; i = gridColumns; i++) { var width = (i / gridColumns) * 100; styles[span- + i] = ReactStyle(function () { return { float: left, width: width + % } }); } var GridColumn = React.createClass({ styles: styles, render: function () { var columns = span- + this.props.columns; return( div styles={this.styles[columns]()} / ); } });
  • 38. The end :) @bensmithett https://github.com/bensmithett/react-style-example https://github.com/SanderSpies/react-style https://github.com/chenglou/rcss https://github.com/hedgerwang/react-styles https://github.com/elierotenberg/react-css