Texto de alineación vertical CSS dentro de li

100

Estoy mostrando un número de cuadros en una fila con altura y ancho fijos, generados a partir de etiquetas <li>. ahora necesito alinear el texto en el centro vertical. La alineación vertical de CSS no tiene impacto, ¿tal vez me falta algo?

No estoy buscando trucos de uso (margen, relleno, altura de línea), estos no funcionarán porque algunos textos son largos y se dividirán en dos líneas.

Encuentre el código real:

Código CSS

ul.catBlock{
  width:960px; 
  height: 270px; 
  border:1px solid #ccc; 
}

ul.catBlock li{
  list-style: none; 
  float:left; 
  display:block; 
  text-align: center; 
  width:160px; 
  height: 100px;
}

ul.catBlock li a{ 
  display: block;  
  padding: 30px 10px 5px 10px; 
  height:60px;
}

Código HTML

<ul class="catBlock">
 <li><a href="#">IP Phone</a></li>
 <li><a href="#">Dual SIM Switch Server</a></li>
 <li><a href="#">IP PBX</a></li>
</ul>
AK4668
fuente
2
es posible que deba proporcionar más información. ¿Son las cajas de la misma altura? ¿Está alineando el texto dentro de los cuadros en el li? "porque algunos textos son largos ... dos líneas" ??? Puede ser una captura de pantalla o un violín ayudaría.
KMC
1
Intenté publicar una captura de pantalla, pero no me lo permite, ya que mi cuenta es nueva.
AK4668

Respuestas:

100

Defina el padre con display: tabley el elemento mismo con vertical-align: middley display: table-cell.

Asaf Chertkoff
fuente
4
+1 para usar la tabla de visualización / celda de tabla. Parece que no mucha gente es consciente de su existencia.
powerbuoy
5
Esto es de W3CSchool ... Nota: Los valores "inline-table", "run-in", "table", "table-caption", "table-cell", "table-column", "table-column- group "," table-row "," table-row-group "y" heredar "no son compatibles con IE7 y versiones anteriores. IE8 requiere un! DOCTYPE. IE9 admite los valores.
AK4668
20
esta solución apesta ya que apaga completamente cualquier efecto de margen. La única solución a esto es hacer toneladas de pseudo elementos. ¿Por qué css apesta tanto?
Muhammad Umer
¿Qué hay de <li>entrar en una sola fila?
polkovnikov.ph
1
Además, esto no es compatible con la accesibilidad CATO si, de hecho, NO muestra datos tabulares.
Stevo Perisic
59

line-heightes cómo alinea verticalmente el texto. Es bastante estándar y no lo considero un "truco". Solo agregue line-height: 100pxa su ul.catBlock liy estará bien.

En este caso, es posible que deba agregarlo, ul.catBlock li aya que todo el texto dentro de litambién está dentro de un a. He visto que suceden algunas cosas raras cuando haces esto, así que prueba ambos y mira cuál funciona.

Logan Serman
fuente
21
Inicialmente usé la altura de línea, pero cuando el contenido es largo, se dividirá en 2 líneas y, digamos, un espacio de 100 píxeles en cada línea y hará que se vea peor. ¿Hay alguna otra manera?
AK4668
2
Creo que hay una manera de tenerlo vertical-align: middlesi es así display: table-cell. Aunque nunca lo he usado. Eche un vistazo aquí: phrogz.net/css/vertical-align/index.html
Logan Serman
Gran solución: configuré la 'altura de línea' de li para que sea la misma que mi altura mínima, y ​​el texto está alineado verticalmente, al menos lo suficientemente cerca para una inspección visual. La solución de 'tabla' anterior ciertamente no es semántica y es de naturaleza pirateada. Cada vez que hacemos eso, aumentamos las posibilidades de que se produzcan pantallas rotas o comportamientos extraños en algún lugar del panorama receptivo.
CodeFinity
¡Gracias! ¡Funciona muy bien en el elemento <a>! ¡Qué solución tan simple :-) Simplemente ajústelo para corregir el valor y se centra verticalmente perfecto!
Abierto el
45

