Jak wyrównać tekst pionowo w div?

1183

Próbuję znaleźć najbardziej skuteczny sposób wyrównania tekstu do div. Próbowałem kilku rzeczy i żadna z nich nie działa.

.testimonialText {
  position: absolute;
  left: 15px;
  top: 15px;
  width: 150px;
  height: 309px;
  vertical-align: middle;
  text-align: center;
  font-family: Georgia, "Times New Roman", Times, serif;
  font-style: italic;
  padding: 1em 0 1em 0;
}
<div class="testimonialText">
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
  in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

shinjuo
źródło

Odpowiedzi:

782

Centrowanie pionowe w CSS
http://www.jakpsatweb.cz/css/css-vertical-center-solution.html

Podsumowanie artykułu:

W przeglądarce CSS 2 można użyć display:table/ display:table-celldo wyśrodkowania zawartości.

Próbka jest również dostępna w JSFiddle :

div { border:1px solid green;}
<div style="display: table; height: 400px; overflow: hidden;">
  <div style="display: table-cell; vertical-align: middle;">
    <div>
      everything is vertically centered in modern IE8+ and others.
    </div>
  </div>
</div>

Możliwe jest scalanie włamań do starych przeglądarek (Internet Explorer 6/7) w style za pomocą #ukrywania stylów przed nowszymi przeglądarkami:

div { border:1px solid green;}
<div style="display: table; height: 400px; #position: relative; overflow: hidden;">
  <div style=
    "#position: absolute; #top: 50%;display: table-cell; vertical-align: middle;">
    <div style=" #position: relative; #top: -50%">
      everything is vertically centered
    </div>
  </div>
</div>

Robert Harvey
źródło
3
Myślę, że pierwszy link jest lepszy, chociaż wygląda na skomplikowany, ponieważ drugi link używa tylko jednego wiersza tekstu lub obrazu, którego wysokość znasz. Co się stanie, jeśli masz 2 lub 3 wiersze tekstu lub nie znasz wysokości tekstu, ponieważ jest różny. Jak to działałoby z wysokością linii? Więc by podsumować. Testowałem pierwszą wersję i działa na IE, Firefox i CHROME.
Raul
953
Nie rozumiem, dlaczego powinniśmy obalać te rzeczy? To 21 wiek! dlaczego po prostu nie zawierają jednej przeklętej opcji wyrównywania przeklętego tekstu w pionie w css ... tak: centrowanie zawartości: zarówno pionowo, jak i poziomo. to po prostu niewiarygodne, że technologia stosowana od lat jest tak głupia.
Alexander.Iljushkin
34
@Flextra: Dlatego ludzie nadal używają tabel do układania siatki. Wyrównanie w pionie (lub cokolwiek innego z danymi wysokości i dynamicznymi) może być trudne z czystym CSS. Musisz być skłonny do wykonywania takich dziwnych hacków (w pewnym sensie pokonuje pomysł „oddzielania treści od układu”), lub skorzystaj z wieloprzebiegowego efektu renderowania i używaj niestatycznych tabel. Nigdy nie miałem skarg od użytkowników końcowych, tablemimo że rutynowo łamie serca fanów CSS. Większość z nich projektuje tylko proste blogi i strony statyczne. Niektórzy z nas tworzą oprogramowanie biznesowe i potrzebują gęstego wyświetlania danych, a nasi użytkownicy bardziej dbają o funkcjonalność.
nic nie jest potrzebne
6
Tak. Nie zrozum mnie źle, jeśli zbuduję „stronę”, korzystam z lean html i wolę czysty CSS, ale nie wiem, ile razy zmagałem się z ustawianiem rzeczy godzinami, kiedy tylko powiedziałem „F it” i użyłem table. Teraz jest lepiej, ale niektórzy z nas, którzy tworzą biznesowe aplikacje internetowe, muszą obsługiwać starsze przeglądarki (IE6 jest nadal używany u niektórych klientów!), Podczas gdy ludzie, którzy tworzą blogi, mogą żyć w chmurach i udawać, że każdy na świecie ma szybkie połączenie, nowy komputer i najnowsza wersja przeglądarki X z CSS 3 itd.
Przykład
61
To dość absurdalne, że stoły są obrzydzane, jako jakiś staroświecki hack, którego używałby tylko początkujący, a tutaj używamy „display: table-cell” w DIV jako znacznie trudniejszego obejścia.
Desty
743

