Saltar al contenido principal
Codigo Heroe
Tarea anterior
JavaScript en el navegador14/19
A la lista de tareas
  1. 1. Conectar un script a la página
  2. 2. El método querySelector: buscar un elemento
  3. 3. El método classList.add: agregar una clase
  4. 4. El método querySelectorAll: buscar varios elementos
  5. 5. Recorrer una colección de elementos
  6. 6. Comprobar la propiedad isAvailable
  7. 7. Comprobar la propiedad isSpecial
  8. 8. La propiedad children: elementos hijos
  9. 9. El método createElement: crear un elemento
  10. 10. La propiedad textContent: contenido de texto
  11. 11. Una función para crear elementos
  12. 12. Simplificar el código con makeElement
  13. 13. La propiedad src: la ruta de la imagen
  14. 14. Una función para crear una tarjeta de producto
  15. 15. Probar la función que crea tarjetas
  16. 16. Usar un objeto de datos
  17. 17. Comprobar la disponibilidad del producto
  18. 18. Mostrar una oferta especial
  19. 19. Usar un arreglo de objetos
Siguiente tarea
  • Matriz de skills
  • Cursos
  • Registro
  • Iniciar sesión

Loading…
En unos segundos, estará listo.

  • Teoría
  • Teoría

Una función para crear una tarjeta de producto

Ya agregamos una tarjeta, pero ahora Cupcake pide crear muchas a la vez a partir de los datos recibidos. Los datos todavía no llegan porque el sistema está fallando, pero podemos ir preparando el programa.

El algoritmo para agregar una tarjeta es casi el mismo que para agregar diez o veinte: creamos elementos, les agregamos clases, atributos y texto, pero repetimos los pasos varias veces. Claro que necesitamos una función.

Crearemos createCard, que se encargará de construir una tarjeta de producto. Dentro crearemos el elemento de lista y colocaremos en él las demás partes: el título, la imagen y el precio. La función devolverá el elemento DOM completo. Fuera de ella dejaremos la búsqueda de la lista de productos y la inserción de los elementos que devuelva la función.

Esta división del trabajo hará nuestro código más versátil. createCard no necesita saber dónde se insertará la tarjeta, así que podremos reutilizarla en cualquier parte sin modificarla. Por ejemplo, podremos insertar sus tarjetas en una lista de ofertas especiales o en otra lista de novedades.

Poco a poco pasamos de la producción artesanal a la producción en serie: un programa que trabaja de forma estable con cualquier cantidad de elementos.

  • index.html
  • style.css
  • script.js
HTML
<!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8"> <title>Catálogo | Device</title> <link rel="stylesheet" href="device/setting.css"> <link rel="stylesheet" href="style.css"> </head> <body> <ul class="products"> <li class="product product--available"> <h2 class="product__title">Palo para selfies para principiantes</h2> <img class="product__image" src="device/item-1.jpg" alt="Palo para selfies para principiantes"> <p class="product__price">200</p> </li> <li class="product product--unavailable"> <h2 class="product__title">Palo para selfies profesional</h2> <img class="product__image" src="device/item-2.jpg" alt="Palo para selfies profesional"> <p class="product__price">1500</p> </li> <li class="product product--available"> <h2 class="product__title">Palo para selfies insumergible</h2> <img class="product__image" src="device/item-3.jpg" alt="Palo para selfies insumergible"> <p class="product__price">2500</p> </li> </ul> <script src="script.js"></script> </body> </html>
CSS
.products { display: flex; flex-wrap: wrap; justify-content: space-between; width: 570px; margin: 20px auto; padding: 0; list-style: none; } .product { position: relative; display: flex; flex-wrap: wrap; justify-content: space-between; width: 270px; margin-bottom: 30px; } .product__image { order: -1; width: 270px; height: 380px; margin-bottom: 15px; } .product__title { max-width: 180px; margin: 0; font-weight: 700; font-size: 18px; line-height: 24px; } .product__price { max-width: 80px; margin: 0; text-align: right; font-weight: 300; font-size: 16px; font-variant-numeric: lining-nums; line-height: 27px; } .product--special { order: -1; width: 100%; height: 380px; flex-direction: column; justify-content: flex-start; align-content: space-between; } .product--special .product__title { width: 270px; max-width: 100%; margin-bottom: 10px; font-size: 28px; line-height: 36px; } .product--special .product__price { width: 270px; max-width: 100%; text-align: left; text-decoration: line-through; color: #cccccc; } .product--special .product__special-price { margin: 0; } .product--special .product__image { outline: 3px solid #ffc600; } .product--special::before { content: "Producto del día"; position: absolute; top: 0; left: 0; display: flex; justify-content: center; align-items: center; padding: 5px 10px; font-weight: 500; color: #111111; text-transform: uppercase; background-color: #ffc600; } .product--available::after, .product--unavailable::after { position: absolute; top: 343px; left: 50%; padding: 10px 5px 2px 5px; border-bottom: 1px solid #57c74b; transform: translateX(-50%); } .product--available::after { content: "Disponible"; } .product--unavailable { filter: grayscale(1) opacity(0.7); } .product--unavailable::after { content: "Agotado"; } .product--special.product--available::after, .product--special.product--unavailable::after { left: 135px; }
JavaScript
var makeElement = function (tagName, className, text) { var element = document.createElement(tagName); element.classList.add(className); if (text) { element.textContent = text; } return element; }; var cardList = document.querySelector('.products'); console.log(cardList.children); var listItem = makeElement('li', 'product'); cardList.appendChild(listItem); console.log(cardList.children); var title = makeElement('h2', 'product__title', 'Palo para selfies profesional'); listItem.appendChild(title); var picture = makeElement('img', 'product__image'); picture.src = 'device/item-4.jpg'; picture.alt = 'Palo para selfies profesional'; listItem.appendChild(picture); var price = makeElement('p', 'product__price', '1000'); listItem.appendChild(price);

El código ha cambiado, haz clic en "Actualizar" o activa la ejecución automática.

Ha ido a otra página

Haga clic dentro del mininavegador para poner el foco en esta ventana.

100%
Consola
ObjetivosRealizado
0
    1. Después de makeElement, crea la función createCard.
    2. Mueve al cuerpo de createCard todo el código desde la declaración de listItem hasta la inserción de price en la tarjeta, ambas incluidas.
    3. Elimina del cuerpo de createCard las instrucciones cardList.appendChild(listItem) y console.log(cardList.children).
    4. Devuelve listItem desde la función.
    Codigo Heroe

    © 2023-2026, codigoheroe.com