Ich weiß, dass immer nach vertikaler Ausrichtung gefragt wird, aber ich scheine keine Lösung für dieses spezielle Beispiel zu finden. Ich möchte, dass der Text innerhalb des Elements zentriert wird, nicht das Element selbst zentriert:
HTML:
<ul>
<li><a href="">I would like this text centered vertically</a></li>
</ul>
CSS:
li a {
width: 300px;
height: 100px;
margin: auto 0;
display: block;
background: red;
}
li a {
width: 300px;
height: 100px;
margin: auto 0;
display: block;
background: red;
}
<ul>
<li><a href="">I would like this text centered vertically</a></li>
</ul>
Gibt es dafür wirklich keine CSS3-Eigenschaft? Ich wäre bereit, einen <span>
hinzuzufügen, aber ich möchte wirklich keine weiteren Markierungen hinzufügen.
Vielen Dank!
Entsprechend dem CSS Flexible Box Layout Module können Sie das a
-Element als flex-Container (siehe Abbildung) deklarieren und align-items
verwenden, um vertikal Text entlang der cross-Achse auszurichten (was senkrecht zur Hauptachse ist).
Das ist alles was Sie tun müssen
display: flex;
align-items: center;
Überlegungen zur Browserunterstützung
Chrome
display: -webkit-flex;
-webkit-align-items: center;
Firefox
Setzen Sie layout.css.flexbox.enabled
auf true
.
Alternativ können Sie noch verwenden
display: -moz-box;
-moz-box-align: center;
Wisse einfach, dass dies nicht css3-flexbox
ist und dass es nicht einwickelt.
DH
Kann jemand die IE -Syntax überprüfen und hier hinzufügen? Sie können die Syntax über Erweiterte Browserübergreifende Flexbox ausprobieren.
Siehe diese Geige (Denken Sie daran, layout.css.flexbox.enabled
auf true
zu setzen, wenn Sie mit FF arbeiten.)
Sie können es auch versuchen
a {
height:100px;
line-height:100px;
}
li a {
width: 300px;
height: 100px;
display: table-cell;
vertical-align: middle;
margin: auto 0;
background: red;
}
Sie können die Anzeige: Inline-Block und: After.Like versuchen.
<ul>
<li><a href="">I would like this text centered vertically</a></li>
</ul>
li a {
width: 300px;
height: 100px;
margin: auto 0;
display: inline-block;
vertical-align: middle;
background: red;
}
li a:after {
content:"";
display: inline-block;
width: 1px solid transparent;
height: 100%;
vertical-align: middle;
}
Bitte sehen Sie sich die Demo an.
Wäre die Verwendung von Padding für Ihre Anforderungen in Ordnung ?: http://jsfiddle.net/sm8jy/ :
li {
background: red;
text-align:center;
}
li a {
padding: 4em 0;
display: block;
}
Hier ist die allgemeine Lösung, die nur CSS verwendet, mit zwei Varianten. Der erste zentriert vertikal in der aktuellen Zeile, der zweite zentriert sich innerhalb eines Blockelements.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<ul>
<li>
line one
</li>
<li>
<span style="display: inline-block; vertical-align: middle">line two dot one
<br />
line two dot two</span>
</li>
<li>
line three
</li>
</ul>
<div style="height: 200px; line-height: 200px; border-style: solid;">
<span style="display: inline-block; vertical-align: middle; line-height: normal;">line two dot one
<br />
line two dot two</span>
</div>
</body>
</html>
Soweit ich es verstehe, gilt Vertikal-Ausrichten nur für Inline-Block-Elemente, z. B. <img>
. Sie müssen das Anzeigeattribut eines Elements in Inline-Block ändern, damit es funktioniert. Im Beispiel wird die Zeilenhöhe erweitert, um sie an die Spannweite anzupassen. Wenn Sie ein enthaltendes Element wie <div>
verwenden möchten, setzen Sie das Zeilenhöhenattribut auf die Höhe. Achtung, Sie müssen die Zeilenhöhe angeben: normal für den enthaltenen <span>
, oder erbt vom enthaltenden Element.
Sie können auch inline-table
neben table-cell
verwenden, wenn Sie Ihre Objekte vertikal und horizontal zentrieren möchten. Nachfolgend ein Beispiel für die Verwendung dieser Anzeigeeigenschaften zum Erstellen eines Menüs:
.menu {
background-color: lightgrey;
height: 30px; /* calc(16px + 12px * 2) */
}
.menu-container {
margin: 0px;
padding: 0px;
padding-left: 10px;
padding-right: 10px;
height: 100%;
}
.menu-item {
list-style-type: none;
display: inline-table;
height: 100%;
}
.menu-item a {
display: table-cell;
vertical-align: middle;
padding-left: 2px;
padding-right: 2px;
text-decoration: none;
color: initial;
}
.text-upper {
text-transform: uppercase;
}
.text-bold {
font-weight: bold;
}
<header>
<nav class="menu">
<ul class="menu-container">
<li class="menu-item text-upper text-bold"><a href="javascript:;">StackOverflow</a></li>
<li class="menu-item"><a href="javascript:;">Getting started</a></li>
<li class="menu-item"><a href="javascript:;">Tags</a></li>
</ul>
</nav>
</header>
Es funktioniert, indem Sie display: inline-table;
auf alle <li>
setzen und dann display: table-cell;
und vertical-align: middle;
auf die Kinder <a>
anwenden. Dies gibt uns die Möglichkeit, <table>
-Tag zu verwenden, ohne es zu verwenden.
Diese Lösung ist nützlich, wenn Sie die Höhe Ihres Elements nicht kennen.
Die Kompatibilität ist sehr gut (relativ zu caniuse.com ), mit Internet Explorer> = 8.
mit Dank an Vlads Antwort für Inspiration; getestet und arbeitet an IE11, FF49, Opera40, Chrome53
li > a {
height: 100px;
width: 300px;
display: table-cell;
text-align: center; /* H align */
vertical-align: middle;
}
zentriert sich in alle Richtungen, auch mit Textumbruch, Zeilenumbrüchen, Bildern usw.
Ich wurde schick und machte einen Ausschnitt
li > a {
height: 100px;
width: 300px;
display: table-cell;
/*H align*/
text-align: center;
/*V align*/
vertical-align: middle;
}
a.thin {
width: 40px;
}
a.break {
/*force text wrap, otherwise `width` is treated as `min-width` when encountering a long Word*/
Word-break: break-all;
}
/*more css so you can see this easier*/
li {
display: inline-block;
}
li > a {
padding: 10px;
margin: 30px;
background: aliceblue;
}
li > a:hover {
padding: 10px;
margin: 30px;
background: aqua;
}
<li><a href="">My menu item</a>
</li>
<li><a href="">My menu <br> break item</a>
</li>
<li><a href="">My menu item that is really long and unweildly</a>
</li>
<li><a href="" class="thin">Good<br>Menu<br>Item</a>
</li>
<li><a href="" class="thin">Fantastically Menu Item</a>
</li>
<li><a href="" class="thin break">Fantastically Menu Item</a>
</li>
<br>
note: if using "break-all" need to also use "<br>" or suffer the consequences