John Cardozo
Software Engineer
John Cardozo
John Cardozo
CSS optimizado
Programa con sintaxis propia
compilación y generación
CSS
HTML
usa
genera
Múltiples archivos compilados en uno sólo
Reglas de anidación
Extensibilidad de clases
Reusabilidad de variables
Mantenimiento de código
Don't Repeat Yourself
2009
2010
2006
2006
Syntactically Awesome Style Sheets
SASS
Script
CSS
Output
Variables
Nesting
Partials
Módulos
Mixins
Herencia
Operadores
Características
Variables
Nesting
Partials
Módulos
Mixins
Herencia
Operadores
Almacenamiento de información
Código jerárquico, agrupado
Inclusión de código en otros archivos
División de código en archivos
Grupo de reglas reutilizables
Extensión de clases existentes
Operaciones matemáticas
Control
Condicionales, ciclos
Instalación
Verificación
node --version
npm --version
Node Package Manager
Node
Visual Studio Code
Verificación de instalación
sass --version
Instalación global de SASS
npm install sass -g
Abrir folder del proyecto
code .
Terminal
Ejecuta un servidor de desarrollo dentro de VSCode
Se crea un archivo HTML
# Creación del proyecto
npm create vite@latest nombre-proyecto
# Unicarse en el folder del proyecto
cd nombre-proyecto
# Instalar dependencias
npm install
# Instalar sass en el proyecto
npm add -D sass
# Ejecutar el proyecto
npm run dev
Vite
import './style.scss'
Agregar scss a main.js
# Generar proyecto
npm run build
# Ejecutar build
npm run preview
Preview
Archivo HTML
<html>
<head>
<title>Mi pagina</title>
<link
rel="stylesheet"
href="css/estilo.css" />
</head>
<body>
<div>
<p>
Lorem ipsum
</p>
</div>
</body>
</html>
Archivo SCSS
body {
background: red;
}
Generación manual
sass estilo.scss css/estilo.css
Generación automática: watch
sass --watch estilo.scss css/estilo.css
CSS
MAP
Archivo JSON conecta el archivo CSS con su archivo fuente SCSS
Archivo CSS generado a partir del archivo fuente SCSS
Parámetro style
sass estilo.scss css/estilo.css --style compressed
Generación paralela de versión de desarrollo y versión de producción
sass --watch scss/style.scss:css/style.css --watch css/style.css:dist/style.min.css --style compressed
SCSS
CSS
CSS
watch
watch
dev
prod
SASS
SCSS
Indentación
Bloques
div {
color: red;
background-color: white;
h1 {
color: yellow;
}
}
div
color: red
background-color: white
h1
color: yellow
Difícil adaptación
Adaptación fácil
SCSS
$color-principal: navy;
$color-fuente: white;
body {
background: $color-principal;
}
h1 {
color: $color-fuente;
}
p {
color: $color-fuente;
}
Comentarios
// Estas son las variables
$color-principal: navy;
CSS
body {
background: navy;
}
h1 {
color: white;
}
p{
color: white;
}
_variables.scss
$color-principal: navy;
$color-fuente: white;
El nombre del archivo debe iniciar con el caracter _
estilo.scss
@import 'variables';
body {
background: $color-principal;
}
Obtiene el código del archivo partial a través de la directiva @import
partial
GLOBAL
Será obsoleto en Marzo 2023
_variables.scss
$color-principal: navy;
$color-fuente: white;
El nombre del archivo debe iniciar con el caracter _
estilo.scss
@use 'variables' as v;
body {
background: v.$color-principal;
}
Obtiene el código del archivo partial a través de la directiva @use
namespace
partial
_fonts.scss
@import url("https://fonts.googleapis.com/css2?family=Roboto:wght@100&display=swap");
estilo.scss
@use "reset";
@use "fonts";
@use "variables" as v;
body {
background: v.$color-principal;
font-family: "Roboto", sans-serif;
}
_reset.scss
*,
*::before,
*::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
_variables.scss
$color-principal: navy;
$color-fuente: white;
SCSS
.card {
display: block;
padding: 20px;
box-shadow: 2px 2px 5px black;
.card-title {
color: black;
}
.card-body {
color: blue;
a {
color: cyan;
}
}
}
CSS
.card {
display: block;
padding: 20px;
box-shadow: 2px 2px 5px black;
}
.card .card-title {
color: black;
}
.card .card-body {
color: blue;
}
.card .card-body a {
color: cyan;
}
_variables.scss
@use "sass:math";
// Tanmaños de fuente
$font-size-base: 1rem;
$font-size-sm: $font-size-base * 0.75;
$font-size-lg: $font-size-base * 1.5;
$font-size-xl: $font-size-base * 2;
$font-size-xxl: $font-size-base * 3;
// Bordes
$border-radius-base: 20px;
$border-radius-sm: math.div($border-radius-base, 2);
Operador de multiplicación
Función de división
debug
@debug "mensaje"; // mensaje
@debug math.div(10px, 2); // 5px
@debug math.max(3px, 10px, 18px, 8px); // 10px
@debug math.floor(3.14); // 3
_variables.scss
$error: red;
$colors: (
"primary": red,
"secondary": pink,
"error": $error,
"info": cyan
);
clave, valor
Conjunto de valores
// Mostrar el map
@debug $colors;
// Mostrar un valor del map
@debug map-get($colors, "error");
// Saber si el map contiene un valor
@debug map-has-key($colors, "error");
// Eliminar un valor del map
@debug map-remove($colors, "info");
// Agregar un valor al map
@debug map-merge($colors, ("warning": orange));
Operaciones con map
_buttons.scss
.btn {
background: map-get($colors, "info");
}
Obtiene el valor del map y lo asigna a un atributo de la clase
_palette.scss
@use "variables" as v;
@each $key, $val in v.$colors {
.text-#{$key} {
color: $val;
}
}
Genera la clase dado el key, val
#{$variable}
Reemplaza el nombre de la clase con el valor de la variable
@use "variables" as v;
@each $key, $val in v.$colors {
@debug $key, $val;
}
Recorre y muestra el map
Genera clases CSS recorriendo los valores de un map
_palette.scss
@use "variables" as v;
@each $key, $val in v.$colors {
// Texto
.text-#{$key} {
color: $val;
}
// Background
.bg-#{$key} {
background-color: $val;
}
}
// Colores
$primary: #326dee;
$secondary: #1ac886;
$font-color: #100957;
$light-color: #0addb3;
$light-gray: #f0f0f0;
$info: #4bbaff;
$error: #f75a5a;
// Paleta de colores
$colors: (
"primary": $primary,
"secondary": $secondary,
"info": $info,
"error": $error,
"white": #fff,
"black": #000,
);
_variables.scss
_palette.scss
@use "variables" as v;
@each $key, $val in v.$colors {
.text-#{$key} {
color: $val;
}
.bg-#{$key} {
background-color: $val;
}
@for $i from 1 through 9 {
.text-#{$key}-light-#{$i} {
color: mix(white, $val, $i * 10%);
}
.bg-#{$key}-light-#{$i} {
background-color: mix(white, $val, $i * 10%);
}
}
@for $i from 1 through 9 {
.text-#{$key}-dark-#{$i} {
color: mix(black, $val, $i * 10%);
}
.bg-#{$key}-dark-#{$i} {
background-color: mix(black, $val, $i * 10%);
}
}
}
texto
background
texto claro
background claro
texto oscuro
background oscuro
verde
variaciones claras
variaciones oscuras
background
background claro
background oscuro
index.html
<div class="bg-white">
<span class="text-primary">Primary</span> |
<span class="text-secondary">Secondary</span> |
<span class="text-info">Info</span> |
<span class="text-error">Error</span> |
</div>
<div class="bg-white">
<span class="bg-primary text-white">Primary</span> |
<span class="bg-secondary text-white">Secondary</span> |
<span class="bg-info text-white">Info</span> |
<span class="bg-error text-white">Error</span> |
</div>
<div class="bg-white">
<div class="bg-primary-dark-8 text-white">primary dark 8</div>
<div class="bg-primary-dark-6 text-white">primary dark 6</div>
<div class="bg-primary-dark-4 text-white">primary dark 4</div>
<div class="bg-primary-dark-2 text-white">primary dark 2</div>
<div class="bg-primary text-white">primary</div>
<div class="bg-primary-light-2 text-white">primary light 2</div>
<div class="bg-primary-light-4 text-white">primary light 4</div>
<div class="bg-primary-light-6 text-white">primary light 6</div>
<div class="bg-primary-light-8 text-white">primary light 8</div>
</div>
@if (5 > 1) {
.testing-conditional {
color: magenta;
}
}
@else
@if (5 == 1) {
.testing-conditional {
color: magenta;
}
} @else {
.testing-conditional {
color: green;
}
}
@if
Una opción
2 opciones
Comparadores
>
<
>=
<=
==
!=
Mayor
Menor
Mayor o igual
Menor o igual
Igual
Diferente
and
or
$a: 3;
@if ($a == 3) {
.a3 {
color: white;
}
}
@if ($a >= 1 and $a <= 5) {
.and {
color: blue;
}
}
@if ($a >= 5 or $a <= 8) {
.or {
color: green;
}
}
Verdadero si todas las opciones son verdaderas
Verdadero si al menos una opción es verdadera
.bg-black-dark-1 {
background-color: black;
}
.text-black-dark-2 {
color: black;
}
.bg-black-dark-2 {
background-color: black;
}
.text-black-dark-3 {
color: black;
}
Valores innecesarios
Clases con el mismo valor
// Genera variaciones si el color
// no es negro o blanco
@if ($val != black and $val != white) {
// Variaciones claras
@for $i from 1 through 9 {
// Texto claro
.text-#{$key}-light-#{$i} {
color: mix(white, $val, $i * 10%);
}
// Background claro
.bg-#{$key}-light-#{$i} {
background-color: mix(white, $val, $i * 10%);
}
}
// Variaciones oscuras
@for $i from 1 through 9 {
// Texto claro
.text-#{$key}-dark-#{$i} {
color: mix(black, $val, $i * 10%);
}
// Background claro
.bg-#{$key}-dark-#{$i} {
background-color: mix(black, $val, $i * 10%);
}
}
}
Menor cantidad de líneas generadas
Menor tamaño del archivo CSS generado
Ejecuta la generación de colores para valores diferentes a blanco y negro
mix(color1, color2, porcentaje)
Función mix de SASS
.review {
padding: 20px;
&__header {
background-color: #0b3575;
h1 {
color: #fff;
&:hover {
color: #176aeE9;
}
}
}
}
SASS
.review {
padding: 20px;
}
.review__header {
background-color: #0b3575;
}
.review__header h1 {
color: #fff;
}
.review__header h1:hover {
color: #176aeE9;
}
CSS
&
Une el nombre del selector con el del selector padre
BEM
Block, Element, Modifier
Pseudo clases
:hover, :focus
<div class="review">
<div class="review__header">
<h1>Frontend Intermedio</h1>
</div>
<div class="review__body">
<div class="review__description">
<p>
Lorem, ipsum dolor sit amet.
Dolorem explicabo quam.
</p>
<div class="review__user">John Cardozo</div>
</div>
<a href="#" class="review__more">Ver mas</a>
</div>
</div>
HTML
$review-padding: 30px;
.review {
display: grid;
grid-template: 1fr auto / 1fr;
border: 1px solid #dedede;
box-shadow: #d6d6d6 2px 2px 10px;
&__header {
background-color: #cccccc;
padding: $review-padding;
h1 {
color: #9c9c9c;
}
}
&__body {
background-color: #fff;
padding: $review-padding;
}
&__description {
p {
font-size: 1.2rem;
text-align: justify;
color: #000;
}
}
&__user {
display: block;
text-align: right;
margin-top: 10px;
font-size: 1.1rem;
color: navy;
cursor: pointer;
&:hover {
font-weight: bold;
}
}
&__more {
background-color: #b3b3b3;
padding: 5px 15px;
border-radius: 20px;
text-decoration: none;
color: #fff;
transition: all ease 0.5s;
&:hover {
background-color: #858585;
}
}
}
SASS
Definición de Mixin
@mixin alerta($fondo: green) {
background: $fondo;
padding: 10px;
border-radius: 10px;
}
Uso de Mixin con parámetros por defecto
.alerta {
@include alerta();
}
Uso de Mixin con parámetros personalizados
.alerta {
@include alerta($fondo: red);
}
Toma el valor definido por defecto en el Mixin
Sobreescribe el valor del parámetro
@mixin
Permite crear código CSS para ser utilizado
@include
Permite incluir código definido en un mixin
Definición de Mixin
@mixin alerta($fondo: green) {
background: $fondo;
padding: 10px;
border-radius: 10px;
}
Uso de Mixin
.alerta-info {
@include alerta();
}
.alerta-warning {
@include alerta($fondo: orange);
}
.alerta-error {
@include alerta($fondo: red);
}
HTML
<div class="alerta-info">
<h3>Información</h3>
<p>Texto de información</p>
</div>
<div class="alerta-warning">
<h3>Advertencia</h3>
<p>Texto de advertencia</p>
</div>
<div class="alerta-error">
<h3>Error</h3>
<p>Texto de error</p>
</div>
Definición de Mixin
@mixin alerta($fondo: green) {
background: $fondo;
padding: 10px;
border-radius: 10px;
h3 {
color: cyan;
}
p {
color: black;
}
}
HTML
<div class="alerta-info">
<h3>Información</h3>
<p>Texto de información</p>
</div>
<div class="alerta-warning">
<h3>Advertencia</h3>
<p>Texto de advertencia</p>
</div>
<div class="alerta-error">
<h3>Error</h3>
<p>Texto de error</p>
</div>
Los Mixin pueden tener anidación de reglas internas
Definición de Mixin
@mixin alerta($fondo: #c3fbc3) {
background: $fondo;
padding: 10px 20px;
border-radius: 10px;
margin: 10px;
border: 2px solid darken($fondo, 60%);
h3 {
color: darken($fondo, 60%);
}
p {
color: darken($fondo, 30%);
}
}
Titulo 1
Lorem ipsum 1
Titulo 2
Lorem ipsum 2
Titulo 2
Lorem ipsum 2
Uso de Mixin
.alerta-info {
@include alerta();
}
.alerta-warning {
@include alerta($fondo: #f9ea8b);
}
.alerta-error {
@include alerta($fondo: #f98b8b);
}
HTML
<div class="alerta-info">
<h3>Información</h3>
<p>Texto de información</p>
</div>
<div class="alerta-warning">
<h3>Advertencia</h3>
<p>Texto de advertencia</p>
</div>
<div class="alerta-error">
<h3>Error</h3>
<p>Texto de error</p>
</div>
Sintaxis general
@function <nombre>(<argumentos...>) {
// instrucciones de la función
@return <valor>
}
Definición de la función
@function sumar($numero1, $numero2) {
$resultado : $numero1 + $numero2;
@return $resultado;
}
Use de la función
div {
height: sumar(300, 400) * 1px;
}
Definición de la función
@function min($numeros...) {
$menor: null;
// Recorre la lista de números
@each $numero in $numeros {
// Compara el número actual
@if $menor == null or $numero < $menor {
$menor: $numero;
}
}
@return $menor;
}
Uso de la función
.micro {
width: min(50px, 30px, 100px);
}
johncardozo@gmail.com
By John Cardozo