viernes, 27 de marzo de 2020

Funciones con JavaScript

Las funciones en JavaScript son bloques de código que realizar tareas particulares para las que son diseñadas, pueden retornar un valor o ninguno. Estas se ejecutan cuando son invocadas, esta invocación puede ocurrir cuando:

  • Al ocurrir un evento como: el usuario presiona algo ("onclick" generalmente) o cambia el estado de un elemento (por ejemplo "onchange").
  • Cuando otra función llama a la función.
  • Cuando son funciones que se invocan automáticamente al cargar una página HTML por ejemplo.

Las funciones, además, pueden tener de cero a más parámetros, variables locales y llamar dentro a otras funciones. Por ejemplo, llamar a la función 'Alert'.


Sintaxis

Se coloca la palabra reservada "function", luego el nombre de la función (este no debe empezar con números ni contener espacios en blanco), seguido de los parámetros dentro de paréntesis que son separados por comas si son dos o más. Finalmente, entre llaves se coloca el código de la función.

function nombre(parámetros) {
  // código a ejecutarse  
} 

Función sin retorno Función con retorno
function procedimiento(nombre) {
   alert("Hola " + nombre);
}
function producto(a, b) {
   return a * b;
}


Invocar una función

Dependiendo si la función tiene retorno o no, se invoca de diferentes maneras.

Función sin retorno Función con retorno
 
   procedimiento('gato');
 
 
   let a = producto(2,5);
 


Parámetros predeterminados

Permite que al invocar una función sus parámetros pueden ser obviados al declararse valores predefinidos. Por ejemplo:

function producto(a, b = 1) {
    return r = a * b;
}

console.log(producto(2, 4)); // Resultado: 8, a y b están definidos
console.log(producto(2));    // Resultado: 2, b por defecto tiene valor 1 

Parámetros rest

Permite que una función tenga un número indefinido de parámetros. Por ejemplo:

function sumaRest(...rest) {
    return rest.reduce((a, v) => a + v);
}

console.log(sumaRest(1, 2));       //3
console.log(sumaRest(1, 2, 3));    //6
console.log(sumaRest(1, 2, 3, 4)); //10

Se puede apreciar que la función puede recibir distintas cantidades de parámetros y ejecuta la operación de suma en todos los casos. Se puede mejorar o crear una diferente para que tenga el mismo comportamiento recibiendo además de valores sueltos a arreglos numéricos

function sumaArreglosRest(...ar) {
    return ar.flat().reduce((a, v) => a + v);
}

let numsA = [1, 2, 3, 4, 5];
let numsB = [6, 7, 8, 9, 10];
console.log("Suma numsA: " + sumaArreglosRest(numsA));  //15
console.log("Suma numsB: " + sumaArreglosRest(numsB));  //40
console.log("Suma numsA y numsB: " + sumaArreglosRest(numsA, numsB));  //55

Funciones arrow (flecha)

Son funciones de tipo anónimo que simplifican la construcción de las funciones mediante el uso de las sintaxis lambda y apoyarse en diversos métodos como Map, Reduce o Filter para trabajar con arreglos de manera más simple. Ejemplos

const saludoArrow = () => "Hola JavaScript";
console.log(saludoArrow());

const dobleArrow = a => 2 * a;
console.log("Doble de 2: " + dobleArrow(2));

const sumaArrow = (a, b) => a + b;
console.log("Suma 1 y 2: " + sumaArrow(1, 2));

const promedioArrow = (a = 0, ...r) => {
    if (r.length === 0) {
        return a;
    }
    let prom = a;
    let c = 1;
    prom += r.reduce((a, v) => a + v);
    c += r.length;
    prom /= c;
    return prom;
};
console.log("Promedio sin parámetros: " + promedioArrow());
console.log("Promedio de 10: " + promedioArrow(10));
console.log("Promedio de 10 y 20: " + promedioArrow(10, 20));
console.log("Promedio de 1, 2, 3, 4 y 5: " + promedioArrow(1, 2, 3, 4, 5));

