<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Sebastian Mendez - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Sebastian Mendez - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Fri, 22 May 2026 15:16:29 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/guirdo/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Los 3 tipos de patrones de diseño que todo desarrollador debería saber (con códigos de ejemplo de cada uno) ]]>
                </title>
                <description>
                    <![CDATA[ ¿Qué es un Patrón de Diseño? Los patrones de diseño son soluciones a nivel de diseño para problemas recurrentes que nosotros como ingenieros de software enfrentamos frecuentemente. No es código - Repito ❌CÓDIGO. Es como una descripción sobre como atacar estos problemas y diseñar una solución. Usar estos patrones es ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/los-3-tipos-de-patrones-de-diseno-que-todo-desarrollador-deberia-saber-con-codigos-de-ejemplo-de-cada-uno/</link>
                <guid isPermaLink="false">64a3664013b6b807a602ecd3</guid>
                
                    <category>
                        <![CDATA[ Patrones de Diseño ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sebastian Mendez ]]>
                </dc:creator>
                <pubDate>Wed, 13 Sep 2023 19:05:28 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/07/design-patterns-everywhere.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/the-basic-design-patterns-all-developers-need-to-know/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The 3 Types of Design Patterns All Developers Should Know (with code examples of each)</a>
      </p><h1 id="-qu-es-un-patr-n-de-dise-o"><strong>¿Qué es un Patrón de Diseño?</strong></h1><p>Los patrones de diseño son soluciones a nivel de diseño para problemas recurrentes que nosotros como ingenieros de software enfrentamos frecuentemente. No es código - Repito ❌<strong>CÓDIGO</strong>. Es como una descripción sobre como atacar estos problemas y diseñar una solución.</p><p>Usar estos patrones es considerado una buena práctica, ya que el diseño de la solución ha sido probado y comprobado, resulta en una legibilidad más alta en el código final. Los patrones de diseño son frecuentemente creados y usados en lenguajes de Programación Orientada a Objetos, como Java, en el cuál la mayoría de los ejemplos estarán escritos desde ahora en adelante.</p><h2 id="tipos-de-patrones-de-dise-o"><strong>Tipos de patrones de diseño</strong></h2><p>Hay cerca de 26 patrones actualmente descubiertos (difícilmente creo que los cubriré todos...).</p><p>Estos 26 puede ser clasificados en 3 tipos:</p><ol><li>Creacionales: Estos patrones son diseñados para la instanciación de clases. Pueden ser patrones de creación tanto de clases como de objetos.</li><li>Estructurales: Estos patrones son diseñados con respecto a la estructura y composición de una clase. La principal meta de la mayoría de estos patrones es la de incrementar la funcionalidad de la(s) clase(s) involucrada(s), sin cambiar mucho de su composición.</li><li>De comportamiento: Estos patrones son diseñados dependiendo de cómo una clase se comunica con otras.</li></ol><p>En este artículo, veremos cada tipo de patrón de diseño en esta clasificación, empezando desde el más básico.</p><h2 id="tipo-1-creacional-el-patr-n-de-dise-o-singleton"><strong>Tipo 1: Creacional - El patrón de diseño Singleton</strong></h2><p>El patrón de diseño Singleton es un patrón creacional, del cual su objetivo es crear una sola instancia de una clase y proveer un solo punto de acceso global para ese objeto. Un ejemplo comúnmente usado es la clase Calendar en Java, donde no puedes hacer una instancia de esa clase. También utiliza su propio método <code>getInstance()</code> para obtener el objeto a ser usado.</p><p>Una clase que use el patrón de diseño singleton incluirá:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/07/singleton-class-diagram.png" class="kg-image" alt="singleton-class-diagram" width="600" height="400" loading="lazy"><figcaption>Diagrama de clase Singleton</figcaption></figure><ol><li>Una variable estática, que contiene la única instancia de la clase</li><li>Un constructor privado, para que así no se pueda instanciar en ningún otro lado.</li><li>Un método publico estático, para retornar la única instancia de la clase.</li></ol><p>Hay muchas maneras diferentes de implementar el diseño singleton. Hoy cubriré cada una de las implementaciones de:</p><p>1. Instanciación ansiosa</p><p>2. Instanciación perezosa</p><p>3. Instanciación segura para subprocesos</p><h3 id="castor-ansioso"><strong>Castor ansioso</strong></h3><pre><code class="language-java">public class EagerSingleton {
	// crear una instancia de la clase.
	private static EagerSingleton instance = new EagerSingleton();

	//constructor privado para evitar que sea instanciado fuera de la clase.
	private EagerSingleton() {  }

	// devuelve la única instancia de la clase.
	public static EagerSingleton getInstance() {
		return instance;
	}
}</code></pre><p>Este tipo de instanciación sucede durante la carga de la clase, ya que la creación de la instancia de la variable se produce fuera de cualquier método. Esto supone un gran inconveniente si la aplicación cliente no utiliza esta clase en absoluto. El plan de contingencia, si esta clase no es usada, es la instanciación perezosa.</p><h3 id="d-as-de-pereza">Días de pereza</h3><p>No hay tanta diferencia con la implementación de arriba. Las principales diferencias son que la variable estática es inicialmente declarada como nula, y es solo instanciada dentro del método <code>getInstance()</code> si, y solo si, la variable de la instancia permanece nula en el momento que se revisa.</p><pre><code class="language-java">public class LazySingleton {
	// inicializa la instancia con valor nulo.
	private static LazySingleton instance = null;

	// constructor privado para evitar que sea instanciada fuera de esta clase.
	private LazySingleton() {  }
	
    // revisa si la instancia es nula, si lo es crea el objeto.	
	public static LazySingleton getInstance() {
		if (instance == null) {
			instance = new LazySingleton();
		}
		return instance;
	}
}</code></pre><p>Esto soluciona un problema, pero otro sigue existiendo. ¿Qué tal si dos clientes diferentes acceden a la clase Singleton al mismo tiempo, en el mismo milisegundo? Bueno, ellos revisarían si la instancia es nula al mismo tiempo, y la encontrarían como verdadera, y entonces crearían dos instancias de la clase para cada petición de los dos clientes. Para solucionar esto, la instanciación segura de hilo debe ser implementada.</p><h3 id="la-seguridad-para-subprocesos-es-clave"><strong>La seguridad (para subprocesos) es clave</strong></h3><p>En java, la palabra clave "synchronized" es usada en métodos u objetos para implementar seguridad de subprocesos, con la finalidad de que solo un hilo a la vez acceda a un recurso en particular. La instanciación de la clase es puesta dentro de un bloque sincronizado, para que el método solo pueda ser accesible por solo un cliente en un momento dado.</p><pre><code class="language-java">public class ThreadSafeSingleton {
	// inicializa la instancia con valor nulo.
	private static ThreadSafeSingleton instance = null;

	// constructor privado para evitar que sea instanciada fuera de esta clase.
	private ThreadSafeSingleton() {  }
    
	// revisa si la instancia es nula, dentro de un bloque síncrono, si lo es crea el objeto.	
	public static ThreadSafeSingleton getInstance() {
		synchronized (ThreadSafeSingleton.class) {
			if (instance == null) {
				instance = new ThreadSafeSingleton();
			}
		}
		return instance;
	}
}</code></pre><p>La sobrecarga de procesamiento que resulta del método sincronizado es elevada y reduce el rendimiento de toda la operación.</p><p>Por ejemplo, si la variable de la instancia ya ha sido inicializada, entonces cada vez que cualquier cliente acceda al método <code>getInstance()</code>, el método <code>synchronized</code> es ejecutado y el rendimiento disminuye. Esto solo sucede para revisar si el valor de la variable <code>instance</code> es nula. Si se encuentra que, si es nula, se sale del método.</p><p>Para reducir la sobrecarga, se usa el doble cierre. La revisión se realiza antes del método <code>synchronized</code> &nbsp;y si el valor es solo nulo, hace que el método <code>synchronized</code> se ejecute.</p><pre><code class="language-java">// se usa el doble cierre para reducir la sobrecarga del método síncrono ("synchronized")
public static ThreadSafeSingleton getInstanceDoubleLocking() {
	if (instance == null) {
		synchronized (ThreadSafeSingleton.class) {
			if (instance == null) {
				instance = new ThreadSafeSingleton();
			}
		}
	}
	return instance;
}</code></pre><p>Ahora a la siguiente clasificación.</p><h2 id="tipo-2-estructurales-el-patr-n-de-dise-o-decorador"><strong>Tipo 2: Estructurales - El patrón de diseño Decorador</strong></h2><p>Te voy a dar un pequeño escenario para dar un mejor contexto del por qué y dónde deberías usar el patrón Decorador.</p><p>Imagina que tienes una cafetería, y como cualquier novato, empiezas con solo dos tipos de café simples, la mezcla de la casa y el negro tostado. En tu sistema de cobro, había una clase para las diferentes mezclas de café, las cuales heredan de la clase abstracta de bebidas. De hecho, la gente empieza a venir y a tomar tu maravilloso (aunque amargo) café. Entonces hay novatos del café que, dios no lo quiera, quieren azúcar o leche. ¿¿¡¡Qué burla de café!! ??</p><p>Ahora necesitas tener esos dos complementos también, ambos para el menú y desafortunadamente en el sistema de cobro. Originalmente, tu personal de TI hará una subclase para ambos cafés, una incluye azúcar, la otra leche. Entonces, ya que los clientes siempre están en lo correcto, uno de ellos dice estas temidas palabras:</p><p><em>"¿Me puede dar un café con leche y azúcar, por favor?"</em></p><h3 id=""><strong>???</strong></h3><p>Ahí va tu sistema de cobro riéndose en tu cara otra vez. Bueno, regresemos al pizarrón...</p><p>El personal de TI entonces añade café con leche y azúcar como otra subclase para cada clase padre de café. El resto del mes todo marcha sobre ruedas, la gente hace fila para beber tu café, ¿¿En realidad estás ganando dinero??</p><p>¡Pero espera, hay más!</p><p>El mundo en tu contra otra vez. Un competidor abre del otro lado de la calle, no con solo 4 tipos de café, ¡sino más de 10 complementos también!</p><p>Compras todos esos y más, para vender mejor café, y solo entonces recuerdas que olvidaste actualizar ese maldito sistema de cobro. Es muy posible que no puedas hacer el numero infinito de subclases para cada una de todas las combinaciones de todos los aditivos, con las nuevas mezclas de café también. Sin mencionar, el tamaño del sistema final.</p><p>Es tiempo de invertir en un sistema de cobro apropiado. Encuentras un nuevo personal de TI, quienes sí saben lo que están haciendo y te dicen:</p><p><em><em><em><em><em><em>“</em></em></em></em></em>Esto sería mucho más fácil y pequeño si se usa el patrón decorador.<em><em><em><em><em>”</em></em></em></em></em></em></p><h3 id="-qu-demonios-es-eso"><strong>¿Qué demonios es eso?</strong></h3><p>El patrón de diseño decorador cae en la categoría estructural, que lidia con la estructura real de una clase, ya sea por herencia, composición o ambos. La meta de este diseño es modificar la funcionalidad de un objeto en tiempo de ejecución. Esto es uno de otros muchos patrones de diseño que utiliza clases abstractas e interfaces con composición para obtener el resultado deseado.</p><p>Démosles la oportunidad a las matemáticas (¿temor?) para poner esto en perspectiva.</p><p>Digamos que hay 4 mezclas de café y 10 complementos. Si nos atoramos con la generación de subclases para cada diferente combinación de todos los complementos para un tipo de café. Eso es:</p><p>(10–1) ² = 9² = 81 subclases</p><p>Restamos 1 al 10, ya que no puedes combinar un complemento con otro del mismo tipo, azúcar con azúcar suena estúpido. Y eso es para una sola mezcla de café. ¡Multiplica ese <strong>81 por 4</strong> y obtendrás la enorme cantidad de <strong>324</strong> subclases diferentes! Piensa en todo el código que se tendría que escribir...</p><p>Pero con el patrón decorador se requerirán solo 16 clases en este escenario. ¿Quieres apostar?</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/07/decorator-class-diagram.png" class="kg-image" alt="decorator-class-diagram" width="600" height="400" loading="lazy"><figcaption>Diagrama de clase del patrón de diseño Decorador</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/07/decorator-coffee-class-diagram.png" class="kg-image" alt="decorator-coffee-class-diagram" width="600" height="400" loading="lazy"><figcaption>Diagrama de clase correspondiente al escenario de la cafetería</figcaption></figure><p>Si trazamos nuestro escenario según el diagrama de clase anterior, obtenemos 4 clases para las 4 mezclas de café, 10 para cada aditivo y 1 para el componente abstracto y una más para el decorador abstracto. ¡Ves! ¡16! ¡Ahora dame esos $100! (Solo bromeo, pero no te los rechazaría si me los dieras... solo digo)</p><p>Como puedes ver arriba, al igual que las mezclas concretas de café son subclases de la clase abstracta de bebida, la clase abstracta AddOn también hereda sus métodos de ella. Los complementos, que son sus subclases, a la vez heredan cualquier nuevo método para añadir funcionalidad al objeto base cuando sea necesario.</p><p>Vamos al código para ver este patrón en uso.</p><p>Primero haremos la clase abstracta de bebida, esa que todas las diferentes mezclas de café heredarán:</p><pre><code class="language-java">public abstract class Beverage {
	private String description;
    
	public Beverage(String description) {
		super();
		this.description = description;
	}
    
	public String getDescription() {
		return description;
	}
    
	public abstract double cost();
}</code></pre><p>Entonces añadimos ambas mezclas de café concretas.</p><pre><code class="language-java">public class HouseBlend extends Beverage {
	public HouseBlend() {
		super(“House blend”);
	}

	@Override
	public double cost() {
		return 250;
	}
}

public class DarkRoast extends Beverage {
	public DarkRoast() {
		super(“Dark roast”);
	}

	@Override
	public double cost() {
		return 300;
	}
}</code></pre><p>La clase abstracta de AddOn también hereda de la clase abstracta Beverage (más sobre esto abajo).</p><pre><code class="language-java">public abstract class AddOn extends Beverage {
	protected Beverage beverage;

	public AddOn(String description, Beverage bev) {
		super(description);
		this.beverage = bev;
	}

	public abstract String getDescription();
}</code></pre><p>Y ahora la implementación concreta de esta clase abstracta:</p><pre><code class="language-java">public class Sugar extends AddOn {
	public Sugar(Beverage bev) {
		super(“Sugar”, bev);
	}

	@Override
	public String getDescription() {
		return beverage.getDescription() + “ with Mocha”;
	}

	@Override
	public double cost() {
		return beverage.cost() + 50;
	}
}

public class Milk extends AddOn {
	public Milk(Beverage bev) {
		super(“Milk”, bev);
	}

	@Override
	public String getDescription() {
		return beverage.getDescription() + “ with Milk”;
	}

	@Override  public double cost() {
		return beverage.cost() + 100;
	}
}</code></pre><p>Como puedes ver arriba, podemos pasar cualquier subclase de Beverage a cualquier subclase de AddOn, y obtener el costo añadido, así como la descripción actualizada. Y, ya que la clase AddOn es esencialmente de tipo Beverage, podemos pasar un AddOn dentro de otro AddOn. De esta forma, podemos añadir cualquier número de complementos a una mezcla de café en específico.</p><p>Ahora escribimos algo de código para probar esto.</p><pre><code class="language-java">public class CoffeeShop {
	public static void main(String[] args) {
		HouseBlend houseblend = new HouseBlend();
		System.out.println(houseblend.getDescription() + “: “ + houseblend.cost());

		Milk milkAddOn = new Milk(houseblend);
		System.out.println(milkAddOn.getDescription() + “: “ + milkAddOn.cost());

		Sugar sugarAddOn = new Sugar(milkAddOn);
		System.out.println(sugarAddOn.getDescription() + “: “ + sugarAddOn.cost());
	}
}</code></pre><p>El resultado final es:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/07/decorator-final.PNG" class="kg-image" alt="decorator-final" width="600" height="400" loading="lazy"><figcaption>P.D. esto está en rupias de Sri Lanka</figcaption></figure><p>¡Funciona! Somos capaces de añadir más de un complemento a una mezcla de café y actualizar su costo final y descripción exitosamente, sin la necesidad de hacer una cantidad infinita de subclases para cada combinación de complementos para todas las mezclas de café.</p><p>Finalmente, a la última categoría.</p><h2 id="tipo-3-de-comportamiento-el-patr-n-de-dise-o-de-comandos"><strong>Tipo 3: De comportamiento - El patrón de diseño de Comandos</strong></h2><p>Un patrón de diseño de comportamiento se enfoca en como las clases y objetos se comunican entre ellas. El principal enfoque del patrón de comando es inculcar un menor grado de acoplamiento (también conocido como acoplamiento débil) entre las partes involucradas (léase: clases).</p><p><em><em><em><em><em><em>Uhhhh… </em></em></em></em></em>¿Qué es eso?</em></p><p>El acoplamiento es la forma en la que dos (o más) clases interactúan entre ellas. El escenario ideal cuando estas clases interactúan es que no dependan fuertemente una de otra. Eso es acoplamiento débil. Así que, una mejor definición para el acoplamiento débil sería: clases que están interconectadas, haciendo el menor uso entre ellas.</p><p>La necesidad de este patrón surgió cuando las peticiones necesitaban ser enviadas sin saber conscientemente que es lo que se pide o quien es el receptor.</p><p>En este patrón, la invocación de la clase esta desacoplada de la clase que realmente ejecuta una acción. La clase invocadora solo tiene el método invocable execute, el cuál corre el comando necesario, cuando el cliente lo solicita.</p><p>Veamos un ejemplo básico de la vida real ordenando un platillo en un restaurant elegante. Como el flujo va, tú le das tu orden (comando) al mesero (invocador), quien entonces entrega al chef (receptor), y es así como obtienes tu comida. Puede sonar sencillo... pero es algo aburrido de codificar.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2019/07/chain-of-command-be-like-pop-snoke-im-going-to-27790631.png" class="kg-image" alt="chain-of-command-be-like-pop-snoke-im-going-to-27790631" width="600" height="400" loading="lazy"></figure><p>La idea es bastante sencilla, pero la programación da mil vueltas.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/07/command-class-diagram.PNG" class="kg-image" alt="command-class-diagram" width="600" height="400" loading="lazy"><figcaption>Diagrama de clase del patrón de diseño Comando</figcaption></figure><p>El flujo de operación del lado técnico es: haces un comando concreto, el cual implementa la interfaz Command, pidiendo al receptor que complete una acción, y envía el comando al invocador. El invocador es la persona que sabe cuándo dar el comando. El chef es el único que sabe qué hacer cuando se le da una orden o un comando especifico. Entonces, cuando el método "execute" del invocador es ejecutado, este a su vez, hace que se ejecute el método "execute" del objeto del comando en el receptor, completando así las acciones necesarias.</p><p><strong>Lo que necesitamos para implementarlo es:</strong></p><ol><li>Una interfaz Command</li><li>Una clase Order que implemente la interfaz Command</li><li>Una clase Waiter (invocador)</li><li>Una clase Chef (receptor)</li></ol><p>Entonces, el código es el siguiente:</p><h3 id="chef-el-receptor"><strong>Chef, el receptor</strong></h3><pre><code class="language-java">public class Chef {
	public void cookPasta() {
		System.out.println(“Chef is cooking Chicken Alfredo…”);
	}

	public void bakeCake() {
		System.out.println(“Chef is baking Chocolate Fudge Cake…”);
	}
}</code></pre><h3 id="command-la-interfaz"><strong>Command, la interfaz</strong></h3><pre><code class="language-java">public interface Command {
	public abstract void execute();
}</code></pre><h3 id="order-el-comando-concreto"><strong>Order, el comando concreto</strong></h3><pre><code class="language-java">public class Order implements Command {
	private Chef chef;
	private String food;

	public Order(Chef chef, String food) {
		this.chef = chef;
		this.food = food;
	}

	@Override
	public void execute() {
		if (this.food.equals(“Pasta”)) {
			this.chef.cookPasta();
		} else {
			this.chef.bakeCake();
		}
	}
}</code></pre><h3 id="waiter-el-invocador"><strong>Waiter, el invocador</strong></h3><pre><code class="language-java">public class Waiter {
	private Order order;

	public Waiter(Order ord) {
		this.order = ord;
	}

	public void execute() {
		this.order.execute();
	}
}</code></pre><h2 id="t-el-cliente"><strong>Tú, el cliente</strong></h2><pre><code class="language-java">public class Client {
	public static void main(String[] args) {
		Chef chef = new Chef();
        
		Order order = new Order(chef, “Pasta”);
		Waiter waiter = new Waiter(order);
		waiter.execute();

		order = new Order(chef, “Cake”);
		waiter = new Waiter(order);
		waiter.execute();
	}
}</code></pre><p>Como puedes ver arriba, la clase Client hace una Orden y establece al Chef como receptor. La Orden es enviada al Mesero, quien sabrá cuando ejecutar la Orden (por ejemplo, cuando dar la orden a cocinar al chef). Cuando el invocador es ejecutado, el método "execute" de la clase Order es ejecutado en el receptor (por ejemplo, al chef se le da una orden para cocinar pasta u hornear un pastel).</p><h2 id="repaso-r-pido"><strong>Repaso rápido</strong></h2><p>En este artículo hablamos de:</p><ol><li>Qué es realmente un patrón de diseño</li><li>Los diferentes tipos de patrones de diseño y por qué son diferentes</li><li>Un patrón de diseño básico o común de cada tipo</li></ol><p>Espero que te haya sido de ayuda.</p><p>Encuentra el repositorio del código de este artículo <a href="https://github.com/samsam-026/Design_Patterns">aquí</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Hojas de estilos de CSS externas: Cómo enlazar CSS a HTML e importar en Head ]]>
                </title>
                <description>
                    <![CDATA[ Es considerado una buena práctica tener tus hojas de estilos de CSS en un archivo externo. Entonces, ¿cómo puedes enlazar ese CSS a tu archivo HTML? Enlazar a un archivo externo de CSS es una parte importante de cualquier  plantilla de HTML [/espanol/news/plantilla-basica-html5-ejemplo-de-codigo/]. Y en este artículo, aprenderemos a ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/hojas-de-estilos-de-css-externas-como-enlazar-css-a-html-e-importar-en-head/</link>
                <guid isPermaLink="false">6490a9c09764040891b7e9a0</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sebastian Mendez ]]>
                </dc:creator>
                <pubDate>Fri, 14 Jul 2023 19:39:29 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/06/pexels-martin-damboldt-814499.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/external-css-stylesheets-how-to-link-css-to-html-and-import-into-head/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">External CSS Stylesheets – How to Link CSS to HTML and Import into Head</a>
      </p><p>Es considerado una buena práctica tener tus hojas de estilos de CSS en un archivo externo. Entonces, ¿cómo puedes enlazar ese CSS a tu archivo HTML?</p><p>Enlazar a un archivo externo de CSS es una parte importante de cualquier <a href="https://www.freecodecamp.org/espanol/news/plantilla-basica-html5-ejemplo-de-codigo/">plantilla de HTML</a>. Y en este artículo, aprenderemos a cómo hacerlo.</p><h2 id="c-mo-enlazar-un-archivo-css-a-un-archivo-html"><strong>Cómo enlazar un archivo CSS a un archivo HTML</strong></h2><p>Puedes enlazar tu archivo CSS a tu archivo HTML añadiendo un elemento <code>link</code> dentro del elemento <code>head</code> de tu archivo HTML, de este modo:</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
  &lt;html&gt;
    &lt;head&gt;
      &lt;link rel="stylesheet" href="style.css"&gt;
    &lt;/head&gt;
    &lt;body&gt;
    
    &lt;/body&gt;