Musisz dodać line-heightatrybut, a ten atrybut musi pasować do wysokości div. W Twoim przypadku:

.center {
  height: 309px;
  line-height: 309px; /* same as height! */
}
<div class="center">
  A single line.
</div>

W rzeczywistości prawdopodobnie można heightcałkowicie usunąć atrybut.

Działa to tylko w przypadku jednego wiersza tekstu , więc bądź ostrożny.

David
źródło
368
Uważam, że jest to poprawne tylko wtedy, gdy masz jeden wiersz tekstu w div.
WEFX,
49
Absolutnie, miałbyś szalone odstępy między wierszami w tekście, gdyby zawierał więcej niż 1 linię.
David
1
@BobChatting, tak. Zobacz moją odpowiedź na rozwiązanie, które pozwala na wiele wierszy tekstu.
Adam Tomat,
2
wysokość linii rozprzestrzenia się na każde dziecko
KVM
4
nie działa z procentem: wysokość: 100%; wysokość linii: 100%
albanx
474

Oto świetny zasób

Od http://howtocenterincss.com/ :

Centrowanie w CSS to ból w dupie. Wydaje się, że istnieje wiele sposobów, aby to zrobić, w zależności od różnych czynników. To konsoliduje je i daje kod potrzebny do każdej sytuacji.

Korzystanie z Flexbox

Oprócz utrzymywania tego postu na bieżąco z najnowszymi technologiami, oto o wiele łatwiejszy sposób na wyśrodkowanie czegoś za pomocą Flexboksa. Flexbox nie jest obsługiwany w Internet Explorerze 9 i starszych .

Oto kilka świetnych zasobów:

JSFiddle z prefiksami przeglądarki

li {
  display: flex;
  justify-content: center;
  align-content: center;
  flex-direction: column;
  /* Column | row */
}
<ul>
  <li>
    <p>Some Text</p>
  </li>
  <li>
    <p>A bit more text that goes on two lines</p>
  </li>
  <li>
    <p>Even more text that demonstrates how lines can span multiple lines</p>
  </li>
</ul>

Inne rozwiązanie

Pochodzi z zerosixthree i pozwala wyśrodkować wszystko za pomocą sześciu linii CSS

Ta metoda nie jest obsługiwana w przeglądarce Internet Explorer 8 i niższych .

jsfiddle

p {
  text-align: center;
  position: relative;
  top: 50%;
  -ms-transform: translateY(-50%);
  -webkit-transform: translateY(-50%);
  transform: translateY(-50%);
}
<ul>
  <li>
    <p>Some Text</p>
  </li>
  <li>
    <p>A bit more text that goes on two lines</p>
  </li>
  <li>
    <p>Even more text that demonstrates how lines can span multiple lines</p>
  </li>
</ul>

Poprzednia odpowiedź

Proste podejście do różnych przeglądarek, przydatne jako linki w zaznaczonej odpowiedzi są nieco nieaktualne.

Jak wyśrodkować tekst w pionie i poziomie zarówno na liście nieuporządkowanej, jak i div, bez uciekania się do wysokości linii JavaScript lub CSS . Bez względu na to, ile masz tekstu, nie będziesz musiał stosować żadnych specjalnych klas do określonych list lub div (kod jest taki sam dla każdej). Działa to we wszystkich głównych przeglądarkach, w tym Internet Explorer 9, Internet Explorer 8, Internet Explorer 7, Internet Explorer 6, Firefox, Chrome, Opera i Safari. Istnieją dwa specjalne arkusze stylów (jeden dla Internet Explorera 7 i drugi dla Internet Explorera 6), aby pomóc im ze względu na ograniczenia CSS, których nie mają współczesne przeglądarki.