Sin importar cuán tarde sea esta respuesta, cualquiera que se encuentre con esto puede querer probar

li {
    display: flex;
    flex-direction: row;
    align-items: center;
}

La compatibilidad del navegador con flexbox es mucho mejor de lo que era cuando @scottjoudry publicó su respuesta anterior, pero es posible que desee considerar el uso de prefijos u otras opciones si está tratando de admitir navegadores mucho más antiguos. caniuse: flexión

as de la aviación
fuente
Esto no funciona bien list-style-imageen Chrome - la imagen desaparece
Benjineer
1
Utilicé esto en el elemento de navegación bootstrap 4 y funcionó perfectamente. Gracias.
010110110101
caja flexible salvando en vivo como siempre
Arthur Medeiros
16

Sorprendentemente (o no), la vertical-alignherramienta funciona mejor para este trabajo. Lo mejor de todo es que no se requiere Javascript.

En el siguiente ejemplo, coloco la outerclase en el medio del cuerpo y la innerclase en el medio de la outerclase.

Vista previa: http://jsfiddle.net/tLkSV/513/

HTML:

<div id="container">
    <span></span><div class="outer">
        <span></span><div class="inner">

        </div>
    </div>
</div>

CSS:

html, body {
    height: 100%;
    margin: 0;
    padding: 0; }
#container {
    text-align: center;
    height: 100%; }
span { 
    height: 100%;
    vertical-align: middle;
    display: inline-block; }
.outer {
    width: 100px;
    height: 200px;
    padding: 0;
    border: 1px solid #000;
    vertical-align: middle;
    display: inline-block; }
.inner {
    background: red;
    width: 30px;
    height: 20px;    
    vertical-align: middle;
    display: inline-block; }

La alineación vertical funciona alineando los centros de los elementos que están uno al lado del otro. La aplicación de alineación vertical a un solo elemento no hace absolutamente nada. Si agrega un segundo elemento que no tiene ancho pero es la altura del contenedor, su único elemento se moverá al centro verticalmente con este elemento sin ancho, lo que lo centrará verticalmente. Los únicos requisitos son que establezca ambos elementos en línea (o bloque en línea) y establezca su atributo de alineación vertical en vertical-align: middle.

Nota: Puede notar en mi código a continuación que mi <span>etiqueta y mi <div>etiqueta se tocan. Debido a que ambos son elementos en línea, un espacio en realidad agregará un espacio entre el elemento sin ancho y su div, así que asegúrese de omitirlo.

Wex
fuente
1
Fantástico, tiene sentido. // No puedo votar tu respuesta ahora porque mi reputación mínima debería ser 15.
AK4668
1
Para aquellos de ustedes que buscan esta técnica aplicada directamente a la pregunta - jsfiddle.net/utGVt/385
Wex
15

En el futuro, este problema será resuelto por flexbox. En este momento, el soporte del navegador es pésimo, pero es compatible de una forma u otra en todos los navegadores actuales.

Soporte del navegador: http://caniuse.com/flexbox

.vertically_aligned {

    /* older webkit */
    display: -webkit-box;
    -webkit-box-align: center;
    -webkit-justify-content: center;

    /* older firefox */
    display: -moz-box;
    -moz-box-align: center;
    -moz-box-pack: center;

    /* IE10*/
    display: -ms-flexbox;
    -ms-flex-align: center;
    -ms-flex-pack: center;

    /* newer webkit */
    display: -webkit-flex;
    -webkit-align-items: center;
    -webkit-box-pack: center;

    /* Standard Form - IE 11+, FF 22+, Chrome 29+, Opera 17+ */
    display: flex;
    align-items: center;
    justify-content: center;
}

Antecedentes de Flexbox: http://css-tricks.com/snippets/css/a-guide-to-flexbox/

Scott Joudry
fuente
1
En el momento en que se hizo esta pregunta, no estoy seguro de que hubiera sido una buena respuesta, pero hoy estamos viendo un soporte prefijado de ~ 95%, por lo que ciertamente creo que esta es una opción viable.
Wex
Si desea que los elementos <li> se envuelvan (en lugar de reducirse), agregue flex-wrap: wrap; a nivel <ul>
Thierry
¿Qué elemento agrego también a esta clase?
Matt M.
6

No se proporcionan respuestas perfectas aquí, excepto la respuesta de Asaf, que no proporciona ningún código ni ejemplo, por lo que me gustaría contribuir con la mía ...

Para que vertical-align: middle;funcione, debe usar display: table;para su ulelemento y display: table-cell;para lielementos y lo que puede usar vertical-align: middle;para lielementos.

No es necesario proporcionar ninguna explícita margins, paddingspara que su texto verticalmente medio.

Manifestación

ul.catBlock{
    display: table;
    width:960px; 
    height: 270px; 
    border:1px solid #ccc; 
}

ul.catBlock li {
    list-style: none;
    display: table-cell; 
    text-align: center; 
    width:160px; 
    vertical-align: middle;
}

ul.catBlock li a { 
    display: block;
}
Sr. Alien
fuente
Esto no ayuda, ya que la única razón por la que se alineó verticalmente es porque lo forzó hacia abajo con relleno en la etiqueta a
str11
@ Mr. Alien, reiteraré que el único problema con esta solución es que se ignoran las reglas de margen.
Thomas
4

Como se explica aquí: https://css-tricks.com/centering-in-the-unknown/ .

Como se probó en la práctica real, la solución más confiable pero elegante es insertar un elemento en línea de asistencia en el <li />elemento como el primer hijo, cuya altura debe establecerse en el 100% (de la altura de su padre, el <li />), y su altura en el vertical-alignmedio. . Para lograr esto, puede poner a <span />, pero la forma más conveniente es usar li:afterpseudo class.

Captura de pantalla: ingrese la descripción de la imagen aquí

ul.menu-horizontal {
    list-style-type: none;
    margin: 0;
    padding: 0;
    display: inline-block;
    vertical-align: middle;
}

ul.menu-horizontal:after {
    content: '';
    clear: both;
    float: none;
    display: block;
}

ul.menu-horizontal li {
    padding: 5px 10px;
    box-sizing: border-box;
    height: 100%;
    cursor: pointer;
    display: inline-block;
    vertical-align: middle;
    float: left;
}

/* The magic happens here! */
ul.menu-horizontal li:before {
    content: '';
    display: inline;
    height: 100%;
    vertical-align: middle;
}
Jeff Tian
fuente
1

Prueba esta solución

Funciona mejor en la mayoría de los casos

es posible que tenga que usar div en lugar de li para eso

.DivParent {
    height: 100px;
    border: 1px solid lime;
    white-space: nowrap;
}
.verticallyAlignedDiv {
    display: inline-block;
    vertical-align: middle;
    white-space: normal;
}
.DivHelper {
    display: inline-block;
    vertical-align: middle;
    height:100%;
}
<div class="DivParent">
    <div class="verticallyAlignedDiv">
        <p>Isnt it good!</p>
     
    </div><div class="DivHelper"></div>
</div>

keshav
fuente
1
¿Por qué esto necesita un divHelper para alinear verticalmente? Lo vi en otro tema, pero no puedo entender por qué no se alinea sin otro div ..
Sasha Chirico
0

Solución simple para alineación vertical en el medio ... para mí funciona como un encanto

ul{display:table; text-align:center; margin:0 auto;}
li{display:inline-block; text-align:center;}
li.items_inside_li{display:inline-block; vertical-align:middle;}
Fahad Ali
fuente