&lt;/html&gt;</code></pre><p>El elemento <code>link</code> tiene muchos usos, y es importante especificar los atributos correctos de modo que puedas usarlo para importar una hoja de estilos de CSS. Veremos algunos atributos importantes ahora.</p><h2 id="el-atributo-rel"><strong>El atributo<strong><strong> <code>rel</code> </strong></strong></strong></h2><p>El primero de los atributos indispensables es el atributo <code>rel</code>. Usarás este atributo para decirle al navegador cuál es la relación con el archivo importado.</p><p>Escribirás <code>rel="stylesheet"</code> para decirle al navegador que estás importando una hoja de estilos.</p><h2 id="el-atributo-href"><strong>El atributo<strong><strong> <code>href</code></strong></strong></strong></h2><p>El segundo atributo indispensable es el atributo <code>href</code>, el cual especifica el archivo a importar.</p><p>Una situación común es que el archivo de CSS y el archivo de HTML estén en la misma carpeta. En ese caso puedes escribir <code>href="style.css"</code>.</p><p>Si el archivo de CSS y el archivo de HTML están en diferentes carpetas, necesitarás escribir la dirección correcta a la que necesita ir desde el archivo de HTML al archivo de CSS.</p><p>Por ejemplo, una situación habitual es que el archivo de CSS está en una carpeta que es hermana del archivo de HTML, de este modo:</p><pre><code>project --- index.html
            css ---------- style.css</code></pre><p>En este caso necesitarías escribir la dirección de esta forma <code>"css/styles.css"</code>.</p><h2 id="el-atributo-type"><strong>El atributo<strong><strong> <code>type</code></strong></strong></strong></h2><pre><code class="language-html">&lt;link rel="stylesheet" href="style.css" type="text/css"&gt;</code></pre><p>Se utiliza el atributo <code>type</code> para definir el tipo de contenido que estás enlazando. Para una hoja de estilos, esto sería <code>text/css</code>. Pero ya que <code>css</code> es el único lenguaje de hojas de estilos usado en la web, no es solo opcional, si no es incluso a una buena práctica no incluirlo.</p><h2 id="el-atributo-media"><strong>El atributo<strong><strong> <code>media</code></strong></strong></strong></h2><pre><code class="language-html">&lt;link rel="stylesheet" href="style.css" media="screen and (max-width: 600px)"&gt;</code></pre><p>El atributo media no es visible en el ejemplo. Es un atributo opcional que puedes usar para especificar cuando importar una hoja de estilos determinada. Su valor debe ser una media type / media query.</p><p>Esto puede ser útil en caso de que quieras separar los estilos para diferentes dispositivos y resoluciones de pantalla en diferentes archivos. Necesitarías importar cada archivo de CSS con su propio elemento <code>link</code>.</p><h1 id="conclusi-n"><strong><strong><strong>Conclusión</strong></strong></strong></h1><p>En este artículo, aprendiste a como añadir una hoja de estilos externa a tu página web usando el elemento <code>link</code> y los atributos <code>href</code> y <code>rel</code>.</p><p>También aprendiste que puedes importar múltiples hojas de estilos y usar el atributo <code>media</code> para determinar cuando cada una debería ser aplicada.</p><p>¡Qué te diviertas creando páginas web!</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
