sviluppo css agile con sass e compass - css day 2015 faenza
TRANSCRIPT
• Grave dipendenza dasviluppo front-end
• Front-end Architect
• Speaker occasionale
www.andreaverlicchi.eu ~ @verlok
button {background: #ABCDEF;
}
a {color: #ABCDEF;
}
header {border-bottom: 5px;border-color: #ABCDEF;
}
$mainColor: #ABCDEF;
button {background: $mainColor;
}
a {color: $mainColor;
}
header {border-bottom: 5px;border-color: $mainColor;
}
Variabili
Annidamento
article h1 {margin-right: 1em;
}
article a {color: white;background: red;display: block;
}
article a:hover {color: red;background: white;
}
article {
h1 {margin-right: 1em;
}
a {color: white;background: red;display: block;
&:hover {color: red;background: white;
}}
}
Operazioni
aside {width: 23.95833%;
}
$width: 960px;$asideWidth: 230px;
aside { width: $asideWidth / $width * 100%;}
Parziali
@import “_variables”;@import "_reset";@import "_fonts";@import "_headerFooter";@import "_forms";@import "_base";@import "_helpers";@import “_whatever”;
…
main.scss main.css
// _reset.scsshtml, body, div, span, h1, h2, h3, h4, h5, h6 … { margin: 0; padding: 0; …} // …
// _fonts.scss@font-face { font-family: myFont; //…} // …
// …// _whatever.scss
Helper
button:hover { background-color: #A6CDF4;}
button.disabled { background-color: #C4CDD6;}
$buttonColor: #ABCDEF;
button:hover {background-color: adjust-saturation($buttonColor, 10%);
}
button.disabled {background-color: adjust-saturation($buttonColor, -10%);
}
Extend.message {font-weight: bold;padding: 1em;border-width: 2px;
}
.error { @extend .message; color: red; border-color: red;}
.alert { @extend .message; color: orange; border-color: orange;}
.message, .error, .alert { font-weight: bold;padding: 1em;border-width: 2px;
}
.error { color: red; border-color: red;}
.alert { color: orange; border-color: orange;}
Extend%message {font-weight: bold;padding: 1em;border-width: 2px;
}
.error { @extend %message; color: red; border-color: red;}
.alert { @extend %message; color: orange; border-color: orange;}
.error, .alert { font-weight: bold;padding: 1em;border-width: 2px;
}
.error { color: red; border-color: red;}
.alert { color: orange; border-color: orange;}
Mixin@mixin message {font-weight: bold;padding: 1em;border-width: 2px;
}
.error { @include message; color: red; border-color: red;}
.alert { @include message; color: orange; border-color: orange;}
.error { font-weight: bold;padding: 1em;border-width: 2px;
color: red; border-color: red;}
.alert { font-weight: bold;padding: 1em;border-width: 2px;
color: orange; border-color: orange;}
Extend vs Mixin
• Lunghezza CSS
• Utilizzo con media query
• Parametri
EXTEND WINS
MIXIN WINS
MIXIN WINS
Mixin@mixin opacity($opacity) { opacity: $opacity; filter: alpha(opacity=$opacity*100);}
.faded-text { @include opacity(0.8);}
.faded-text { opacity: 0.8; filter: alpha(opacity=80);}
Stile di output
• nested .widget-social { text-align: right; } .widget-social a, .widget-social a:visited { padding: 0 3px; color: #222222; } .widget-social a:hover { color: #B00909; }
Stile di output
• nested
• expanded
.widget-social { text-align: right;}.widget-social a,.widget-social a:visited { padding: 0 3px; color: #222222;}.widget-social a:hover { color: #B00909;}
Stile di output
• nested
• expanded
• compact
.widget-social { text-align: right; }
.widget-social a, .widget-social a:visited { padding: 0 3px; … }
.widget-social a:hover { color: #B00909; }
Stile di output
• nested
• expanded
• compact
• compressed
.widget-social{text-align:right}.widget-social a,.widget-social a:visited{padding:0 3px;color:#222222}.widget-social a:hover{co lor:#B00909}
Configurazione soglie
// Dichiarare prima di @import-are compass
$graceful-usage-threshold: 5; // def: 0.1$critical-usage-threshold: 1; // def: 0.01
@import "compass/css3";
// Tutto il resto a seguire...
Background & Gradients
.myBox { @include background(linear-gradient(to bottom, #F00, #0F0));}
.myBox { // ... background: -moz-linear-gradient(top, #ff0000, #00ff00); background: -webkit-linear-gradient(top, #ff0000, #00ff00); background: linear-gradient(to bottom, #ff0000, #00ff00);}
Keyframes
@include keyframes(spin) { from { transform: rotate(0); } to { transform: rotate(360deg); }}
@-moz-keyframes spin { ... } @-webkit-keyframes spin { ... } @keyframes spin { from { transform: rotate(0); } to { transform: rotate(360deg); }}
Animation
.myBox { @include animation(spin 1s);}
.myBox { -moz-animation: spin 1s; -webkit-animation: spin 1s; animation: spin 1s;}
Flexbox
.parent { @include display-flex; @include flex-wrap(wrap);}
.child { @include flex-grow(1); }
.parent { display: -webkit-flex; display: flex; -webkit-flex-wrap: wrap; flex-wrap: wrap;}
.child { -webkit-flex-grow: 1; flex-grow: 1;}
Sprite - Tutte@import “compass/utilities/sprites";
@import "flags/*.png";@include all-flags-sprites;
.flags-it,
.flags-de,
.flags-fr { background: url('/images/flags-s34fe0604ab.png') no-repeat; }
.flags-it { background-position: 0 0; }
.flags-de { background-position: 0 -32px; }
.flags-fr { background-position: 0 -64px; }
// flags// it.png // de.png// fr.png
Sprite - Singola
@import "compass/utilities/sprites";
@import "flags/*.png";
// it.png // de.png
.myBox {@include flags-sprite(it);
}
.anotherBox {@include flags-sprite(de);
}
.myBox,
.anotherBox {background: url('../img/flags-
s69e070e3f8.png') no-repeat;}
.myBox {background-position: 0 0;
}
.anotherBox {background-position: 0 -32px;
}
Sprite - Avanzato
• Generazione dimensioni box
• Offset dentro box
• Spaziatura immagini sprite
• Gestione densità display
• Ecco come:andreaverlicchi.eu/css-day-2015
Installazione
• Download Ruby rubyinstaller.org
• Install Compass
• Download Ruby ruby-lang.com
• Install Compass
gem install compasssudo
Configurazione
• Attivare la cartella del progetto
• Creare file di configurazione
cd path/to/project
compass config --css-dir css
Primi file SASS
• Conversione CSS a SCSS
sass-convert css/main.css --to scss
• Creare cartelle e file iniziali
compass install compass
sass-convert css --to scss --recursive
<button class=“btn btn-large” type=“submit”>
<button class=“btn btn-small” type=“reset”>
<button class=“btn btn-grey” disabled>
.btn { padding: 0.5em; border: none; background: darkred; color: white;}
.btn-large { padding: 1em; font-size: 16px;}
.btn-small { padding: 0.2em; font-size: 12px;}
.btn-grey { background: darkgrey;}
CSSHTML
.btn { padding: 0.5em; border: none; background: darkred; color: white;}
.btn-large { padding: 1em; font-size: 16px;}
.btn-small { padding: 0.2em; font-size: 12px;}
.btn-grey { background: darkgrey;}
CSS
@mixin btn { padding: 0.5em; border: none; background: darkred; color: white;}
@mixin btn-large { padding: 1em; font-size: 16px;}
@mixin btn-small { padding: 0.2em; font-size: 12px;}
@mixin btn-grey { background: darkgrey;}
SASS
.btn { padding: 0.5em; border: none; background: darkred; color: white;}
.btn-large { padding: 1em; font-size: 16px;}
.btn-small { padding: 0.2em; font-size: 12px;}
.btn-grey { background: darkgrey;}
CSS
@mixin btn { padding: 0.5em; border: none; background: darkred; color: white;}
@mixin btn-large { padding: 1em; font-size: 16px;}
@mixin btn-small { padding: 0.2em; font-size: 12px;}
@mixin btn-grey { background: darkgrey;}
SASS
@mixin btn { padding: 0.5em; border: none; background: darkred; color: white;}
@mixin btn-large { padding: 1em; font-size: 16px;}
@mixin btn-small { padding: 0.2em; font-size: 12px;}
@mixin btn-grey { background: darkgrey;}
SASSHTML
<button class=“btn btn-large” type=“submit”>
<button class=“btn btn-small” type=“reset”>
<button class=“btn btn-grey” disabled>
@mixin btn { padding: 0.5em; border: none; background: darkred; color: white;}
@mixin btn-large { padding: 1em; font-size: 16px;}
@mixin btn-small { padding: 0.2em; font-size: 12px;}
@mixin btn-grey { background: darkgrey;}
SASSHTML
<button class=“btn btn-large” type=“submit”>
<button class=“btn btn-small” type=“reset”>
<button class=“btn btn-grey” disabled>
<button class=“btn btn-large” type=“submit”>
<button class=“btn btn-small” type=“reset”>
<button class=“btn btn-grey” disabled>
@mixin btn { padding: 0.5em; border: none; background: darkred; color: white;}
@mixin btn-large { padding: 1em; font-size: 16px;}
@mixin btn-small { padding: 0.2em; font-size: 12px;}
@mixin btn-grey { background: darkgrey;}
button { @include btn;}
button[type=“submit”] { @include btn; @include btn-large;}
button[type=“reset”] { @include btn; @include btn-small;}
button[disabled] { @include btn; @include btn-grey;}
SASSHTML
<button class=“btn btn-large” type=“submit”>
<button class=“btn btn-small” type=“reset”>
<button class=“btn btn-grey” disabled>
<button class=“btn btn-large” type=“submit”>
<button class=“btn btn-small” type=“reset”>
<button class=“btn btn-grey” disabled>
DOM leggero
<ul id=“menu-top-navigation" class="nav navbar-nav"> <li class=“menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-183 current_page_item active menu-item-188”> ... </li></ul>
<ul id=“menu-top-navigation"> <li class=“active”> ... </li></ul>
SASS vs LESS
@verlok #cssday
https://css-tricks.com/sass-vs-less/
http://www.zingdesign.com/less-vs-sass-its-time-to-switch-to-sass/
Bootstrap (sostantivo): una libreria applicata ad un sito quando lo sviluppatore front-end ha perso
la passione per il suo lavoro
@verlok #cssday
“1186 regole CSS (91%) non sono utilizzate dalla pagina corrente”