Si prega di verificare questa semplice soluzione senza markup ulteriore:
.vertically-centered {
border: 1px solid red;
height: 6rem;
overflow: hidden;
font-weight: bold;
font-size: 2.5rem;
text-overflow: ellipsis;
width: 300px;
line-height: 1.2;
display: flex; /* enables centering for modern non-webkit browsers */
flex-direction: column;
justify-content: space-around; /* centers for modern non-webkit browsers */
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
-webkit-box-pack: center; /* centers in -webkit-box automagically! */
}
<div class="vertically-centered">vertically centered with</div>
<div class="vertically-centered">vertically centered with hello</div>
<div class="vertically-centered">one line</div>
È anche possibile vedere questa soluzione in azione nel
edited CodePen example.
Come funziona: il tuo codice originale sta già utilizzando il layout Flexbox per i browser basati su WebKit (in realtà, è datato 2009 sintassi del Flexbox, ma, purtroppo, -webkit-line-clamp
non funziona con le nuove implementazioni). Flexbox ha il suo meccanismo per il centraggio verticale. Tutto ciò che serve per ottenere il comportamento desiderato in browser basati su WebKit è quello di rimuovere lo pseudo-elemento :after
e aggiungere invece la seguente riga di codice per .vertically-centered
:
-webkit-box-pack: center;
Per gli altri browser moderni come Firefox e 22+ IE11 +, è possibile lo stesso layout (tranne i puntini di sospensione, ma lei ha detto che è OK) si ottiene utilizzando la nuova versione di Flexbox:
display: flex;
flex-direction: column;
justify-content: space-around;
Questo deve essere posto al di sopra display: -webkit-box
nel codice, in modo da WebKit dei browser essere ancora in grado di applicare -webkit-line-clamp
.
Si può anche farlo funzionare in IE10, aggiungendo la sua versione prefissato di Flexbox (2011 sintassi di transizione):
display: -ms-flexbox;
-ms-flex-direction: column;
-ms-flex-pack: center;
La penna con supporto IE10 è qui: http://codepen.io/anon/pen/otHdm
L'approccio centratura verticale :after
non ha funzionato per te nella prima 'cella' per il seguente motivo: per le finestre CSS di livello ilnine (come il solito testo, blocchi incorporati, immagini ecc.) vertical-align
regola le linee di base di tutte le caselle di questo tipo che formano una casella di riga (vedi CSS2.1 spec). L'altezza del riquadrato di riga viene calcolata in modo tale che tutte le caselle a livello in linea della linea si adattino a esso, pertanto l'altezza della casella di riga non può essere inferiore all'altezza del riquadro di livello inline più alto. Così il vostro :after
blocco in linea, che ottiene il 100% della altezza del contenitore, diventa l'elemento più alto del ultima linea del blocco, ed a causa di vertical-align: middle
linea di base del testo in quella ultima linea viene spostata per incontrare il verticale metà del testo con la parte centrale di questo blocco in linea alto. Questo è OK quando c'è solo una calce (è il tipico caso d'uso per tale centraggio) e quando l'ultima riga è nascosta con overflow
, ma non OK quando è visibile).
posso cambiare struttura? o applicare solo questa struttura? –
Puoi cambiarlo. – Tim