18 · Show more

Show more

Ver más elementos sin slice() ni JS

:has() Chrome 105+ · soporte amplio
← Índice

Ver más sin slice()

El antipatrón clásico oculta elementos cortando un array con JS (slice(0, n)) y re-renderiza la lista en cada click. El mismo resultado, con CSS puro:

El antipatrón en JS

js
// Antipatrón: ocultar elementos cortando un array con JS
let visibles = items.slice(0, 3);   // estado inicial
visibles = items.slice(0, 6);      // al hacer click en "Ver más"

// Cada click re-renderiza la lista entera desde JS
btn.onclick = () => {
  visibles = items.slice(0, visibles.length + 3);
  render();
};

CSS puro con :has()

  • 🎧 Amber‑01 — Auriculares
  • ⌨️ Teclado mecánico
  • 🖱️ Mouse ergonómico
  • 📱 Soporte para celular
  • 💡 Lámpara LED
  • 🧹 Limpiador de teclado

Un <input type="checkbox"> oculto controla la visibilidad. :has(:checked) revela los ítems extra y swapea el label — sin una línea de JavaScript.

Por qué importa

Menos JS enviado, el estado vive en el DOM y el contenido ya está en el HTML (mejor para SEO y lectores de pantalla) en vez de inyectarse por script.

html
<!-- Sin JS: :has() reacciona al estado del checkbox -->
<input type="checkbox" id="sm-demo" class="sm-toggle">
<ul class="sm-list">
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
  <li class="sm-extra">Item 4</li>
  <li class="sm-extra">Item 5</li>
  <li class="sm-extra">Item 6</li>
</ul>
<label for="sm-demo" class="sm-btn">
  <span class="sm-more">Ver más</span>
  <span class="sm-less">Ver menos</span>
</label>

Nota honesta sobre soporte

Muchas de estas APIs son recientes y aún no están en todos los navegadores (ver pill de cada sección). La gracia es que todas degradan bien: el carousel sigue scrolleando, el accordion abre/cierra, el textarea funciona — solo sin el "plus" animado.