Iguala alturas perfectamente,
sin complicaciones
Librería JavaScript ligera que iguala automáticamente las alturas de elementos DOM mediante variables CSS. Perfecta para carousels, grids y layouts responsivos.
Características principales
Todo lo que necesitas para igualar alturas de forma automática y eficiente
Igualación Automática
Calcula y aplica la altura máxima mediante variables CSS personalizables sin intervención manual.
Sistema Responsive
Breakpoints configurables con opciones específicas por viewport para control total en cada dispositivo.
Actualización Automática
MutationObserver y eventos de resize mantienen las alturas sincronizadas automáticamente.
Modos de Columnas
Iguala todos los elementos o agrúpalos por número de columnas según tus necesidades de layout.
Lifecycle Hooks
Eventos en cada etapa del ciclo de vida para debugging y control avanzado de la funcionalidad.
Framework Agnostic
Compatible con React, Vue, Angular, Svelte y cualquier framework moderno o vanilla JS.
Instalación
NPM
npm install hequalizer
// ES modules
import Hequalizer from 'hequalizer';
// CommonJS
const Hequalizer = require('hequalizer');
CDN
<script src="https://cdn.jsdelivr.net/npm/hequalizer@1.0.0/hequalizer.min.js"></script>
Uso Básico
HTML
<div class="card-container">
<div class="card">
<h3>Título 1</h3>
<p>Contenido variable...</p>
</div>
<div class="card">
<h3>Título 2</h3>
<p>Contenido con diferente altura...</p>
</div>
<div class="card">
<h3>Título 3</h3>
<p>Más contenido...</p>
</div>
</div>
JavaScript
// Seleccionar los títulos de las tarjetas
const cardTitles = document.querySelectorAll('.card h3');
// Inicializar Hequalizer
new Hequalizer(cardTitles);
CSS
/* La variable CSS --height se aplica automáticamente */
.card h3 {
height: var(--height);
}
- El DOM esté completamente cargado (DOMContentLoaded)
- El contenido cambie (mediante MutationObserver)
- La ventana cambie de tamaño (resize event)
Configuración
new Hequalizer(elements, options)
| Opción | Tipo | Default | Descripción |
|---|---|---|---|
cssVariable |
String | '--height' |
Nombre de la variable CSS |
columns |
String | Number | 'all' |
Modo de columnas: "all" o número |
initialIndex |
Number | 0 |
Índice desde donde iniciar |
resizeObserver |
Boolean | true |
Activar MutationObserver |
classElementToOmit |
String | '' |
Clase para omitir elementos |
on |
Object | {} |
Lifecycle hooks |
responsive |
Object | {} |
Breakpoints responsive |
API
Métodos de Instancia
const instance = new Hequalizer(elements);
// Actualizar manualmente
instance.update();
// Reinicializar
instance.init();
// Destruir (mantener en registro)
instance.destroy();
// Destruir y remover del registro
instance.destroy(true);
Propiedades de Instancia
instance.id // ID único generado
instance.elementsArray // Elementos originales
instance.values // Altura(s) calculada(s)
instance.actualOptions // Opciones aplicadas
instance.actualBreakpoint // Breakpoint actual
API Global
// Acceder a todas las instancias
window.HequalizerAPI.Instances
// Crear instancia
window.HequalizerAPI.Init(elements, options)
// Remover instancia
window.HequalizerAPI.removeInstance(id)
Sistema Responsive
Hequalizer incluye un sistema responsive completo que permite configurar diferentes opciones según el viewport. Cada breakpoint puede sobrescribir cualquiera de las opciones base.
Cómo Funciona
- Evaluación por viewport: Los breakpoints se evalúan con
window.innerWidth ≤ breakpoint - Orden automático: Los breakpoints se ordenan de menor a mayor automáticamente
- Configuración base: Si el viewport no coincide con ningún breakpoint, se usa la configuración base
- Fusión de opciones: Las opciones del breakpoint activo se fusionan con las opciones base
- Recalculación automática: Al cambiar de breakpoint, las alturas se recalculan automáticamente
Propiedades Configurables por Breakpoint
Todas las opciones disponibles pueden ser sobrescritas en cada breakpoint:
| Propiedad | Tipo | Descripción | Uso Responsive |
|---|---|---|---|
cssVariable |
String | Nombre de la variable CSS | Útil para usar diferentes variables por dispositivo |
columns |
String | Number | Modo de columnas | Cambia el número de columnas según el viewport (ej: 4 desktop, 2 tablet, 1 mobile) |
initialIndex |
Number | Índice desde donde iniciar | Permite omitir elementos iniciales solo en ciertos viewports |
resizeObserver |
Boolean | Activar MutationObserver | Mejora performance desactivándolo en móvil: resizeObserver: false |
classElementToOmit |
String | Clase para omitir elementos | Permite omitir diferentes elementos según el dispositivo |
on |
Object | Lifecycle hooks | Ejecuta lógica específica por breakpoint usando instance.actualBreakpoint |
Ejemplo Básico
new Hequalizer(elements, {
// Configuración base (desktop > 1024px)
columns: 3,
cssVariable: '--desktop-height',
responsive: {
// Tablet (≤ 1024px)
1024: {
columns: 2,
cssVariable: '--tablet-height'
},
// Mobile (≤ 768px)
768: {
columns: 1,
cssVariable: '--mobile-height',
resizeObserver: false // Mejora performance en móvil
}
}
});
Ejemplo Avanzado con Todas las Propiedades
new Hequalizer(elements, {
// Configuración base (desktop)
cssVariable: '--height-desktop',
columns: 4,
initialIndex: 0,
resizeObserver: true,
classElementToOmit: '',
on: {
afterResize: ({rows, instance}) => {
console.log('Breakpoint:', instance.actualBreakpoint);
console.log('Columnas activas:', instance.actualOptions.columns);
}
},
responsive: {
// Large Tablet (≤ 1280px)
1280: {
columns: 3,
cssVariable: '--height-lg-tablet'
},
// Tablet (≤ 1024px)
1024: {
columns: 2,
cssVariable: '--height-tablet',
initialIndex: 1 // Omite el primer elemento en tablet
},
// Mobile Landscape (≤ 768px)
768: {
columns: 2,
cssVariable: '--height-mobile-landscape',
classElementToOmit: 'hide-mobile' // Omite elementos con esta clase
},
// Mobile Portrait (≤ 480px)
480: {
columns: 1,
cssVariable: '--height-mobile',
resizeObserver: false, // Mejor performance
initialIndex: 0,
classElementToOmit: 'hide-mobile'
}
}
});
- Los breakpoints se evalúan con
≤(menor o igual) - Se ordenan automáticamente de menor a mayor
- Si no coincide ninguno, se usa la configuración base
- Puedes acceder al breakpoint actual con
instance.actualBreakpoint - Puedes acceder a las opciones aplicadas con
instance.actualOptions
Ejemplos
Grid Responsive
const gridItems = document.querySelectorAll('.grid-item');
new Hequalizer(gridItems, {
columns: 3,
responsive: {
1024: { columns: 2 },
768: { columns: 1 }
}
});
Lifecycle Hooks
const cards = document.querySelectorAll('.card');
new Hequalizer(cards, {
on: {
init: ({rows, instance}) => {
console.log(`Altura inicial: ${rows}px`);
},
afterResize: ({rows, instance}) => {
console.log(`Nueva altura: ${rows}px`);
},
afterChanges: ({rows, instance}) => {
console.log('Contenido cambió, nueva altura:', rows);
}
}
});
Omitir Elementos
const items = document.querySelectorAll('.item');
new Hequalizer(items, {
classElementToOmit: 'skip-height'
});
Demos Interactivos
Demo 1: Grid Responsive
Grid de tarjetas con contenido variable. Los títulos se igualan automáticamente a la altura del más largo.
Demo 2: Carousel con Scroll Horizontal
Carousel horizontal con desplazamiento. Todas las descripciones tienen la misma altura para mantener el diseño consistente.
Código de los demos:
// Grid: Igualar títulos
const gridTitles = document.querySelectorAll('.grid-card-title');
new Hequalizer(gridTitles, {
on: {
init: ({rows, instance}) => {
console.log(`Grid altura: ${rows}px`);
}
}
});
// Carousel: Igualar descripciones
const carouselDescs = document.querySelectorAll('.carousel-card-desc');
new Hequalizer(carouselDescs, {
on: {
init: ({rows, instance}) => {
console.log(`Carousel altura: ${rows}px`);
}
}
});