CursosEmpresasBlogLiveConfPrecios

Retos: scrollTop y DRY

Clase 12 de 17 • Curso de API REST con Javascript: Ejemplos con APIs reales

Clase anteriorSiguiente clase

Contenido del curso

Presentación del proyecto: PlatziMovies
  • 1
    TheMovieDB: análisis de su API

    TheMovieDB: análisis de su API

    07:15
  • 2
    Bocetos en papel y diseño en Figma

    Bocetos en papel y diseño en Figma

    08:05
Configuración inicial y maquetación del proyecto
  • 3
    Configuración del entorno de desarrollo

    Configuración del entorno de desarrollo

    16:53
  • 4
    Maquetación del proyecto: HTML y CSS

    Maquetación del proyecto: HTML y CSS

    18:34
Consumiendo la API
  • 5
    Lista de películas en tendencia

    Lista de películas en tendencia

    16:41
  • 6
    Lista de categorías

    Lista de categorías

    10:32
  • 7
    Migración a Axios

    Migración a Axios

    07:18
Navegación
  • 8
    Location y hash navigation

    Location y hash navigation

    17:17
  • 9
    Mostrando y ocultando secciones

    Mostrando y ocultando secciones

    22:05
  • 10
    Error: carga duplicada de datos

    Error: carga duplicada de datos

    06:30
Views
  • 11
    Filtrando películas por categoría

    Filtrando películas por categoría

    21:38
  • 12
    Retos: scrollTop y DRY

    Retos: scrollTop y DRY

    11:13
  • 13
    Buscador de películas

    Buscador de películas

    11:10
  • 14
    Retos: historial de navegación y página de tendencias

    Retos: historial de navegación y página de tendencias

    06:19
  • 15
    Endpoint de detalles de una película

    Endpoint de detalles de una película

    18:55
  • 16
    Lista de películas recomendadas

    Lista de películas recomendadas

    07:36