Nota: se aprecia que cuando existen 2 parámetros a más o ninguno es necesario usar paréntesis. Por ejemplo, () o (a = 0, ...r), en caso sea un solo parámetro el uso es opcional. En caso del cuerpo de la función si es una sola línea el uso de llaves { } es opcional, en caso de ser más líneas de código se deben emplear como en el último ejemplo.


Estructuras repetitivas con JavaScript

Las estructuras repetitivas permiten ejecutar bloques de sentencias múltiples veces, aun si no conocemos el número de veces que debe repetirse el código. Se puede usar para ello una determinada condición, de manera que el bloque se detendrá cuando no se cumpla la condición.
Ejemplo práctico: al ingresar productos en una factura, el proceso se repite una y otra vez.


Estructura FOR

Se emplea cuando se conoce la cantidad de repeticiones o al recorrer un arreglo o vector.

for ( let i = [valor inicial]; i <= [valor máximo]; i++ ) {
   //Sentencias que se van a repetir: "(valor máximo - valor inicial)" veces
}


for ( const i of [variables iterables] ) {
   //Sentencias que se van a repetir tantas veces como elementos tenga
   //el arreglo, string, maps, nodeLists o similares
}

for ( const i in [variable tipo objeto] ) {
   //Sentencias que se van a repetir tantas veces como elementos tenga
   //el objeto, se puede usar en arreglos
}

Ejemplos

Supongamos que deseamos imprimir los primeros 10 número naturales mediante un procedimiento

function naturales() {
    let salida = ""; 
    for (let i = 1; i <= 10; i++) {
        salida += i + " ";
    }
    console.log(salida);
}

naturales(); // Salida: 1 2 3 4 5 6 7 8 9 10 	

Supongamos que tenemos un arreglo con nombre y deseamos agregar numeración delante de ellos e imprimirlos en pantalla.

let nombres = ["Dana", "Dina", "Dona"];

function enumerar(lista){
    let aux = 0;
    for (const val of lista) {
        console.log(`${++aux}.- ${val}`);
    }
}
enumerar(nombres);
/* Salida
1.- Dana
2.- Dina
3.- Dona
*/

Observación: el uso de las comillas invertidas y ${...} sirven para la interpolación en template literals, puedes ver más información haciendo clic aquí


Supongamos que tenemos un objeto y deseamos mostrar todos sus elementos

let perro = {nombre: "Argos", raza: "pastor alemán"};

function elementos(objeto){
    for (const item in objeto) {
        console.log(item + " = " + objeto[item]);
    }
}

elementos(perro);

/*Salida:
nombre = Argos
raza = pastor alemán
*/


Estructura WHILE y DO WHILE

Se emplea cuando el número de repeticiones no es conocido, pues depende de una condición. El punto a analizar es si se debe o no ejecutar la iteración por lo menos una vez.

while ( condición ) {
   //Sentencias que se van a repetir mientras condición sea verdadera
}

do {
   //Sentencias que se van a repetir mientras condición sea verdadera
}while ( condición ); 


Estructuras condicionales con JavaScript

Las estructuras condicionales permiten ejecutar bloques de sentencias de código para una determinada condición, si esta no se cumple se puede optar por no realizar nada o llevar a cabo otro bloque de sentencias, de manera que no pueden ejecutarse ambos bloques, solo uno de ellos.
Ejemplo práctico: al ingresar nuestra contraseña de una red social, si es incorrecta no podemos ingresar, pero si es correcta ingresamos a nuestra cuenta.


Condicional IF ELSE Condicional SWITCH CASE
if (condicion1) {
   //Sentencias si 
   //Condicion1 es verdad
}else if (condicion2) {
   //Sentencias si 
   //Condicion2 es verdad
}else {
   //Sentencias si condicion1 y
   //condicion2 no son verdad
}
switch (expresión) {
case x :
   //Sentencias si expresión es "x"
   break;
case y :
   //Sentencias si expresión es "y"
   break;
default:
   //Sentencias para otros casos
}