Andy Howard - Jak wyśrodkować tekst w pionie i poziomie na nieuporządkowanej liście lub div

Ponieważ nie dbałem zbytnio o Internet Explorer 7/6 w ostatnim projekcie, nad którym pracowałem, użyłem nieco uproszczonej wersji (tj. Usunąłem rzeczy, które sprawiły, że działał w Internet Explorerze 7 i 6). Może być przydatny dla kogoś innego ...

JSFiddle

.outerContainer {
  display: table;
  width: 100px;
  /* Width of parent */
  height: 100px;
  /* Height of parent */
  overflow: hidden;
}

.outerContainer .innerContainer {
  display: table-cell;
  vertical-align: middle;
  width: 100%;
  margin: 0 auto;
  text-align: center;
}

li {
  background: #ddd;
  width: 100px;
  height: 100px;
}
<ul>
  <li>
    <div class="outerContainer">
      <div class="innerContainer">
        <div class="element">
          <p>
            <!-- Content -->
            Content
          </p>
        </div>
      </div>
    </div>
  </li>

  <li>
    <div class="outerContainer">
      <div class="innerContainer">
        <div class="element">
          <p>
            <!-- Content -->
            Content
          </p>
        </div>
      </div>
    </div>
  </li>
</ul>

Adam Tomat
źródło
2
Nie ma problemu. Nadal wolę używać, height: x; line-height: x;ale częściej nie potrzebuję wielu wierszy tekstu. Dlatego uwielbiam to rozwiązanie. Prosty, wielokrotnego użytku, w różnych przeglądarkach, bez js i wymaga tylko trochę dodatkowego znacznika.
Adam Tomat,
Jeśli tekst jest większy niż ramka, przepełni się. Próbowałem różnych sposobów, aby zapobiec przepełnieniu, ale wszystkie wydają się kolidować z wyświetlaniem tabeli i komórki tabeli. Gdy tylko ograniczę przelew, pionowe centrowanie przestaje działać. jsfiddle.net/2HHLE Jakieś pomysły?
Thomas David Baker
Aby odpowiedzieć na moje pytanie, jeśli umieścisz div (y) tabeli / komórki tabeli w innym divie o stałej szerokości / wysokości i przepełnieniu: ukryty, który załatwi sprawę. Napisałem to na bluebones.net/2013/03/…
Thomas David Baker,
2
@ThomasDavidBaker, innym rozwiązaniem, jeśli potrzebujesz, aby były dynamiczne, jest ustawienie wysokości 100%. Oto jsfiddle , w zasadzie tylko zmienił height: 100px;się height: 100%;zarówno dla lii .outerContainer.
Adam Tomat,
2
Nie chcę tu być wybieraczem nosa, ale w drugim rozwiązaniu od zerosixthree. W CSS znajduje się literówka: „- wekbit -transform: translateY (-50%);” Wciąż wielkie dzięki !! Świetne rozwiązanie!
Gnagy
186

To jest łatwe display: flex. Następująca metoda divspowoduje wyśrodkowanie tekstu w pionie:

div {
  display: -webkit-flex;
  display: flex;
  align-items: center;
  /* More style: */
  height: 300px;
  background-color: #888;
}
<div>
  Your text here.
</div>

A jeśli chcesz, poziome:

div {
  display: -webkit-flex;
  display: flex;
  align-items: center;
  justify-content: center;
  /* More style: */
  height: 300px;
  background-color: #888;
}
<div>
  Your text here.
</div>

Musisz zobaczyć potrzebną wersję przeglądarki; w starych wersjach kod nie działa.

Raul Fernandez Marques
źródło
Krótko i słodko ... tak powinno być robienie czegoś tak prostego. Działa na IE 11, Chrome i Firefox ... wystarczająco dobrze dla mnie
zrzut ekranu
Ta odpowiedź działa z pozycjonowaniem tekstu wewnątrz obcych obiektów w svg. Dzięki!
1
Wierzę: Flex jest lekarstwem na wszystko!
DenisKolodin
1
text-align: centerjest również konieczne, ponieważ długa szerokość wypełnienia tekstu zostanie wyrównana do lewej
DenisKolodin
Zawsze miałem z tym problem i absolutnie nie znoszę odpowiedzi na zwiększenie wysokości linii. To działało naprawdę dobrze.
Jed Lynch
109