Próximos pasos
  • 17
    Toma el Curso Profesional de Consumo de API REST con JavaScript

    Toma el Curso Profesional de Consumo de API REST con JavaScript

    02:19
    Edmir Galván Vázquez

    Edmir Galván Vázquez

    student•
    hace 4 años

    Yo encontre esta solucion para el scroll. Me parecio sencilla y legible.

    window.scrollTo(0, 0);
      Federico Ivan Llano

      Federico Ivan Llano

      student•
      hace 4 años

      yo habia encontrado esto window.scrollTo({ top: 0 }); en el navigator.

      Daniel Socorro Castellano

      Daniel Socorro Castellano

      student•
      hace 3 años

      excelente muchas gracias, probe la del profesor pero no me funciono, busque otras que tampoco me funcionaron, pero probe la tuya y esa si me funcionó

    Esteban Charria Muñoz

    Esteban Charria Muñoz

    student•
    hace 4 años

    hola!!, yo estuve buscando en stackoverflow formas de hacer el scrollTop y encontré esta función que es similar a lo que mostro el profe pero le agrega una animación bastante agradable :3

    function smoothscroll(){ const currentScroll = document.documentElement.scrollTop || document.body.scrollTop; if (currentScroll > 0) { window.requestAnimationFrame(smoothscroll); window.scrollTo (0,currentScroll - (currentScroll/5)); } };
      Juan Castro

      Juan Castro

      teacher•
      hace 4 años

      Love it

      Guadalupe Monge Barale

      Guadalupe Monge Barale

      student•
      hace 3 años

      Me encantó Muchas gracias

    Christian García

    Christian García

    student•
    hace 3 años

    Hola!, para los que le aparece %20 en el titulo de las categorías de: TV Movie o Science Fiction. Pueden usar este método que decodifica un componente URI

    decodeURIComponent(categoryName)
    function categoriesPage(){ genericSection.innerHTML = "" headerSection.classList.remove('header-container--long') headerSection.style.background = '' arrowBtn.classList.remove('inactive') arrowBtn.classList.remove('header-arrow--white') headerTitle.classList.add('inactive') headerCategoryTitle.classList.remove('inactive') searchForm.classList.add('inactive') trendingPreviewSection.classList.add('inactive') categoriesPreviewSection.classList.add('inactive') genericSection.classList.remove('inactive') movieDetailSection.classList.add('inactive') const [urlPage,categoryData] = location.hash.split('=') const [categoryId, categoryName] = categoryData.split('-') headerCategoryTitle.innerHTML = decodeURIComponent(categoryName); getMoviesByCategory(categoryId); }
      Eliezer Hernandez

      Eliezer Hernandez

      student•
      hace 3 años

      Gracias, justo lo que buscaba. Buen aporte.

      Ricardo Alfonso Chavez Vilcapoma

      Ricardo Alfonso Chavez Vilcapoma

      student•
      hace 3 años

      No me funcionó en Chrome :(

    Ameth Ordoñez Erazo

    Ameth Ordoñez Erazo

    student•
    hace 3 años

    Para los que no saben que significa el término DRY:

    Hay un principio en la programación llamado DRY, o Don't Repeat Yourself (No lo repitas tú mismo). Por lo general, significa refactorizar el código tomando algo hecho varias veces y convirtiéndolo en un bucle o una función. El código DRY es fácil de cambiar, porque solo tienes que hacer cualquier cambio en un solo lugar. Que fue lo que se hizo con la función createMovies.

    Federico Ivan Llano

    Federico Ivan Llano

    student•
    hace 4 años

    Agregue css al arrow con position fixed para las categorias, asi el arrow "nos sigue" 😂

    arrow.png
    .header-arrow { border-radius: 50px; background-color: gray; width: 50px; height: 50px; text-align: center; position: fixed; background-blend-mode: multiply; opacity: 0.9; z-index: 1; /**/ } h1, h2 { margin-top: 50px; /**/ }
      David Estiven Aragón Andrade

      David Estiven Aragón Andrade

      student•
      hace 4 años

      Excelente!!

      LUZ ADRIANA MARTINEZ RAMIREZ

      LUZ ADRIANA MARTINEZ RAMIREZ

      student•
      hace 3 años

      Gracias por el CSS

    Andrés Esteban Rodríguez Jiménez

    Andrés Esteban Rodríguez Jiménez

    student•
    hace 3 años

    Recordando la clase de ECMAScript6+ podemos usar este método para un problema en el código que hay de que los títulos salen con un %20 cuando tienen un espacio en blanco

    headerCategoryTitle.innerHTML = categoryName.replaceAll('%20',' ')

    Usé el String.replaceAll( ) y nos solo String.replace( ) por si en un futuro hay una categoría que use más de dos palabras (aunque lo dudo pero ahí lo dejo)

      Sebastian Giraldo

      Sebastian Giraldo

      student•
      hace 3 años

      es mas facil si usas el decodeURI, te evita esa concatenacion y no tienes que harcodear el cambio necesario, no siempre es %20 como se concatenan

    Lisbeth Quintero

    Lisbeth Quintero

    student•
    hace 3 años

    El error del %20, lo quité con "decodeURI":

    headerCategoryTitle.innerText = decodeURI(categoryName)

    Aquí el link con la info: https://www.geeksforgeeks.org/how-to-encode-and-decode-a-url-in-javascript/

      Sebastian Giraldo

      Sebastian Giraldo

      student•
      hace 3 años

      gran aporte, yo lo habia realizado con el clasico split y join, peor luego de leer el articulo entendi el por que de la funcion y es de gran ayuda!!

    Antonio Rafael González Ferrer

    Antonio Rafael González Ferrer

    student•
    hace 3 años

    Yei mi solución del código fue la misma que la del teacher!

    😁

    Lorenzo Peñalver

    Lorenzo Peñalver

    student•
    hace 2 años

    Para el scroll simplemente use ScrollTo(Top), no sé cual será la diferencia con la forma de JuanDC, pero me sirvió para todas las vistas sin problemas:

    function navigator() { console.log({ location }); if (location.hash.startsWith('#trends')) { trendsPage(); } else if (location.hash.startsWith('#search=')) { searchPage(); } else if (location.hash.startsWith('#movie=')) { movieDetailsPage(); } else if (location.hash.startsWith('#category=')) { categoriesPage(); } else { homePage(); } scrollTo(top) }
      Adriana Beatriz Barrera Estrella

      Adriana Beatriz Barrera Estrella

      student•
      hace 2 años

      probe muchas formas y la tuya finalmente me ayudo, muchisimas gracias 😊

    Edier Gama

    Edier Gama

    student•
    hace 3 años

    No sé si sea el único, pero a mí el scroll nunca me afectó xd

    o sea, cuando cambio de categorías nunca aparece en la parte de abajo, puede que Chrome haya hecho algo por eso?

    es necesario poner el scrollTop igualmente?

      Eliezer Hernandez

      Eliezer Hernandez

      student•
      hace 3 años

      Creo que si deberías incluirlo. Recuerda que no puedes determinar exactamente desde que navegadores accederán a tu sitio web y ese comportamiento puede resultar impredecible, ya que puede variar entre navegadores.

    Miguel Araya Hervas

    Miguel Araya Hervas

    student•
    hace 3 años

    Yo lo había hecho así el scrollTop

    document.querySelector('body').scrollTop;
      Miguel Araya Hervas

      Miguel Araya Hervas

      student•
      hace 3 años

      Vaya, parece que como lo había hecho no funciona siempre, no pude descubrir porque exactamente, así que solo termine usando el código del profesor.

    Jesús Ramon

    Jesús Ramon

    student•
    hace 2 años

    Esta fue mi solucion, esta bien si encapsule el endpoint para entregarlo como parametro cuando llamemos la funcion?

    async function getMovies(endpoint, section, id){ genericSection.style.display = “none”; const { data } = await api(endpoint, { params: { with_genres: id } }); const movies = data.results; section.innerHTML = ""; movies.forEach(movie=> { const movieContainer = createFunction('div'); movieContainer.classList.add('movie-container'); const movieImg = createFunction('img'); movieImg.classList.add('movie-img'); movieImg.setAttribute('alt', movie.title); movieImg.setAttribute('src', 'https://image.tmdb.org/t/p/w300' + movie.poster_path); movieContainer.appendChild(movieImg); section.appendChild(movieContainer); }) }
    Ricardo Alfonso Chavez Vilcapoma

    Ricardo Alfonso Chavez Vilcapoma

    student•
    hace 3 años

    Diferencias de scroll y scrollTo

    https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll

    Resumen: Son lo mismo

    Camila Ramirez

    Camila Ramirez

    student•
    hace 3 años

    Necesito por favor el codigo src de main.js y navigation.js de esta clase

      Juan Castro

      Juan Castro

      teacher•
      hace 3 años

      Aquí lo tienes: https://github.com/platzi/curso-api-rest-javascript-practico/tree/f6e15de9c01144993f852717184e7b6a5c8236e8

    marcos martilotta

    marcos martilotta

    student•
    hace 3 años

    No se porque pero a mi no me queda abajo el scroll.. Saen porque puede ser?

      Juan Castro

      Juan Castro

      teacher•
      hace 3 años

      Con el código por defecto que yo escribí también sucede. Por eso el reto. ¿Intentaste usar el scrollTop?

    Gilbert Ardila

    Gilbert Ardila

    student•
    hace 4 años

    minuto :10:36 estoy teniendo ese problema al mostrar el nombre de la categoría, ¿más adelante lo resolvemos? 0 ¿Cómo puedo resolverlo?

      Juan Castro

      Juan Castro

      teacher•
      hace 4 años

      Te respondí por aquí: https://platzi.com/comentario/3681312/

    Valentina Hernández

    Valentina Hernández

    student•
    hace un año

    aqui el primer reto

    function createMovies (movies, container) { let billboard=''; movies.forEach(movie => { billboard +=` <div class="movie-container"> <img src="https://image.tmdb.org/t/p/w300/${movie.poster_path}" class="movie-img" alt="${movie.title}" loading="lazy" /> </div> ` }); container.innerHTML=billboard; } async function getTrendingMoviesPreview() { const {data} = await api('trending/movie/day'); const movies = data.results; createMovies(movies, trendingMoviePreviewList); }
    Juan David Santamaria Gomez

    Juan David Santamaria Gomez

    student•
    hace 2 años

    Al momento de ver esta clase los navegadores automaticamente visualizan la interfaz en la parte top del navegador

    Julian David Alzate Cuervo

    Julian David Alzate Cuervo

    student•
    hace 2 años

    como se puede evitar que precargue la pelicula por defecto antes de cargar las peliculas por categoria? ya que al hacer esto en un desarrollo para un cliente podría ser molesto

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads