Tutorial WordPress: Añadir líneas verticales entre elementos del menú con CSS

·

·

Introducción

Este tutorial explica, con todo lujo de detalles, cómo añadir líneas verticales entre los elementos del menú en WordPress usando únicamente CSS, con casos prácticos para diferentes estructuras de tema, compatibilidad RTL, responsive y accesibilidad. Se muestran varias técnicas —bordes, pseudo-elementos y reglas específicas para WordPress— y fragmentos de código listos para pegar en el CSS adicional del tema o en el fichero style.css del child theme.

Conceptos básicos y consideraciones

Método 1 — Usando bordes (fácil)

Este método es el más directo: aplicar un border-left o border-right a cada elemento excepto al primero o al último. Funciona bien si tus elementos tienen altura uniforme y padding lateral consistente.

Ejemplo CSS básico

/ Selector genérico, adapta .main-navigation .menu a tu tema /
.main-navigation .menu > li {
  display: inline-block / o inline-flex según diseño /
  padding: 0 18px       / espacio alrededor del enlace /
}

/ Añade una línea a la izquierda de cada elemento excepto el primero /
.main-navigation .menu > li:not(:first-child) {
  border-left: 1px solid #d0d0d0
}

/ Opcional: separar visualmente el enlace del borde /
.main-navigation .menu > li > a {
  display: inline-block
  padding-left: 12px / empuja el texto lejos del borde /
  padding-right: 12px
  color: #222
  text-decoration: none
}

Ventajas y limitaciones

Método 2 — Usando pseudo-elementos (::before o ::after) (más control)

Los pseudo-elementos permiten colocar la línea en una posición concreta, controlar su altura, centrarla verticalmente y animarla en hover. Es la opción recomendada si quieres control visual total.

Ejemplo CSS con ::before y centrado vertical

/ Usar flex para que los elementos queden en una línea y sean centrables /
.main-navigation .menu {
  display: flex
  align-items: center
  list-style: none
  margin: 0
  padding: 0
}

/ Cada li actúa como contenedor relativo /
.main-navigation .menu > li {
  position: relative
  padding: 0 14px
}

/ Crea la línea únicamente en los elementos que no son el primero /
.main-navigation .menu > li   li::before {
  content: 
  position: absolute
  left: 0                 / en el borde izquierdo del li /
  top: 50%
  transform: translateY(-50%)
  width: 1px
  height: 60%             / controla la longitud de la línea /
  background: #c8c8c8
}

/ Si quieres que la línea cambie de color al pasar el ratón por el enlace adyacente /
.main-navigation .menu > li   li:hover::before,
.main-navigation .menu > li   li:focus-within::before {
  background: #333
}

Notas prácticas

WordPress: selectores comunes y dónde colocar el CSS

Los temas usan diferentes nombres de clase. Aquí algunos selectores habituales que puedes adaptar:

Coloca el CSS en Personalizar → CSS adicional o en el archivo style.css de un child theme para que no se pierdan las modificaciones con las actualizaciones del tema.

Método 3 — Excluir separadores en submenús y menús desplegables

Si tu menú tiene submenús (dropdowns), normalmente quieres remover las líneas dentro de esos niveles o tratarlas distinto.

Ejemplo: desactivar separadores en submenús

/  Asume estructura ul.menu ul (submenú) /
.main-navigation .menu ul li   li::before,
.main-navigation .menu ul li:not(:first-child) {
  border: none
  background: transparent
}

/ O más específico: solo aplicar separadores en el primer nivel /
.main-navigation .menu > li   li::before {
  content: 
  position: absolute
  left: 0
  top: 50%
  transform: translateY(-50%)
  width: 1px
  height: 60%
  background: #bbb
}

Compatibilidad RTL (idiomas de derecha a izquierda)

En entornos RTL (árabe, hebreo) la dirección del separador debe invertirse: usar border-right o posicionar pseudo-elementos a la derecha. Detectarlo puede hacerse por el atributo dir en el HTML.

Ejemplos RTL y LTR

