2013-02-28 10 views
52

Ich habe folgende HTML: Vertically Mitte gedreht Text mit CSS

<div class="outer"> 
    <div class="inner rotate">Centered?</div> 
</div> 

div.outer ist ein schmaler vertikalen Streifen. div.inner ist um 90 Grad gedreht. Ich hätte gerne den Text "Zentriert?" in seinem Container div erscheinen. Ich kenne die Größe von Div im Voraus nicht.

Dies kommt in der Nähe: http://jsfiddle.net/CCMyf/2/. Sie können von der jfiddle sehen, dass der Text vertikal zentriert ist, bevor der transform: rotate(-90deg) Stil angewendet wird, aber nach etwas versetzt ist. Dies ist besonders auffällig, wenn div.outer kurz ist.

Ist es möglich, diesen Text vertikal zu zentrieren, ohne eine der Größen im Voraus zu kennen? Ich habe keine Werte von transform-origin gefunden, die dieses Problem lösen.

+0

Sind Sie entgegengesetzt Einstellung 'Anzeige: table' auf den Elementen? Da die "normale" Möglichkeit, dynamische divs vertikal auszurichten, ohne Probleme mit der Umwandlung funktionieren sollte: http://stackoverflow.com/a/6182661/188221 – DigTheDoug

+0

Ich bin nicht gegen '' 'display: table'''. Diese Geige zeigt, dass die Tabellenlösung die gleichen Probleme wie die obige hat: http://jsfiddle.net/4d384/ – danvk

+0

Versuchen Sie, die 'rotate' Klasse auf das mittlere Element zu setzen. Das sollte es tun, aber es sieht so aus, als würde es die Breite des Gegenstandes vermasseln. Vielleicht muss man mit den Padding- oder Breiten- oder Höhenrequisiten herumspielen, aber es sollte machbar sein: http://jsfiddle.net/digthedoug/jWYuq/ – DigTheDoug

Antwort

89

Der Schlüssel ist Lage oben zu setzen und zu 50% belassen und dann transformX und transformY bis -50%.

.inner { 
    position: absolute; 
    top: 50%; 
    left: 50%; 
} 

.rotate { 
    transform: translateX(-50%) translateY(-50%) rotate(-90deg); 
} 

siehe: http://jsfiddle.net/CCMyf/79/

+4

Dies ist eine der besten Lösungen, die ich gesehen habe. Thx – grayson

+2

Es ist spät in der Nacht, ich weiß nicht, warum das funktioniert, aber in dem Moment, als ich CTRL-R gedrückt ... es ist selten, dass ich solche "es funktioniert einfach" Momente. Mein Kiefer fiel nicht im übertragenen Sinne! – TotoTitus

+1

Arbeiten mit Textelementen anstelle von divs Ich musste 'margin: 0' auf dem inneren Element hinzufügen, um das Textzentrum perfekt zu machen. – kapser

2

Können Sie margin: 0 auto; zu Ihrer "Rotate" -Klasse hinzufügen, um den Text zu zentrieren.

.rotate { 
    -webkit-transform: rotate(-90deg); 
    -ff-transform: rotate(-90deg); 
    transform: rotate(-90deg); 
    width: 16px; /* transform: rotate() does not rotate the bounding box. */ 
    margin: 0 auto; 
} 
+0

Dies funktioniert nicht. Hier ist die Geige, die mit "margin: 0 auto" aktualisiert wurde: http://jsfiddle.net/CCMyf/3/. Sie können sehen, dass das "?" in "Zentrieren?" ist viel näher an der Spitze als das "C" ist auf der Unterseite. – danvk

0

Entfernen: margin-top: -7px; aus .inner machte die vertikal gedreht Text für mich zentriert. Außerdem wurde der horizontale Text nicht zentriert.

Entfernen Sie einfach den obigen Code?

+0

Dies kann es näher an der Mitte machen, aber es ist immer noch nicht richtig zentriert. Das sieht man deutlich in dieser Version der Fiddle: http://jsfiddle.net/CCMyf/4/ – danvk

0

Sie könnten hinzufügen:

$('.inner').css('margin-top', $(this).parent().height() - 2*$(this).height()); 

Um Ihre .on('change') Funktion, wie Sie hier sehen können: http://jsfiddle.net/darkajax/hVhbp/

+0

Das funktioniert, obwohl ich eine CSS-Lösung sehr bevorzugen würde, wenn es möglich ist. – danvk

+0

Haben Sie eine CSS-Lösung gefunden? – Crashalot

5

Es kann für die Beantwortung dieser Frage ein bisschen spät, aber ich stolperte über das gleiche Thema und einen Weg gefunden, es zu erreichen, indem man ein weiteres div hinzufügt.

<div class="outer"> 
    <div class='middle'><span class="inner rotate">Centered?</span></div> 
</div> 

und text-align: center auf diesem mittleren Elemente Anwendung, zusammen mit einiger Positionierung Zeug:

.middle { 
    margin-left: -200px; 
    width: 400px; 
    text-align: center; 
    position: relative; 
    left: 7px; 
    top: 50%; 
    line-height: 37px; 
} 

Die .inner bekommt auch eine display: inline-block; beide rotate und text-align Eigenschaften zu ermöglichen.

Hier ist die entsprechende Geige: http://jsfiddle.net/CCMyf/47/

2

Die Antwort von ‚bjnsn‘ gut, aber nicht perfekt, wie es schlägt fehl, wenn der Text Leerzeichen enthält darin. Zum Beispiel hat er 'Zentriert?' als Text, aber wenn wir den Text änderten, um "Zentriert" annehmen zu lassen? oder nicht 'dann wird es nicht gut funktionieren und wird die nächste Zeile nach dem Platz nehmen. Für den inneren Div-Block ist keine Breite oder Höhe definiert.

.inner { 
    font-size: 13px; 
    font-color: #878787; 
    position: absolute; 
    top: 50%; 
    left: 50%; 
    background: #DDD; 
} 

https://jsfiddle.net/touqeer_shakeel/f1gfy1yy/ Aber wir können den ganzen Text zentrierte ausrichten richtig machen, indem die innere div Breite gleich Höhe der äußeren div Einstellung, Zeilenhöhe der inneren div gleich die Breite der äußeren div und Einstellung die Eigenschaft display flex für das innere div mit align-items: center und justify-content: center-Eigenschaften.

.inner { 
    font-size: 13px; 
    font-color: #878787; 
    position: absolute; 
    top: 50%; 
    left: 50%; 
    display: flex; 
    justify-content:center; 
    align-items:center; 
    line-height:40px; 
} 
$('#height').on('change', function(e) { 
    $('.outer').css('height', $('#height').val() + 'px'); 
    $('.inner').css('width', $('#height').val() + 'px'); 
}); 

aktualisiert Geige https://jsfiddle.net/touqeer_shakeel/cjL21of5/