Używam następujących elementów do łatwego centrowania elementów losowych w pionie:

HTML:

<div style="height: 200px">
    <div id="mytext">This is vertically aligned text within a div</div>
</div>

CSS:

#mytext {
    position: relative;
    top: 50%; 
    transform: translateY(-50%);
    -webkit-transform: translateY(-50%);
}

Spowoduje to wyśrodkowanie tekstu w moim divdo dokładnie pionowego środka zewnętrznej strony o wysokości 200 pikseli div. Pamiętaj, że może być konieczne użycie prefiksu przeglądarki (jak -webkit-w moim przypadku), aby działało to w przeglądarce.

Działa to nie tylko dla tekstu, ale także dla innych elementów.

Stefan van den Akker
źródło
3
Mam bardziej wiarygodne wyniki dzięki position: absolute;- Dzięki! Uwaga: możesz dołączyć -ms-transformlub IE wypisze coś innego
Wilf
Plunker sugeruje, aby umieścić -web-kit-transformwcześniej transform. Być może dodanie -ms-transformmoże rozwiązać problem @ ToniMichelCaubet.
sakovias
39

Możesz to zrobić, ustawiając wyświetlanie na „komórkę tabeli” i stosując vertical-align: middle;:

    {
        display: table-cell;
        vertical-align: middle;
    }

Nie jest to jednak obsługiwane przez wszystkie wersje programu Internet Explorer zgodnie z tym fragmentem, który skopiowałem z http://www.w3schools.com/cssref/pr_class_display.asp bez pozwolenia.

Uwaga: Wartości „inline-table”, „table”, „table-caption”, „table-cell”, „table-column”, „table-column-group”, „table-row”, „table-row” -group ”i„ dziedziczenie ”nie są obsługiwane przez program Internet Explorer 7 i wcześniejsze wersje. Internet Explorer 8 wymaga! DOCTYPE. Internet Explorer 9 obsługuje wartości.

Poniższa tabela pokazuje dozwolone wartości wyświetlania również z http://www.w3schools.com/cssref/pr_class_display.asp .

Wpisz opis zdjęcia tutaj

Shadrack B. Orina
źródło
2
Świetny pomysł! wyświetl: komórka tabeli ma inne efekty, ale jeśli się z nimi zgadzasz, to fajne rozwiązanie
Brian Low
Ważne jest również, aby dodać wysokość elementu.
Elan Perach
Niestety przepełnienie: ukryty nie działa na wyświetlaczu: komórka tabeli
TheJeff
32

Obecnie (nie potrzebujemy już Internet Explorera 6-7-8) po prostu użyłbym CSS display: tabledo tego problemu (lub display: flex).


W przypadku starszych przeglądarek:

Stół:

.vcenter {
    display: table;
    background: #eee; /* optional */
    width: 150px;
    height: 150px;
    text-align: center; /* optional */
}

.vcenter > :first-child {
    display: table-cell;
    vertical-align: middle;
}
<div class="vcenter">
  <p>This is my Text</p>
</div>

Zgiąć:

.vcenter {
    display: flex; /* <-- Here */
    align-items: center; /* <-- Here */
    justify-content: center; /* optional */
    height: 150px; /* <-- Here */
    background: #eee;  /* optional */
    width: 150px;
}
<div class="vcenter">
  <p>This is my text</p>
</div>


To (właściwie było) moje ulubione rozwiązanie tego problemu (prosta i bardzo dobrze obsługiwana przeglądarka):

div {
    margin: 5px;
    text-align: center;
    display: inline-block;
}

.vcenter {
    background: #eee;  /* optional */
    width: 150px;
    height: 150px;
}
.vcenter:before {
    content: " ";
    display: inline-block;
    height: 100%;
    vertical-align: middle;
    max-width: 0.001%; /* Just in case the text wrapps, you shouldn't notice it */
}

.vcenter > :first-child {
    display: inline-block;
    vertical-align: middle;
    max-width: 99.999%;
}
<div class="vcenter">
  <p>This is my text</p>
</div>
<div class="vcenter">
  <h4>This is my Text<br/>Text<br/>Text</h4>
</div>
<div class="vcenter">
  <div>
   <p>This is my</p>
   <p>Text</p>
  </div>
</div>

Toni Michel Caubet
źródło
2
@Imray w zasadzie dodaje element tekstowy o szerokości 0px obok tekstu (pseudo: przed). Jednak ten sztuczny blok ma 100% wysokości, co jest sztuczką. Ponieważ blok i tekst są wyrównane w pionie, jest renderowany zgodnie z przeznaczeniem.
Dan H
1
najlepsza odpowiedź, czyste rozwiązanie, obsługa IE8
Rocco
Gdy tekst się zawija, możesz mieć z tym problemy. Naprawiłem to, dodając do zagnieżdżonego elementu: szerokość: 95%; wyrównanie w pionie: środek;
trgraglia,
jeśli tekst jest za długi, nie działa. masz rozwiązanie? jsfiddle.net/cyxuy95q
beta
Jak sugerowano w poprzednim komentarzu, ustaw maksymalną szerokość 95% jsfiddle.net/cyxuy95q/1
Toni Michel Caubet
28

Spróbuj tego, dodaj div div:

display: flex;
align-items: center;
Kerim092
źródło
1
Podoba mi się ten - Prosty i działa w nowoczesnych przeglądarkach
Casper Skovgaard
8

Oto rozwiązanie, które najlepiej działa w przypadku pojedynczego wiersza tekstu.

Może także działać z tekstem wielowierszowym z pewnymi poprawkami, jeśli znana jest liczba linii.

.testimonialText {
    font-size: 1em; /* Set a font size */
}
.testimonialText:before { /* Add a pseudo element */
    content: "";
    display: block;
    height: 50%;
    margin-top: -0.5em; /* Half of the font size */
}

Oto JSFiddle .

Craig
źródło
8
<!DOCTYPE html>
<html>

  <head>
    <style>
      .container {
        height: 250px;
        background: #f8f8f8;
        display: -ms-flexbox;
        display: -webkit-flex;
        display: flex;
        -ms-flex-align: center;
        align-items: center;
        -webkit-box-align: center;
        justify-content: center;
      }
      p{
        font-size: 24px;
      }
    </style>
  </head>

  <body>
    <div class="container">
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
    </div>
  </body>

</html>
Nikit Barochija
źródło
Po wyrównaniu w pionie działał jak urok: środek; a cała reszta zawiodła.
Chiwda,
7

Możesz wyrównać tekst do środka w pionie wewnątrz div za pomocą Flexbox.

<div>
   <p class="testimonialText">This is the testimonial text.</p>
</div>

div {
   display: flex;
   align-items: center;
}

Możesz dowiedzieć się więcej na ten temat w Kompletnym przewodniku po Flexbox .

Cyan Baltazar
źródło
6

Sprawdź to proste rozwiązanie:

HTML

<div class="block-title"><h3>I'm a vertically centered element</h3></div>

CSS

.block-title {
    float: left;
    display: block;
    width: 100%;
    height: 88px
}

.block-title h3 {
    display: table-cell;
    vertical-align: middle;
    height: inherit
}

JSFiddle

Davors
źródło
5

Istnieje prostszy sposób na wyrównanie zawartości w pionie bez uciekania się do tabeli / komórki-komórki:

http://jsfiddle.net/bBW5w/1/

Dodałem w nim niewidoczny (szerokość = 0) div, który zakłada całą wysokość kontenera.

Wygląda na to, że działa w Internet Explorerze i Firefoksie (najnowsze wersje). Nie sprawdzałem w innych przeglądarkach

  <div class="t">
     <div>
         everything is vertically centered in modern IE8+ and others.
     </div>
      <div></div>
   </div>

I oczywiście CSS:

