El elemento meter HTML5

- 👤 Andrés Cruz

🇺🇸 In english

El elemento meter HTML5

Si estás aprendiendo HTML5 y quieres dominar por completo el elemento <meter>, este curso te lleva desde lo más básico hasta los usos avanzados, incluyendo buenas prácticas, estilos, accesibilidad y ejemplos reales. 

Qué es el elemento <meter> y para qué sirve en HTML5

El elemento <meter> representa un valor dentro de un rango acotado. No es una barra arbitraria ni un progreso indefinido: siempre requiere un valor mínimo, uno máximo y un valor actual.

Sirve para expresar:

  • Niveles (batería, almacenamiento, combustible)
  • Intensidades o rangos (temperatura, puntuaciones)
  • Estados medibles dentro de límites claros

Muy util para mostrar progreso de una tarea, empecé usando <meter> porque visualmente encajaba, pero pronto descubrí que no es la mejor opción para tareas que no tienen un rango definido. Más abajo te explico por qué.

Cuándo usar <meter> y cuándo NO usarlo

Usa <meter> cuando:

  • el valor está acotado
  • existe un rango claro y medible
  • necesitas marcar niveles “bajo / normal / alto”

No lo uses cuando:

  • los valores no son predecibles
  • no hay un máximo
  • necesitas mostrar progreso real de tareas (ahí va <progress>)

Esto encaja justo con lo que me pasó: al usar <meter> para una tarea cuyo total no estaba definido, noté que el componente “mentía”, porque visualmente parecía progreso, pero semánticamente no lo era.

Sintaxis del elemento <meter> y explicación clara de cada atributo

La función de la etiqueta meter es la de indicar una medida dentro de un rango; es decir debe ser acotada, tener un inicio y un fin.

Su sintaxis es la siguiente:

<meter></meter>

Hasta ahora, nada nuevo; vemos que como la mayoría de las etiquetas en HTML presenta una etiqueta de inicio <meter> y otra de cierre </meter>.

Atributos de la etiqueta (tag) meter

  • value: Un valor punto flotante que representa el valor actual de la medición. Este valor debe de estar entre el valor máximo (max) y el valor mínimo (min).
    • min <= value <= max.
  • min: Indica el límite inferior (cota inferior) del rango de medición; y por lo tanto el valor mínimo posible para el atributo value; este valor debe ser más pequeño que el de el atributo max; si no se especifica el valor mínimo será cero.
  • max: Indica el límite superior (cota superior) del rango de medición; y por lo tanto el valor máximo posible para el atributo value; este valor debe ser más grande que el de el atributo min; si no se especifica el valor máximo será uno.
  • low: Representa el límite superior de la parte baja del rango de medición. Esta debe ser mayor que el atributo min, pero menor que high y max (si se especifica). Si no se especifica, o si es menor que el valor mínimo, el bajo valor es igual al valor min.
  • high: Representa el límite inferior de la parte alta del rango de medición. Esto debe ser menor que el atributo max, pero mayor que low y min (si se especifica). Si no se especifica, o si es mayor que el valor máximo, el alto valor es igual al valor max.
  • optimum: Este atributo indica el valor óptimo o el mejor valor; el cual debe estar en el rango definido por los atributo low y min. Cuando son usados los atributos low y high, estos indican la zona preferida por el rango dado. Por ejemplo:

     

    • min <= optimum <= low; si el valor óptimo está en este rango (entre min y low) entonces el rango inferior se considera preferido.
    • high <= optimum <= max; si el valor óptimo está en este rango (entre high y max) entonces el rango superior se considera preferido.

Reglas en general para el uso del elemento meter

  • Todos los atributos mencionados anteriormente pueden ser números punto flotantes.
  • Segun las definiciones de cada atributo, las siguientes expresiones son verdaderas:
    • min <= value <= max.
    • min <= low <= high <= max (Sí low/hight es especificado).
    • min <= optimum <= max (Si optimum es especificado).

No debemos utilizar la etiqueta (tag) meter para

  • Indicar el estado de un progreso o tarea; para eso está la etiqueta progress.
  • Representar valores en donde el valor sea arbitrario o no pueda ser acotado.

Estilos de la etiqueta (tag) meter

Al igual que otros elementos, podemos definir atributos como width, height, display etc. Para variar el tamaño o comportamiento del elemento (tag) meter; sin embargo existen pseudo clases específicas para el elemento meter:

Pseudo clasesDescripción
-webkit-meter-barDefine un color para el tag meter.
-webkit-meter-optimum-valueDefine un color para el tag meter cuando el medidor está dentro del rango low-high (low <= value <= high). El color por defecto es verde.
-webkit-meter-suboptimum-valueDefine un color para el tag meter cuando el medidor está fuera del rango low-high (low > value o value > high). El color por defecto es amarillo.

Ejemplos prácticos del uso de <meter> (caso real y usos comunes)

Ejemplo 1

Este ejemplo muestra algunos de los atributos presentados anteriormente: value, max y min.

Además de esto, usaremos un script para variar el valor del tag meter en un tiempo determinado y apreciar su comportamiento en el tiempo.

Value: 80

Para ver el código completo del experimento, has clic aquí.

Ejemplo 2

Este ejemplo muestra todos los atributos presentados anteriormente: value, max, min, low y high; además, todos ellos presentan uno de las pseudo clases ya definidas y explicadas en la sección de arriba.

