<div class="container py-4">
  <h2 class="text-center mb-4 fw-bold">🎬 Películas Destacadas</h2>
  <div class="row" id="movie-container"></div>
</div>
.movie-card {
  position: relative;
  border-radius: 20px;
  overflow: hidden;
  box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3);
  transition: transform 0.3s ease;
  cursor: pointer;
  background-color: #000;
}

.movie-card:hover {
  transform: scale(1.03);
}

.movie-poster {
  width: 100%;
  height: 320px;
  object-fit: cover;
  filter: brightness(0.9);
}

.movie-overlay {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  padding: 1rem;
  background: linear-gradient(to top, rgba(0, 0, 0, 0.85), transparent);
  color: #fff;
}

.movie-title {
  font-size: 1.1rem;
  font-weight: 600;
  margin: 0;
}

.movie-info {
  font-size: 0.9rem;
  color: #ccc;
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}

.movie-card {
  position: relative;
  border-radius: 20px;
  overflow: hidden;
  box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3);
  transition: transform 0.3s ease;
  cursor: pointer;
  background-color: #000;
}

.movie-card:hover {
  transform: scale(1.03);
}

.movie-poster {
  width: 100%;
  height: 320px;
  object-fit: cover;
  filter: brightness(0.9);
}

.movie-overlay {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  padding: 1rem;
  background: linear-gradient(to top, rgba(0, 0, 0, 0.85), transparent);
  color: #fff;
}

.movie-title {
  font-size: 1.1rem;
  font-weight: 600;
  margin: 0;
}

.movie-info {
  font-size: 0.9rem;
  color: #ccc;
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}

.movie-rating {
  position: absolute;
  top: 10px;
  left: 10px;
  background: white;
  color: #333;
  font-weight: bold;
  font-size: 0.85rem;
  padding: 4px 8px;
  border-radius: 12px;
  display: flex;
  align-items: center;
  gap: 4px;
}

.movie-rating .rating-year {
 color: #666;
  font-size: 12px;
}

.movie-rating span {
  color: #ffd700;
  font-size: 12px;
}

.movie-rating span.empty {
  color: #ccc;
}

.movie-rating span.half-filled {
  background: linear-gradient(to right, #ffd700 50%, #ccc 50%);
  -webkit-background-clip: text;
  color: transparent;
}

.movie-fav {
  position: absolute;
  top: 10px;
  right: 10px;
  background: rgba(255, 255, 255, 0.15);
  width: 38px;
  height: 38px;
  border-radius: 50%;
  color: white;
  font-size: 1rem;
  display: flex;
  align-items: center;
  justify-content: center;
}
function cargarPeliculas() {
  fetch('https://devsapihub.com/api-movies')
    .then(res => res.json())
    .then(data => {
      const container = document.getElementById('movie-container');
      container.innerHTML = '';

      data.forEach(movie => {
        const rating = movie.stars || 0; // Recupera la calificación de estrellas
        const totalStars = 5; // Número total de estrellas

        // Crear el HTML de las estrellas
        let starsHtml = '';
        for (let i = 0; i < totalStars; i++) {
          if (i < Math.floor(rating)) {
            starsHtml += '<span class="filled">★</span>'; // Estrella llena
          } else if (i < Math.ceil(rating)) {
            starsHtml += '<span class="half-filled">★</span>'; // Estrella mitad llena
          } else {
            starsHtml += '<span class="empty">☆</span>'; // Estrella vacía
          }
        }

        const card = `
          <div class="col-12 col-sm-6 col-md-4 col-lg-3 mb-4">
            <div class="movie-card">
              <img src="${movie.image_url}" alt="${movie.title}" class="movie-poster">
              <div class="movie-rating">
                <span class="rating-year">${movie.year}</span> | ${starsHtml}
              </div>
              <div class="movie-fav"><i class="bi bi-heart"></i></div>
              <div class="movie-overlay">
                <h4 class="movie-title">${movie.title}</h4>
                <p class="movie-info">${movie.description}</p>
              </div>
            </div>
          </div>
        `;
        container.insertAdjacentHTML('beforeend', card);
      });
    })
    .catch(err => {
      console.error('Error al cargar películas:', err);
      document.getElementById('movie-container').innerHTML = `<p class="text-danger">No se pudieron cargar las películas.</p>`;
    });
}

window.addEventListener('DOMContentLoaded', cargarPeliculas);
Run Pen

External CSS

  1. https://cdn.jsdelivr.net/npm/bootstrap@5.3.5/dist/css/bootstrap.min.css
  2. https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css

External JavaScript

This Pen doesn't use any external JavaScript resources.