Operador ternario

Cuando tenemos una estructura condicional simple no anidada y sin "else if", lo más óptimo es utilizar un operador ternario, hay que tener en cuenta que no debe ser usado a diestra y siniestra, solo en casos donde exista un retorno de valor.


Condicional if-else Condicional con operador ternario
/*Codicional clásico*/
if (condicion) {
   //Sentencias si 
   //Condicion es verdad
}else {
   //Sentencias si condicion
   //no son verdad
}
/*Codicional clásico*/
[variable u otro] (condicion) ?
   //Sentencias si 
   //Condicion es verdad
:
   //Sentencias si condicion
   //no son verdad 
;  // cerrar la sentencia al final


Ejemplo en consola

Supongamos que tenemos una función que debe validar la edad de una persona. Si es mayor o no de 20 años

function validar(edad){
    let salida;
    if(edad > 20){
        salida = "Mayor de 20 años";
    }else{
        salida = "Menor de 20 años";
    }
    return salida;
}

console.log(validar(10));
console.log(validar(30));

La salida será:

Menor de 20 años
Mayor de 20 años

Podemos simplificar el código empleando el operador ternario, recordando que su uso es principalmente en asignaciones o similares y donde se ejecuta código para el caso verdadero y falso

function validar(edad) {
    return (edad > 20) ? "Mayor de 20 años" : "Menor de 20 años";
}

console.log(validar(10));
console.log(validar(30));

La salida será:

Menor de 20 años
Mayor de 20 años

NOTA: los operadores ternarios se pueden anidar.

Fundamentos de JavaScript

¿Qué es JavaScript?

Es un lenguaje de programación del tipo intérprete (vas traduciendo las sentencia una tras otra y no todas). Su principal fortaleza es en la programación web, pero se puede encontrar en distintos tipos de proyectos y aplicaciones.


Variables de JavaScript

Para declarar una variable en JS existen 4 formas que son anteponer "let", "const", "var" o no anteponer nada. No es necesario indicar el tipo de dato como en otros lenguajes de programación, nuestra variable se adapta al tipo de valor contenido


  • Si bien, se puede declarar una variable sin anteponer nada, no es una buena práctica
  • Se emplea const para constantes, valores que no van a alterarse
  • Se puede emplear var o let para valores que irán cambiando, la diferencia entre ambos, es que var es una versión antigua y puede producir un conflicto conocido como "hoisting" o elevación que permite asignar un valor a una variable y luego declararla o que sea accedida fuera de su entorno o "scope". Se recomiendo emplear let en nuevos proyectos.
/*
Aprendiendo a declarar variables
*/
const PI = 3.1416 //Constante numérica
var num; // Variable declarada con VAR, puede o no tener una asignación
let numero = 100; // variable numérica (es posible solo declararla y luego asignarle valor)
let texto = "hola :v"; // variable String
let logico = false; // variable lógica
let objeto = {nombre: "Argos", peso: 23}; // variable tipo objeto
let arreglo = ["Argos","Gardfield","Shyrley", "Pelusa"]; // variable tipo array

Además, podemos apreciar como se crean comentarios de línea con // y de bloque con /* y */

Ejecutar JavaScript en consola

En equivalencias con otros lenguajes de programación, en el caso de JavaScript, se emplea la combinación console.log(...) que puede contener múltiples elementos. Por ejemplo:

/*Función de suma de dos elementos*/
function suma(a, b) {
    let r = a + b;
    return `${a} + ${b} = ${r}`;
}

console.log(suma(5, 10));

En la consola del navegador donde se ejecute el HTML que contiene al código JS se apreciará:
5 + 10 = 15
Se puede emplear la sentencia console.log("Hola mundo"); para el clásico mensaje de saludo.


JavaScript con HTML

JavaScript puede ser insertado dentro de un documento HTML mediante la etiqueta <script> o en documentos .js separados que pueden ser llamados en la etiqueta <script>, especialmente útil cuando se llama a la biblioteca JQuery por ejemplo.



