Creación de Diseños Responsivos con CSS Grid
Clase 12 de 13 • Curso de CSS Grid Básico
Contenido del curso
Clase 12 de 13 • Curso de CSS Grid Básico
Contenido del curso
Juan Gustavo Daza Martínez
Dario Paladines
Sebastián Arredondo Posada
Alex Jonathan Camacho Montenegro
Ricardo Andres Ojeda Silva
Juan Gui Arenas
Marco Palacios Orihuela
Javier Salcedo Salgado
Ali Hilario
Angel Hernandez
Joserph Camacho
david felipe caicedo canchon
Manuel Eduardo Chingay Lopez
Juan Felipe Turca Molina
Estefany Salas
Mateo Sánchez
César Palma
Omar Gabriel Aguilar Moscoso
KEVIN A. DERAS
Julia Gabriela Nieva Paredes
Fabiola Rocha
Sergio Javier Lopez Olivera
Raúl Adolfo Sánchez Rodríguez
María C. Santiago
Juan Olima
Yeins David Llano Hernández
Christian Velázquez
Alejandro Guevara
Me doy cuenta de la importancia del Mobile First. Es más complicado hacerlo responsive desde un desktop screen
Totalmente, se deberia siempre emepzar por mobile first
That's tue!
Es poco, pero es trabajo honesto :'v
Agregué unos cuantos estilos al proyecto para terminar la parte visual
Este curso fue excelente aprendi mucho sobre Grid pues tenia muchos vacios, pero me ayudo a comprender mejor todos lo conceptos :)
El curso esta bueno, pero lo ideal hubiera sido desarrollar la carta en first mobile y seguir la ruta del curso de desarrollo web y luego escalarla. Bueno yo lo hice de esa manera siguiendo la ruta.
Les comparto mi proyecto, aunque visualmente se ve igual le he agregado ciertas cosas que mejoran la performance y la experiencia de usuario.
Excellent!
Voila!!! Aqui el proyecto ya por completo terminado, lo deje lo mejor que pude!
HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Proyecto de la clase</title> <link rel="stylesheet" href="./style.css"> </head> <body> <main> <section class="hero"> <div class="info"> <h1 class="info-title">Check the <br> best food</h2> <p class="info-subtitle">Lorem ipsum, dolor sit amet </p> <button class="info-button">Book a table</button> </div> <img class="hero-image" src="./imagenes/hero.png" alt="Plato de pasta con vegetales"> </section> <section class="dishes"> <h2 class="dishes-title">Our Services</h3> <div class="dishes-grid"> <img class="dishes-item dishes-item__big" src="./imagenes/video.png" alt="video sobre la comida"> <img class="dishes-item" src="./imagenes/dish1.png" alt=""> <img class="dishes-item" src="./imagenes/dish2.png" alt=""> <img class="dishes-item" src="./imagenes/dish3.png" alt=""> <img class="dishes-item" src="./imagenes/dish4.png" alt=""> </div> </section> <section class="menu"> <h2 class="menu-title">Home menu</h3> <div class="menu-grid"> <div class="menu-grid-item"> <img src="./imagenes/plate1.png" alt=""> </div> <div class="menu-grid-item"> <img src="./imagenes/plate2.png" alt=""> </div> <div class="menu-grid-item"> <img src="./imagenes/plate3.png" alt=""> </div> <div class="menu-grid-item"> <img src="./imagenes/plate4.png" alt=""> </div> <div class="menu-grid-item"> <img src="./imagenes/plate5.png" alt=""> </div> </div> </section> </main> </body> </html>
CSS
* { padding: 0; margin: 0; box-sizing: border-box; font-family: 'Roboto', sans-serif; } main { max-width: 1200px; margin: 0 auto; } .hero { display: grid; grid-template-columns: minmax(300px, 2fr) 3fr; grid-auto-rows: 550px;/* ALTURA del contenedor */ border-bottom: 1px solid #ddd; } .hero .hero-image { width: 100%; height: 100%; /* ALTURA del contenedor */ object-fit: contain; /* La imagen se ajuste al espacio donde esta */ } .info { align-self: center; /* Alineamos el contenido del div.info */ } .info-title { color: #333; font-size: 3rem; font-weight: bolder; margin-bottom: 24px; } .info-subtitle { color: #333; font-size: 1.5rem; margin-bottom: 24px; } .info-button { border: none; border-radius: 20px; color: #333; background-color: #fb8c00; font-weight: bolder; padding: 12px 24px; } .dishes { margin: 100px 0; } .dishes-title { color: #333; font-weight: bold; text-align: center; margin-bottom: 50px; font-size: 2rem; } .dishes-grid { display: grid; place-content: center; grid-template-columns: repeat(auto-fit, minmax(75px, 200px)); /* REDUCIMOS el tamaño del grid */ grid-auto-rows: 1fr; gap: 24px; } .dishes-item { width: 100%; height: 100%; object-fit: cover; } .dishes-item__big { grid-area: 1 / 1 / 3 / 3;/* INICIA EN fila 1 y columna 1 / TERMINA EN fila 3 columna 3 */ } .menu { margin-bottom: 200px; } .menu-title { font-size: 2rem; color: #333; font-weight: bolder; text-align: center; margin-bottom: 50px; } .menu-grid { display: grid; gap: 24px; justify-content: center; grid-template-columns: repeat(5, minmax(100px, 250px)); } .menu-grid-item { background-color: lightpink; padding: 12px; border-top-left-radius: 40px; } .menu-grid-item img { width: 100%; height: 100%; object-fit: contain; } @media screen and (max-width: 750px) { main { display: grid; } .hero { grid-template-columns: minmax(300px, 500px); justify-content: center; grid-auto-rows: 300px; } .hero-image { display: none; } .hero .info { margin-left: 40px; } .dishes { margin: 52px; } .dishes-grid { justify-content: center; grid-template-columns: repeat(auto-fit, minmax(50px, 100px)); } .menu-grid { margin: 0 16px; margin-bottom: 60px; grid-template-columns: repeat(2, minmax(100px, 200px)); grid-auto-rows: auto; } }
Este es el proyecto con algunos cambios.
¿No es mejor maquetar desde mobile e ir ajustando hasta desktop?
Lo que propones es lo que popularmente se conoce como Mobile First y es completamente valido, de hecho, hoy en día es bastante recomendable, pero me imagino que la profesora decidió hacer el curso con una pagina primero para desktop y luego responsive simplemente para seguir la línea básica que siguen todos los cursos de css (de explicar primero lo basico para verlo en computador mientras se programa y luego en el telefono) para explicar los conceptos básicos de Grid ;)
Siii, cuando estás trabajando lo recomendable es comenzar desde mobile, en este curso comencé desde desktop porque me daba mucho más espacio para jugar con los elementos 💚
Con la propiedad filter: drop-shadow, puedes colocar sombra a una imagen sin fondo:
mi reto, enfocado sobretodo en grid https://codepen.io/xsrpm/full/wvqPJjG
bien, felicidades
Les muestro mi proyecto a escala, hecho de manera responsive: Les estaré agradecido me regalen una estrella en mi repositorio. Gracias. https://github.com/ArielMejia/food-menu-grid
¿No les molesta que el código compartido no sea el mismo que el código que se generó durante las clases de la profe? Porque a mí sí me causó confusión.
Igual a mí
Challenge completed: .
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Restaurant</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;900&display=swap" rel="stylesheet"> <link rel="stylesheet" href="./projectClass.css"> </head> <body> <main> <section class="hero"> <div class="info"> <h1 class="info-title">Check the<br/>best food</h2> <p class="info-subtitle">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec porttitor neque sed turpis bibendum dapibus.</p> <button class="info-button">Book a table</button> </div> <figure class="hero-image"> <img src='https://i.ibb.co/R0xYKtR/hero.png' alt="Dish of pasta with neapolitan sauce and vegetables"> </figure> </section> <section class="services"> <h2 class="services-title">Our services</h3> <div class="dishes"> <img class="dishes-image dishes-image__big" src="https://i.postimg.cc/k5qHRc5H/video.png" alt="video of pasta dishes being served"> <img class="dishes-image" src="https://i.postimg.cc/qR0pRyfB/dish1.png" alt="bowl of vegetables with rice and avocado"> <img class="dishes-image" src="https://i.postimg.cc/Wp5sNd5j/dish2.png" alt="Avocado and egg toast"> <img class="dishes-image" src="https://i.postimg.cc/hPwgmHF5/dish3.png" alt="asparagus with tomato and butter"> <img class="dishes-image" src="https://i.postimg.cc/MG08hHnC/dish4.png" alt="eggs and guacamole toast "> </div> </section> <section class="menu"> <h2 class="menu-title">Home menu</h3> <div class="plates"> <div class="plates-grid-item"> <img src="https://i.postimg.cc/15g1yJgc/plate1.png" alt="pasta with neapolitan sauce and vegetables"> </div> <div class="plates-grid-item"> <img src="https://i.postimg.cc/cH1P2my3/plate2.png" alt="pasta with broccoli and carrot"> </div> <div class="plates-grid-item"> <img src="https://i.postimg.cc/rs3bd2dG/plate3.png" alt="pesto pasta"> </div> <div class="plates-grid-item"> <img src="https://i.postimg.cc/Fsk8MzqT/plate4.png" alt="pasta with avocado and corn"> </div> <div class="plates-grid-item"> <img src="https://i.postimg.cc/rw63Mc2M/plate5.png" alt="bowl of chicken, tomato and carrots"> </div> </div> </section> </main> </body> </html>
. . . CSS: .
* { font-family: 'Roboto', sans-serif; } main { max-width: 1200px; margin: 0 auto; } /* Hero */ .hero { display: grid; grid-template-columns: minmax(300px, 2fr) 3fr; grid-auto-rows: 550px; border-bottom: 1px solid #ddd; background: linear-gradient(to right, #141e30, #243b55) } .hero-image { margin: 0; } .hero-image img { width: 100%; height: 100%; object-fit: contain; } .info { align-self: center; display: flex; flex-direction: column; padding: 2rem; z-index: 4; } .info-title { color: #FFFF; font-weight: bold; font-size: 2.4rem; } .info-subtitle { color: #FFFF; font-weight: 400; line-height: 1.6rem; } .info-button { border: none; background-color: #fb8c00; color: #333; padding: 1rem; border-radius: 5rem; width: 8rem; font-weight: 900; } /* Services */ .services { border-bottom: 1px solid #ddd; } .services-title { color: #333; font-size: 2rem; font-weight: 900; text-align: center; } .dishes { margin: 100px 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(75px, 200px)); /* aqui usamos auto-fit para rellenar con las celdas en el espacio correspondiente, lo suficiente para que quepa */ grid-auto-rows: 1fr; gap: 25px; justify-content: center; } .dishes-image { margin: 0; width: 100%; height: 100%; object-fit: cover; border-radius: 1.6rem; box-shadow: 0 2px 5px .2px rgba(78, 78, 78, 0.24); } .dishes-image__big { grid-area: 1 / 2 / 3 / 4; } /* List */ .menu { display: flex; flex-direction: column; gap: 2rem; padding: 2rem;; } .menu-title { color: #333; font-size: 2rem; font-weight: bolder; text-align: center; } .plates { display: grid; gap: 2rem; justify-content: center; grid-template-columns: repeat(auto-fit, 150px); } .plates-grid-item { background-color: #333; padding: 0.8rem; border-radius: 2rem 2rem 0 2rem; box-shadow: 0 2px 5px .2px rgb(26, 26, 26); } .plates-grid-item img { width: 100%; height: 100%; object-fit: contain; } @media screen and (max-width: 760px) { .hero { grid-template-columns: minmax(100px, 500px); justify-content: center; background-color: linear-gradient(to right, #4b79a1, #283e51); } .hero-image { display: none; } .info-title { color: white; } .info-subtitle { color: white; } .services-title { color: #333; z-index: 4; } .dishes { grid-template-columns: repeat(auto-fit, minmax(75px, 100px)); } }
Proyecto final con medias queries
Revisa el código en mi repositorio de GitHub
Mira directamente la demo
Resultado (pantalla grande)
Resultado (pantalla mediana)
Resultado (pantalla pequeña)
Te quedó genial
👏👏
Aquí esta mi código y el vinculo al proyecto, lo hice Mobile first y agregue mediaqueries para Tablet y desktop
Código: https://github.com/Yenda09/restaurant_page Proyecto: https://yenda09.github.io/restaurant_page/
Tenía todavía muchas "dudas" sobre éste tema. Gracias por el curso. Mi duda es: el usar minmax, no se rompe cuando el sitio se está adaptando para diferentes dispositivos o medidas?
https://cssg-rid-basico.vercel.app/ Acá esta el ejercicio, me mató mucho hacerlo responsive sin mucho código.