Con ayuda del script anterior, veremos como:

  • Cambiar el color del medidor:

        #meter2::-webkit-meter-bar {
            background:blue;
        }
    


    Value: 80

  • Cambiar el color del medidor cuando el medidor esta en el rango low <= optimum <= high:

        #meter2::-webkit-meter-bar {
            background:blue;
        }    


    Value: 80

  • Cambiar el color cuando esta de este rango; es decir; low <= optimum <= high:

        #meter2::-webkit-meter-bar {
            background:blue;
        }     


    Value: 80

Para ver el código completo del experimento, has clic aquí.

Ejemplo 3

También podemos aplicarle un gradiente, en vez de un color solido:

    #meter5 {
        width:60%;
        height:60px;
    }
    #meter5::-webkit-meter-bar {
        background: -webkit-gradient(linear, left top, left bottom, from(#FFF), to(#FFF), color-stop(0.20, #eee), color-stop(0.45, #eee), color-stop(0.55, #ccc));
        border-radius:5px;
    }
    #meter5::-webkit-meter-optimum-value {
        background: -webkit-gradient(linear, left top, left bottom, from(#FFF), to(#FFF), color-stop(0.20, #cea), color-stop(0.45, #7a3), color-stop(0.55, #7a3));
        border-radius:5px;
    }

    #meter5::-webkit-meter-suboptimum-value {
        background: -webkit-gradient(linear, left top, left bottom, from(#FFF), to(#FFF), color-stop(0.20, #ffc), color-stop(0.45, #db3), color-stop(0.55, #db3));
        border-radius:5px;
    }

Value: 80

Para ver el código completo del experimento, has clic aquí.

Ejemplo básico

<label>Nivel:</label>
<meter value="50" min="0" max="100"></meter>

Ejemplo simulando progreso de tareas (basado en mi experiencia)

Una vez tuve que mostrar cuánto llevaba un usuario completando una tarea. Aunque al principio usé <meter>, terminé cambiándolo por <progress>. Aquí te muestro cómo habría quedado con <meter> si el rango fuese conocido:

<label>Progreso de la tarea</label>
<meter id="m1" value="30" min="0" max="100"></meter>

Y para actualizarlo dinámicamente:

let m = document.getElementById("m1");
let v = 0;
setInterval(() => {
 if(v <= 100) {
   m.value = v;
   v++;
 }
}, 100);

Ejemplo con rangos y estados

<label>Nivel de temperatura</label>
<meter value="65" min="0" max="100" low="30" high="70" optimum="60"></meter>

Personalización y estilos: cómo cambiar el diseño del <meter>

Los navegadores basados en WebKit permiten personalizar con pseudoclases:

  • ::-webkit-meter-bar
  • ::-webkit-meter-optimum-value
  • ::-webkit-meter-suboptimum-value

Yo mismo tuve que modificar estos estilos cuando quise que mi medidor combinara con la paleta de colores del proyecto.

Pseudoclases CSS específicas

meter::-webkit-meter-optimum-value {
 background: green;
}
meter::-webkit-meter-suboptimum-value {
 background: yellow;
}
meter::-webkit-meter-even-less-good-value {
 background: red;
}

Estilos avanzados con gradientes:

meter::-webkit-meter-bar {
 background: linear-gradient(to bottom, #fff, #ccc);
}

Accesibilidad del elemento <meter> en HTML5

Para que un <meter> sea accesible:

  • Usa siempre label asociado
  • Agrega texto alternativo si el significado no es obvio
  • Considera usar aria-valuenow, aria-valuemin, aria-valuemax cuando personalices demasiado el estilo

Errores comunes y buenas prácticas al usar <meter>

  • ❌ Error: Usarlo para progreso indefinido
    • (Justo lo que me pasó la primera vez.)
  • ❌ Error: No definir min y max
    • Hace que el componente pierda semántica.
  • ❌ Error: Valores fuera de rango
    • Algunos navegadores ignoran el medidor.
  • ✔ Buena práctica: Mostrar contexto textual
    • Ejemplo: “65% (temperatura alta)”.

Preguntas frecuentes sobre el elemento <meter>

  • ❓ ¿Puedo usar <meter> para progreso de tareas?
    • Solo si conoces el valor final. Si no, usa <progress>.
  • ❓ ¿Puedo cambiar el color del <meter>?
    • Sí, pero solo con pseudoclases específicas en WebKit.
  • ❓ ¿Qué pasa si no defino min o max?
    • Los valores por defecto serán 0 y 1.

Conclusión

El elemento <meter> es potente, semántico y muy útil cuando necesitas mostrar valores dentro de un rango. Entender sus atributos y estados visuales no solo mejora la accesibilidad, sino que te permite construir interfaces más claras. Y como comprobé cuando intenté mostrar progreso de una tarea, elegir correctamente entre <meter> y <progress> marca la diferencia entre una interfaz correcta y una engañosa.

Acepto recibir anuncios de interes sobre este Blog.

Aprende a dominar el elemento de HTML5. Descubre cuándo usarlo para mostrar valores en un rango acotado (ej. niveles de batería, temperaturas) y por qué NO debes usarlo para progreso de tareas. Guía completa con atributos, sintaxis, ejemplos prácticos, estilos CSS y consejos de accesibilidad.

| 👤 Andrés Cruz

🇺🇸 In english