Insertado como archivo externo Insertado dentro del archivo HTML
<head>
   <script src="doc.js" 
      type="text/javascript">
   </script>
</head>
<script type="text/javascript">

   //Código JS

</script>

Existe otras formas de ejecutar código JavaScript en HTML, una de ellas es colocar el código como valor del atributo "onclick" como el siguiente ejemplo:


<!DOCTYPE html>
<html>
   <head>
 <title>Prueba</title>
   </head>
   <body>        
 <!-- Elementos HTML -->
 <label>Ingrese las notas</label><br/><br/>
 #1: <input type="number" min='0' max='20' id='n1'/><br/>
 #2: <input type="number" min='0' max='20' id='n2'/><br/>
 #3: <input type="number" min='0' max='20' id='n3'/><br/>
 #4: <input type="number" min='0' max='20' id='n4'/><br/>
 <br/>
 <!-- Código JavaScript dentro de un elemento HTML -->
 <button type='button' onclick="
  /* Código JavaScript dentro de onclick */
  let n1 = parseInt(getElementById('n1').value);
  let n2 = parseInt(getElementById('n2').value);
  let n3 = parseInt(getElementById('n3').value);
  let n4 = parseInt(getElementById('n4').value);  
  let prom = (n1+n2+n3+n4)/4;
  getElementById('prom').innerHTML=prom;
  /* Fin del codigo JS */
 ">Procesar</button>
 <br/>
 Promedio: <span id='prom'>&nbsp;</span> 
   </body>
</html>

Esto genera el siguiente resultado:




#1:
#2:
#3:
#4:


Promedio:  

Podemos ver el uso de algunas funciones como parseInt, getElementById, innerHTML y value.
A grandes rasgos se puede explicar su funcionamiento:


  • parseInt: Convierte un String válido a entero, para poder hacer operaciones aritméticas.
  • getElementById: captura un elemento HTML indicando su id
  • innerHTML: inserta contenido dentro del elemento HTML
  • value: captura el valor del atributo 'value' de un elemento HTML

jueves, 26 de marzo de 2020

Agrupación de selectores CSS

Mediante CSS se permite aplicar una serie de propiedades a varios elementos que pueden cumplir diferentes condiciones, la más usual es la de ser un elemento "hijo" de otro, tenemos:

  • Combinación simple de selectores
  • Selector descendente
  • Selector de etiqueta de clase
  • Selector de hijos
  • Selectores adyacentes
  • Pseudoclases

Aplicación y ejemplo


Combinación simple de selectores

En este caso se aplica las mismas propiedades a diversos elementos, pueden ser cualquier tipo de selector. Se separan con comas ',' y luego se definen las propiedades y sus valores.

<!DOCTYPE html>
<html>
   <head>
      <title>Prueba</title>
      <!-- Código CSS -->
      <style>
        p,a,span{
	   color: #139349;
	   font-family: 'Tahoma'
	}		 
      </style>
   </head>
   <body>        
      <!-- Elementos HTML -->
      <a>Soy una oración</a><br/><br/>
      <span>Palabra</span>
      <p>Soy un parrafo</p>
   </body>
</html>
Soy una oración

Palabra

Soy un parrafo



Combinación de selectores descendente

En este caso se aplica las propiedades al último elemento si cumple con la condición de estar anidado dentro del selector anterior. En el ejemplo, se tiene una etiqueta <div> que contiene una etiqueta <p> y dentro una <span>. Además, dos etiquetas <span>. El código CSS indica que solo se aplique la propiedad si hay un <span> dentro de un <div>.

Los elementos descendentes solo se separan mediante espacios.

<!DOCTYPE html>
<html>
   <head>
      <title>Prueba</title>
      <!-- Código CSS -->
      <style>
        div span{
	   color: #F00041;			
	}		 
      </style>
   </head>
   <body>        
      <!-- Elementos HTML -->
      <div> 
	<p>Soy una <span>palabra</span> especial</p>
      </div>      
      <span>Amigo</span><br/><br/>
      <span>Enemigo</span>
   </body>
</html>
Soy una palabra especial

Amigo

Enemigo


Combinación de etiqueta con clase

En este caso se aplica las mismas propiedades las etiquetas o elementos HTML que tienen como clase la especificada en el código CSS. En el ejemplo el color solo cambiará si la etiqueta es de tipo <p> y además el nombre de la clase es 'texto'

<!DOCTYPE html>
<html>
   <head>
      <title>Prueba</title>
      <!-- Código CSS -->
      <style>
        p.texto{
	   color:#F000F0;
	}		 
      </style>
   </head>
   <body>        
      <!-- Elementos HTML -->
      <span class='texto'>Span con clase</span>
      <p>Párrafo sin clase</p>
      <p class='texto'>Párrafo con clase</p>
   </body>
</html>
Span con clase

Párrafo sin clase

Párrafo con clase

Combinación de selectores hijos

En este caso se aplica las propiedades al último elemento si cumple con la jerarquía establecida, para el ejemplo, se aplicará solo si <span> está contenido en <p>, que a la vez debe estar contenido en <div>. Solo en ese caso cambia de color el contenido de <span>

<!DOCTYPE html>
<html>
   <head>
     <title>Prueba</title>
     <!-- Código CSS -->
     <style>
	div > p > span{
	   color:#0007D8;
	}		 
     </style>
   </head>
   <body>        
     <!-- Elementos HTML -->
     <div>
	<p>Div <span>que contiene</span> un párrafo y un span</p>
     </div>
     <p>Párrafo que <span>contiene</span> un span</p>
   </body>
</html>

Div que contiene un párrafo y un span

Párrafo que contiene un span

Combinación de selectores adyacentes

En este caso se aplica las mismas propiedades al segundo elemento luego del signo + siempre y cuando este se encuentre luego del elemento señalado previamente. Para el ejemplo, se aplica el efecto de color y negrita al elemento <span> solo si está después de un elemento <label>

<!DOCTYPE html>
<html>
   <head>
	<title>Prueba</title>
	<!-- Código CSS -->
	<style>
		label + span{
		   color: #FC943E;
		   font-weight: bold;
		}		 
	</style>
   </head>
   <body>        
	<!-- Elementos HTML -->
	<label>Nombres: </label>
	<span>Argos</span>
	<br/>
	<span>Nombres: </span>
	<label>Garfield</label>
   </body>
</html>
Nombres: Argos

Nombres: Garfield

Combinación de etiquetas con atributos especiales

En este caso se aplica las propiedades al elemento al cambiar su estado según lo especificado. En este ejemplo se emplea 'hover' que significa que cuando pasemos el cursor encima del elemento, este debe cambiar de color.

<!DOCTYPE html>
<html>
   <head>
	<title>Prueba</title>
	<!-- Código CSS -->
	<style>
	  span:hover{
		color: red;
	  }	 
	</style>
   </head>
   <body>        
	<!-- Elementos HTML -->
	<span>Argos</span>
   </body>
</html>
Argos (Si no pasa el cursor)

Argos (Si pasa el cursor)



Selectores en CSS

Los selectores básicos en CSS son:
  • De tipo
  • De clase
  • De ID
  • Universales
  • De atributo

Nota: Una clase se asigna en HTML mediante la propiedad "class"; un ID con "id", el atributo depende de las propiedades del elemento.

/*De tipo (un elemento HTML)*/
div {propiedad: valor;}

/*De clase (asignado a un elemento HTML con el atributo class)*/
.fondo {propiedad: valor;}

/*De ID (asignado a un elemento HTML con el atributo id)*/
#cuadro {propiedad: valor;}

/*Universales (se aplican a todas las etiquetas, * significa todos)*/
* {propiedad: valor;}

/*De atributo (se aplica si se cumple con determinado valor en un atributo)*/
input [type=submit] {propiedad: valor;}


Ejemplos