.t, .t > div:first-child
{
    border: 1px solid green;
}
.t
{
    height: 400px;
}
.t > div
{
    display: inline-block;
    vertical-align: middle
}
.t > div:last-child
{
    height: 100%;
}
Earl Hickey
źródło
5

Jest to najczystsze rozwiązanie, jakie znalazłem (Internet Explorer 9+) i dodaje naprawę problemu „wyłączony o .5 pikseli”, wykorzystując transform-styleinne pominięte odpowiedzi.

.parent-element {
  -webkit-transform-style: preserve-3d;
  -moz-transform-style: preserve-3d;
  transform-style: preserve-3d;
}

.element {
  position: relative;
  top: 50%;
  -webkit-transform: translateY(-50%);
  -ms-transform: translateY(-50%);
  transform: translateY(-50%);
}

Źródło: Wyrównaj wszystko w pionie za pomocą zaledwie 3 linii CSS

Justin
źródło
4

Proste rozwiązanie elementu nie znających wartości:

HTML

<div class="main">
    <div class="center">
        whatever
    </div>
</div>

CSS

.main {
    position: relative
}

.center {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    -webkit-transform: translate(-50%, -50%);
    -moz-transform: translate(-50%, -50%);
    -o-transform: translate(-50%, -50%);
}
dimitar
źródło
4

Zgodnie z odpowiedzią Adama Tomata przygotowano przykład JSFiddle do wyrównania tekstu w div :

<div class="cells-block">    
    text<br/>in the block   
</div>

za pomocą display: flex w CSS:

.cells-block {
    display: flex;
    flex-flow: column;
    align-items: center;       /* Vertically   */
    justify-content: flex-end; /* Horisontally */
    text-align: right;         /* Addition: for text's lines */
}

z innym przykładem i kilkoma objaśnieniami w poście na blogu .

Leon Rom
źródło
4

Automatyczny margines na elemencie siatki.

Podobnie jak Flexbox, zastosowanie automatycznego marginesu na elemencie siatki wyśrodkowuje go na obu osiach:

.container {
  display: grid;
}
.element {
  margin: auto;
}
Sulaymon Hursanov
źródło
4

Flexbox działał dla mnie idealnie, centrując wiele elementów wewnątrz rodzica div poziomo i pionowo.

Kod HTML:

<div class="parent-div">
    <div class="child-div">
      <a class="footer-link" href="https://www.github.com/">GitHub</a>
      <a class="footer-link" href="https://www.facebook.com/">Facebook</a>
      <p class="footer-copywrite">© 2019 Lorem Ipsum.</p>
    </div>
  </div>

Kod CSS:
Poniższy kod układa wszystkie elementy wewnątrz div-parent w kolumnie, centrując elementy poziomo i pionowo. Użyłem div-child, aby utrzymać dwa elementy Anchor w tej samej linii (rzędzie). Bez elementu podrzędnego wszystkie trzy elementy (zakotwiczenie, zakotwiczenie i akapit) są ułożone jeden na drugim w kolumnie nadrzędny element div. Tutaj tylko child-div jest ułożony w kolumnie parent-div.

/* */
.parent-div {
  height: 150px;
  display: flex;
  flex-direction: column;
  justify-content: center;
}
Mimina
źródło
3

Posługiwać się:

h1 {
    margin: 0;
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
}
.container {
    height: 200px;
    width: 500px;
    position: relative;
    border: 1px solid #eee;
}
<div class="container">
    <h1>Vertical align text</h1>
</div>

Dzięki tej sztuczce możesz wyrównać wszystko, jeśli nie chcesz, aby wyśrodkowywał „lewy: 0”, aby wyrównać do lewej.

Sanjeet kumar
źródło
2

HTML

<div class="relative"><!--used as a container-->
    <!-- add content here to to make some height and width
    example:<img src="" alt=""> -->
    <div class="absolute">
        <div class="table">
            <div class="table-cell">
                Vertical contents goes here
            </div>
        </div>
    </div>
</div>