/  LTR por defecto /
html[dir=ltr] .main-navigation .menu > li   li::before {
  left: 0
  right: auto
}

/ RTL: coloca la línea a la derecha del elemento /
html[dir=rtl] .main-navigation .menu > li   li::before {
  right: 0
  left: auto
}

Responsive: ocultar separadores en pantallas pequeñas

En móviles los elementos suelen apilarse y las líneas verticales quedan fuera de lugar. Lo normal es ocultarlas con media queries.

Ejemplo: desactivar separadores a menos de 768px

@media (max-width: 767px) {
  .main-navigation .menu > li   li::before {
    display: none
  }
}

Accesibilidad y buenas prácticas

Cómo añadir una clase a los elementos del menú desde functions.php (opcional)

Si prefieres controlar con clases en lugar de selectores CSS complejos, puedes añadir una clase a cada item mediante un filtro. El siguiente fragmento añade la clase menu-has-sep a los elementos de primer nivel.

Luego en CSS puedes apuntar a .main-navigation .menu > li.menu-has-sep .menu-has-sep::before o sencillamente a .main-navigation .menu > li li::before si no necesitas la clase.

Problemas comunes y soluciones rápidas

  1. La línea aparece dentro del dropdown: asegúrate de limitar el selector al primer nivel (usar > li o :not(.sub-menu) según la estructura).
  2. La línea no se centra verticalmente: comprueba que el li tiene altura establecida o usa top:50% con transform: translateY(-50%).
  3. Separador ocupa toda la altura del li: reduce la propiedad height del pseudo-elemento a un porcentaje o valor fijo.
  4. En dispositivos móviles los items quedan apilados con líneas entre ellos: ocultar los separadores con media queries.
  5. El tema usa display:block en enlaces de menú: adapta el posicionamiento (usar padding en el y position:relative en el li).

Ejemplo avanzado: línea animada que aparece en hover

/  Línea por defecto transparente /
.main-navigation .menu > li   li::before {
  content: 
  position: absolute
  left: 0
  top: 50%
  transform: translateY(-50%)
  width: 2px
  height: 0                 / inicialmente invisible /
  background: #0073aa
  transition: height 180ms ease, opacity 180ms ease
  opacity: 0
}

/ Al pasar sobre el li adyacente, la línea crece /
.main-navigation .menu > li   li:hover::before,
.main-navigation .menu > li   li:focus-within::before {
  height: 70%
  opacity: 1
}

Resumen práctico

Las mejores prácticas recomendadas son:

  • Usar pseudo-elementos (::before/::after) para separar apariencia y contenido.
  • Aplicar selectores de nivel (>) para no afectar submenús.
  • Controlar la visibilidad en pantallas pequeñas con media queries.
  • Asegurar compatibilidad RTL usando html[dir=rtl] para invertir la posición.
  • Probar con teclado y lectores de pantalla para garantizar accesibilidad.

Ejemplo final compacto (listo para copiar)

/ Ejemplo compacto y genérico: ajusta .main-navigation .menu según tu tema /
.main-navigation .menu {
  display: flex
  align-items: center
  list-style: none
  margin: 0
  padding: 0
}

.main-navigation .menu > li {
  position: relative
  padding: 0 16px
}

/ Línea entre items (primer nivel) /
.main-navigation .menu > li   li::before {
  content: 
  position: absolute
  left: 0
  top: 50%
  transform: translateY(-50%)
  width: 1px
  height: 60%
  background: rgba(0,0,0,0.12)
}

/ Ocultar en móviles /
@media (max-width: 767px) {
  .main-navigation .menu > li   li::before {
    display: none
  }
}

/ RTL /
html[dir=rtl] .main-navigation .menu > li   li::before {
  right: 0
  left: auto
}

Con estos métodos puedes lograr líneas verticales elegantes y bien integradas en casi cualquier tema de WordPress. Ajusta tamaños, colores y selectores al marcado concreto de tu plantilla para obtener el mejor resultado visual y de accesibilidad.



Leave a Reply

Your email address will not be published. Required fields are marked *