Selector de tipo
<!DOCTYPE html>
<html>
   <head>
      <title>Prueba</title>
      <!-- Código CSS -->
      <style>
         p{
            color: red;
            background-color: pink;
         }
      </style>
   </head>
   <body>        
      <!-- Elemento HTML -->
      <p>Buenas tardes mundo</p>
      <p class='unaClase'>Buenas noches mundo</p>
      <p id='unId'>Adiós mundo</p>
   </body>
</html>
Resultado: Todas las etiquetas <p> se ven afectado por el código CSS

Buenas tardes mundo
Buenas noches mundo
Adiós mundo
Selector de clase
<!DOCTYPE html>
<html>
   <head>
      <title>Prueba</title>
      <!-- Código CSS -->
      <style>
         p.texto{
            color: red;
            background-color: pink;
         }
      </style>
   </head>
   <body>        
      <!-- Elemento HTML -->
      <p>Buenas tardes mundo</p>
      <p class='texto'>Buenas noches mundo</p>
      <span class='texto'>Adiós mundo</span>
   </body>
</html>
Resultado: Solo las etiquetas <p> que tienen como clase 'texte' se ven afectado por el código CSS, si hubiéramos puesto ".text" en lugar de "p.texto" se modificaría el estilo de la etiqueta <span>

Buenas tardes mundo
Buenas noches mundo
Adiós mundo
Selector de id
<!DOCTYPE html>
<html>
   <head>
      <title>Prueba</title>
      <!-- Código CSS -->
      <style>
         #elegido{
            color: red;
            background-color: pink;
         }
      </style>
   </head>
   <body>        
      <!-- Elemento HTML -->
      <p>Buenas tardes mundo</p>
      <p class='elegido'>Buenas noches mundo</p>
      <p id='elegido'>Adiós mundo</p>
   </body>
</html>
Resultado: Solo las etiquetas <p> que tienen como id 'elegido' se ven afectado por el código CSS

Buenas tardes mundo
Buenas noches mundo
Adiós mundo
Selector universal
<!DOCTYPE html>
<html>
   <head>
      <title>Prueba</title>
      <!-- Código CSS -->
      <style>
         *{
            color: red;
            background-color: pink;
         }
      </style>
   </head>
   <body>        
      <!-- Elemento HTML -->
      <p>Buenas tardes mundo</p>
      <div>Buenas noches mundo</div>
      <h1>Adiós mundo</h1>
   </body>
</html>
Resultado: Todas las etiquetas se ven afectado por el código CSS

Buenas tardes mundo
Buenas noches mundo
Adiós mundo
Selector de atributo
<!DOCTYPE html>
<html>
   <head>
      <title>Prueba</title>
      <!-- Código CSS -->
      <style>
         a[href='#']{
            color: red;
            background-color: pink;
         }
      </style>
   </head>
   <body>        
      <!-- Elemento HTML -->
      <a>Buenas tardes mundo</a><br/>
      <a href='#'>Buenas noches mundo</a><br/>
      <a href='www.google.com'>Adiós mundo</a>
   </body>
</html>
Resultado: Solo las etiquetas <a> cuyo atributo 'href' tiene valor '#' se ven afectado por el código CSS

Buenas tardes mundo
Buenas noches mundo
Adiós mundo




Código CSS - Sintaxis

¿Qué es el código CSS?

El código CSS es un lenguaje de diseño gráfico que permite definir las propiedades, comportamientos y demás atribuciones de diseño de los elementos de un documento escrito en lenguaje de marcado, especialmente HTML, estas propiedades pueden ser almacenadas en archivos .css y de esta forma reutilizar en diferentes documentos HTML. Actualmente se encuentra en la versión 3, llamada CSS3.


Formas de acoplamiento del CSS con HTML

Existen tres formas (niveles), y cada una de ellas tiene más preponderancia que la anterior:


Primera: En un archivo externo llamado hoja de estilo. Este se debe incluir en el documento HTML con la etiqueta <link> en la sección <head> del HTML. Ejemplo:

<link rel="stylesheet" href="file.css"/>
 

Donde "file.css" es el archivo externo u hoja de estilos.


Segunda: A nivel de página. Se da cuando se incluye código CSS en el documento HTML con la etiqueta <style> en la sección <head> del HTML. Ejemplo:

<style>/*Código CSS*/</style>
 

Este código servirá exclusivamente para el archivo HTML donde se escribe, si tuviera una archivo externo que asigna determinada propiedad y esta propiedad se repite dentro de la etiqueta "<style>", el valor asignado en "<style>" será el que se mantenga.


Tercera: A nivel de marca. Se produce cuando el código CSS se declara dentro de un elemento HTML con la propiedad "style". Ejemplo:

<div style="color: green;">Hola</div>
 



Sintaxis

Se coloca primero el nombre del elemento HTML (etiqueta), nombre de la clase (class) o identificador (id), luego entre llaves irán las propiedades, dos puntos y sus valores de la siguiente manera:


Como se escribe Ejemplo práctico
[nombre del elemento] {
    propiedad1: valor1;
    propiedad2: valor2;
    /* Comentario de linea*/
    propiedad3: valor3;
    /* 
    *Comentario de bloque
    propiedad4: valor4;
    propiedad5: valor5;
    */
}
div{
    width: 100px;
    height: 100px;
    background-color: #FEE;
    margin: 10px;
    border: 1px solid red;
    color: brown;
    font-family: "calibri";
    font-size: 20px;
    text-align: center;
}





lunes, 23 de marzo de 2020

Diseño responsivo con CSS

La estructura básica de una página web con HTML5 es:

<!DOCTYPE html>
<html>
   <head>
      <title>Título de la página</title>
      <!-- METATAGS, archivos externos, etc. -->
   </head>
   <body>
      Contenido de la página
   </body>
</html>

Para implementar un diseño responsivo debemos agregar un archivo CSS, que llamaremos estructura.css, se ubicará dentro de una carpeta css y su código es:

* {box-sizing: border-box;}
body {
 margin: 0;
 padding: 0;
 width: 100%;
}
.fila {margin: 0 auto;}
.fila::after {
 content: "";
 clear: both;
 display: table;
}
[class*="col-"] {
 width: 100%;
 float: left;
}
html {font-size: 16px;}
.fila {width: 80%;}
[class*="col-"] {padding: 1rem;}
.col-1 {width: 8.33%;}
.col-2 {width: 16.66%;}
.col-3 {width: 25%;}
.col-4 {width: 33.33%;}
.col-5 {width: 41.66%;}
.col-6 {width: 50%;}
.col-7 {width: 58.33%;}
.col-8 {width: 66.66%;}
.col-9 {width: 75%;}
.col-10 {width: 83.33%;}
.col-11 {width: 91.66%;}
.col-12 {width: 100%;}

El archivo para probar si nuestra página funciona sería el archivo index.html:

<!DOCTYPE html>
<html>
   <head>
      <title>Inlearning Code - Responsive</title>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <!-- Archivo CSS -->
      <link href="css/estructura.css" rel="stylesheet" type="text/css" />
   </head>
   <body>
      <header class="fila">
         <div class="col-10" style="background-color: #b4e3cc;">COL 10</div>
         <div class="col-2" style="background-color: #ff5733;">COL 2</div>
      </header>
      <div class="fila">
         <div class="col-4" style="background-color: #decd3e;">COL 4</div>
         <div class="col-4" style="background-color: #a4e57c;">COL 4</div>
         <div class="col-4" style="background-color: #dfc80c;">COL 4</div>
      </div>
      <footer class="fila">
         <div class="col-12" style="background-color: #ffa200;">COL 12</div>
      </footer>
   </body>
</html>

El resultado sería:

Diseño responsivo usando reglas AT

La estructura básica de una página web con HTML5 es:

<!DOCTYPE html>
<html>
   <head>
      <title>Título de la página</title>
      <!-- METATAGS, archivos externos, etc. -->
   </head>
   <body>
      Contenido de la página
   </body>
</html>