CSS

 .relative {
     position: relative;
 }
 .absolute {
     position: absolute;
     top: 0;
     bottom: 0;
     left: 0;
     right: 0;
     background: rgba(0, 0, 0, 0.5);
 }
 .table {
     display: table;
     height: 100%;
     width: 100%;
     text-align: center;
     color: #fff;
 }
 .table-cell {
     display: table-cell;
     vertical-align: middle;
 }
ankit sigdel
źródło
2

Korzystając z Flex, uważaj na różnice w renderowaniu przeglądarek.

Działa to dobrze zarówno w przeglądarce Chrome, jak i Internet Explorer:

.outer {
    display: flex;
    width: 200px;
    height: 200px;
    background-color: #ffc;
}

.inner {
    display: flex;
    width: 50%;
    height: 50%;
    margin: auto;
    text-align: center;
    justify-content: center;
    align-items: center;
    background-color: #fcc;
}
<div class="outer"><div class="inner">Active Tasks</div></div>

Porównaj z tym, który działa tylko z Chrome:

.outer {
    display: flex;
    width: 200px;
    height: 200px;
    background-color: #ffc;
}

.inner {
    display: flex;
    width: 50%;
    height: 50%;
    margin: auto;
    background-color: #fcc;
}
<div class="outer">
<div class="inner"><span style=" margin: auto;">Active Tasks</span></div>
</div>

Roman Pokrovskij
źródło
1

Jest to kolejna odmiana divw divstrukturze z wykorzystaniem calc()CSS.

<div style="height:300px; border:1px solid green;">
  Text in outer div.
  <div style="position:absolute; height:20px; top:calc(50% - 10px); border:1px solid red;)">
    Text in inner div.
  </div>
</div>

To działa, ponieważ:

  • position:absolutedo dokładnego umieszczenia w divciągudiv
  • my znać wysokość wewnętrzna divponieważ możemy ustawić go 20px.
  • calc(50% - 10px)za 50% - połowa wysokości do wyśrodkowania wnętrzadiv
Stephen Quan
źródło
1
Rodzicielska div potrzebuje pozycji: krewna
Toni Michel Caubet
1

Działa to dobrze:

HTML

<div class="information">
    <span>Some text</span>
    <mat-icon>info_outline</mat-icon>
</div>

Sass

.information {
    display: inline-block;
    padding: 4px 0;
    span {
        display: inline-block;
        vertical-align: middle;
    }
    mat-icon {
        vertical-align: middle;
    }
}

Bez i ze znacznikiem obrazu <mat-icon>(który jest czcionką).

Vlad
źródło
0

Hmm, jest oczywiście wiele sposobów na rozwiązanie tego.

Ale mam <div>pozycję absolutnie height:100%(właściwie top:0;bottom:0i stałą szerokość) i display:table-cellpo prostu nie działałem, aby wyśrodkować tekst w pionie. Moje rozwiązanie wymagało wewnętrznego elementu rozpiętości, ale widzę też wiele innych rozwiązań, więc równie dobrze mogę je dodać:

Mój kontener to a .labeli chcę, aby liczba była w nim wyśrodkowana pionowo. Zrobiłem to, pozycjonując absolutnie top:50%i ustawiającline-height:0

<div class="label"><span>1.</span></div>

A CSS wygląda następująco:

.label {
    position:absolute;
    top:0;
    bottom:0;
    width:30px;
}

.label>span {
    position:absolute;
    top:50%;
    line-height:0;
}

Zobacz to w akcji: http://jsfiddle.net/jcward/7gMLx/

Jeff Ward
źródło
1
Fajnie, bo to najprostsze rozwiązanie. Minusem jest to, że działa tylko dla tekstu jednowierszowego, patrz rozwidlenie przykładu z dłuższym tekstem. jsfiddle.net/6sWfw
Tomas
0

Możesz użyć css flexbox.

.testimonialText {
  height: 500px;
  padding: 1em;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid #b4d2d2;
}
<div class="testimonialText">
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
  in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

Nidhin Joseph
źródło
0

Za pomocą siatki CSS zrobiłem to dla mnie:

.outer {
  background-color: grey;
  width: 10rem;
  height: 10rem;
  display: grid;
  justify-items: center;
}

.inner {
  background-color: red;
  align-self: center;
}
<div class='outer'>
  <div class='inner'>
    Content
  </div>
</div>

ezzato
źródło
0

Spróbuj osadzić element tabeli.

<div>
  <table style='width:200px; height:100px;'>
    <td style='vertical-align:middle;'>
      copenhagen
    </td>
  </table>
</div>

mikrofon
źródło
6
Tabele służą wyłącznie do obsługi danych tabelarycznych. Nigdy nie należy ich używać do rozwiązywania problemów z układem.
Micros
3
Zaletą tabel jest to, że zawsze są one spójne - CSS jest interpretowany na wiele różnych sposobów, a umieszczanie zagnieżdżonych DIV tylko po to, aby zrobić coś prostego, dodaje dodatkowy HTML (i zamieszanie). CSS jest nadal rażąco wadliwy
MC9000,
4
Tak, niestety to JESZCZE jedyny niezawodny sposób na wyrównanie w pionie (nieznany) tekstu w bloku. Dlaczego bogowie CSS tak bardzo nienawidzą Valign? (WSZYSTKIE przeglądarki MOGĄ to robić konsekwentnie - ale tylko w komórkach tabeli)
T4NK3R
-1

Istnieje kilka sztuczek, aby wyświetlić zawartość lub obraz w środku div. Niektóre odpowiedzi są naprawdę miłe i ja też w pełni się z nimi zgadzam.

Absolutne centrowanie poziome i pionowe w CSS

http://www.css-jquery-design.com/2013/12/css-techniques-absolute-horizontal-and-vertical-centering-in-css/

Istnieje ponad 10 technik z przykładami . Teraz to zależy od Ciebie, który wolisz.

Bez wątpienia, display:table; display:table-Cell jest to lepsza sztuczka.

Oto kilka dobrych sztuczek:

Sztuczka 1 - Używając display:table; display:table-cell

HTML

<div class="Center-Container is-Table">
  <div class="Table-Cell">
    <div class="Center-Block">
        CONTENT
    </div>
  </div>
</div>

Kod CSS

.Center-Container.is-Table { display: table; }
.is-Table .Table-Cell {
  display: table-cell;
  vertical-align: middle;
}
.is-Table .Center-Block {
  width: 50%;
  margin: 0 auto;
}

Trick 2 - Za pomocą display:inline-block

HTML

<div class="Center-Container is-Inline">
  <div class="Center-Block">
     CONTENT
  </div>
</div>

Kod CSS

.Center-Container.is-Inline {
  text-align: center;
  overflow: auto;
}

.Center-Container.is-Inline:after,
.is-Inline .Center-Block {
  display: inline-block;
  vertical-align: middle;
}

.Center-Container.is-Inline:after {
  content: '';
  height: 100%;
  margin-left: -0.25em; /* To offset spacing. May vary by font */
}

.is-Inline .Center-Block {
  max-width: 99%; /* Prevents issues with long content causes the content block to be pushed to the top */
  /* max-width: calc(100% - 0.25em) /* Only for Internet&nbsp;Explorer 9+ */
}

Trick 3 - Za pomocą position:relative;position:absolute

<div style="position: relative; background: #ddd; border: 1px solid #ddd; height: 250px;">
  <div style="width: 50%; height: 60%; overflow: auto; margin: auto; position: absolute; top: 0; left: 0; bottom: 0; right: 0; background: #ccc; text-align: center;">
    <h4>ABSOLUTE CENTER, <br/>
WITHIN CONTAINER.</h4>
    <p>This box is absolutely centered, horizontally and vertically, within its container</p>
  </div>
</div>
Dhiraj
źródło
-2

CSS:

.vertical {
   display: table-caption;
}

Dodaj tę klasę do elementu zawierającego rzeczy, które chcesz wyrównać w pionie

Jonny Forney
źródło
-2

Jeśli chcesz korzystać z tej min-heightwłaściwości, musisz dodać ten CSS na:

.outerContainer .innerContainer {
    height: 0;
    min-height: 100px;
}
Dexter_ns88
źródło