Para implementar un diseño responsivo mediante reglas AT debemos agregar un archivo CSS, que llamaremos estructura.css, se ubicará dentro de una carpeta css y su código es:

* {box-sizing: border-box;}

body {
 margin: 0;
 padding: 0;
 width: 100%;
}

.fila {margin: 0 auto;}

.fila::after {
 content: "";
 clear: both;
 display: table;
}

[class*="col-"], [class*="col-m-"], [class*="col-s-"] {
 width: 100%;
 float: left;
}

@media only screen and (min-width: 1px) {
 html {font-size: 12px;}
 [class*="col-s-"] {padding: 0rem;}
 .col-s-1 {width: 8.33%;}
 .col-s-2 {width: 16.66%;}
 .col-s-3 {width: 25%;}
 .col-s-4 {width: 33.33%;}
 .col-s-5 {width: 41.66%;}
 .col-s-6 {width: 50%;}
 .col-s-7 {width: 58.33%;}
 .col-s-8 {width: 66.66%;}
 .col-s-9 {width: 75%;}
 .col-s-10 {width: 83.33%;}
 .col-s-11 {width: 91.66%;}
 .col-s-12 {width: 100%;}
}

@media only screen and (min-width: 512px) {
 html {font-size: 14px;}
 .fila {width: 90%; }
 [class*="col-m-"] {padding: 0.5rem;}
 .col-m-1 {width: 8.33%;}
 .col-m-2 {width: 16.66%;}
 .col-m-3 {width: 25%;}
 .col-m-4 {width: 33.33%;}
 .col-m-5 {width: 41.66%;}
 .col-m-6 {width: 50%;}
 .col-m-7 {width: 58.33%;}
 .col-m-8 {width: 66.66%;}
 .col-m-9 {width: 75%;}
 .col-m-10 {width: 83.33%;}
 .col-m-11 {width: 91.66%;}
 .col-m-12 {width: 100%;}
}

@media only screen and (min-width: 700px) {
 html {font-size: 16px;}
 .fila {width: 80%;}
 [class*="col-"] {padding: 1rem;}
 .col-1 {width: 8.33%;}
 .col-2 {width: 16.66%;}
 .col-3 {width: 25%;}
 .col-4 {width: 33.33%;}
 .col-5 {width: 41.66%;}
 .col-6 {width: 50%;}
 .col-7 {width: 58.33%;}
 .col-8 {width: 66.66%;}
 .col-9 {width: 75%;}
 .col-10 {width: 83.33%;}
 .col-11 {width: 91.66%;}
 .col-12 {width: 100%;}
}

Lo que nos interesa es la sintaxis:
  
@media only screen and (min-width: /*tamaño de la pantalla*/)
  

El archivo para probar si nuestra página funciona sería el archivo index.html:

<!DOCTYPE html>
<html>
   <head>
      <title>Inlearning Code - Responsive</title>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <!-- Archivo CSS -->
      <link href="css/estructura.css" rel="stylesheet" type="text/css" />
   </head>
   <body>
      <header class="fila">
         <div class="col-10 col-m-8 col-s-6" style="background-color: #b4e3cc;">COL 10</div>
         <div class="col-2 col-m-4 col-s-6" style="background-color: #ff5733;">COL 2</div>
      </header>
      <div class="fila">
         <div class="col-4 col-m-3 col-s-12" style="background-color: #decd3e;">COL 4</div>
         <div class="col-4 col-m-6 col-s-12" style="background-color: #a4e57c;">COL 4</div>
         <div class="col-4 col-m-3 col-s-12" style="background-color: #dfc80c;">COL 4</div>
      </div>
      <footer class="fila">
         <div class="col-12 col-m-12 col-s-12" style="background-color: #ffa200;">COL 12</div>
      </footer>
   </body>
</html>

El resultado sería cuando la pantalla tiene de 700px a más :


El resultado sería cuando la pantalla va desde los 512px hasta menos de 700px:


El resultado sería cuando la pantalla es menor de 512px: