Mengapa vertikal-align: tengah tidak bekerja pada rentang atau div saya?

246

Saya mencoba memusatkan spanatau divelemen secara vertikal di dalam divelemen lain . Namun ketika saya katakan vertical-align: middle, tidak ada yang terjadi. Saya sudah mencoba mengubah displayproperti dari kedua elemen, dan sepertinya tidak ada yang berhasil.

Inilah yang sedang saya lakukan di halaman web saya:

.main {
  height: 72px;
  vertical-align: middle;
  border: 1px solid black;
  padding: 2px;
}
    
.inner {
  vertical-align: middle;
  border: 1px solid red;    
}
    
.second {
  border: 1px solid blue; 
}
<div class="main">
  <div class="inner">
    This box should be centered in the larger box
    <div class="second">Another box in here</div>
  </div>
</div>

Berikut ini adalah jsfiddle dari implementasi yang menunjukkan bahwa itu tidak berfungsi: http://jsfiddle.net/gZXWC/

Brad
sumber

Jawaban:

207

Ini tampaknya menjadi cara terbaik - beberapa waktu telah berlalu sejak posting asli saya dan inilah yang harus dilakukan sekarang: http://jsfiddle.net/m3ykdyds/200

/* CSS file */

.main {
    display: table;
}

.inner {
    border: 1px solid #000000;
    display: table-cell;
    vertical-align: middle;
}

/* HTML File */
<div class="main">
    <div class="inner"> This </div>
</div>
Charles Addis
sumber
2
Jadi, bagaimana seseorang melakukan apa yang OP ingin lakukan?
Ryan Mortensen
Adakah gagasan tentang paragraf garis variabel? yaitu. jika tidak ada cara untuk mengetahui apakah itu akan menjadi satu atau dua baris. Apakah saya perlu menggunakan jQuery?
foochow
Bagaimana jika tingginya harus dinamis, apa solusinya?
Murhaf Sousli
seharusnya tidak menjadi jawaban yang diterima, bergantung pada mengetahui ketinggian 'dalam', jadi tidak persis apa yang diminta OP dan beberapa jawaban yang lebih baik di bawah ini melihat jawaban @timbergus atau Tim Perkins jauh di dekat bagian bawah.
mike-source
@ mike-source mengetahui ketinggian bagian dalam adalah 100% mungkin bahkan jika ketinggian itu dinamis karena sedikit javascript dapat mengetahui hal itu dan secara dinamis mengubah aturan CSS untuk objek DOM tersebut.
Charles Addis
143

Menggunakan CSS3:

<div class="outer">
   <div class="inner"/>
</div>

Css:

.outer {
  display : flex;
  align-items : center;
  justify-content: center;
}

Catatan: Ini mungkin tidak berfungsi di IE lama

pengguna1782556
sumber
16
Ini didukung oleh semua browser modern utama dan oleh solusi paling sederhana dan terbersih.
Sam
2
Juga perlu diingat inline-flexuntuk memiliki beberapa elemen dalam satu baris di dalam elemen dalam.
Dan Nissenbaum
1
Dalam kasus saya, karena saya ingin memusatkan isi .inner secara horizontal juga, saya harus menambahkan .inner { width: 100%; }. Dengan cara ini, sepertinya berfungsi seperti .outer { display: table; } .inner { display: table-cell; vertical-align: middle; }tetapi tanpa memaksa lebar minimum.
Bart S
Saya biasa justify-content: center;menyelaraskan secara horizontal mana yang sangat bagus
Ruth Young
140

Coba ini, bekerja untuk saya dengan sangat baik:

/* Internet Explorer 10 */
display:-ms-flexbox;
-ms-flex-pack:center;
-ms-flex-align:center;

/* Firefox */
display:-moz-box;
-moz-box-pack:center;
-moz-box-align:center;

/* Safari, Opera, and Chrome */
display:-webkit-box;
-webkit-box-pack:center;
-webkit-box-align:center;

/* W3C */
display:box;
box-pack:center;
box-align:center;
Mahendra Liya
sumber
4
jawaban yang sangat baik, ini telah memberi saya solusi yang berfungsi penuh yang tidak menyebabkan masalah knock-on lainnya (aplikasi menggunakan jquerymobile + phonegap dan semua solusi lainnya menyebabkan masalah ukuran css & div). Hanya untuk menunjukkan bahwa parameter ini harus ditambahkan ke blok CSS khusus untuk elemen yang akan dipusatkan / ditengahi, misalnya: #element span {height:100%;display:-webkit-box;-webkit-box-pack:center;-webkit-box-align:center;}- perhatikan ketinggiannya penting untuk memastikan bentang mewarisi tinggi penuh wadahnya (mungkin div) jika tidak Anda masih tidak akan mendapatkan pemusatan vertikal!
Andy Lorenz
BTW, Anda dapat menulis kode flexbox standar tanpa awalan peramban dan kemudian mendapatkan awalan peramban dengan autoprefixer github.com/postcss/autoprefixer atau melalui demo online simevidas.jsbin.com/gufoko/quiet
starikovs
2
nilai properti tidak valid boxdidisplay
Joaquinglezsantos
Juga, jawaban @ user1782556 bekerja lebih baik ketika kotak luar memiliki padding.
iautomation
34

Mengatur ketinggian garis ke ketinggian yang sama dengan yang mengandung div juga akan berfungsi

DEMO http://jsfiddle.net/kevinPHPkevin/gZXWC/7/

.inner {
    line-height:72px;
    border: 1px solid #000000;
}
Kevin Lynch
sumber
1
Saya memposting tautan yang menjelaskan metode itu juga. Bukan metode yang saya sukai, jika sisa tata letak tidak tetap dalam ukuran - saya telah mengalami masalah pada berbagai ukuran viewports dengan metode ini.
Charles Addis
2
ya teknik line-height bekerja dengan baik, tetapi HANYA JIKA Anda memiliki konten satu baris. Jalur tambahan akan hilang / akan tumpah di luar wadah dan Anda harus memulai lagi!
Andy Lorenz
a) line-heightjuga akan mengubah ketinggian elemen dalam. b) Elemen dalam masih belum terpusat secara vertikal secara akurat. c) Ini tidak berfungsi pada elemen yang tidak mengandung teks, misalnya:, <img>atau elemen dengan ketinggian tetap.
Alph.Dev
Itu juga dapat gagal lintas-OS (Windows / Mac) karena perbedaan font-rendering
LocalPCGuy
1
Ini sangat tidak terduga dan seringkali menghasilkan ketinggian ekstra pada wadah.
Undistraction
25

Dalam kasus Anda tidak dapat mengandalkan flexbox ... Tempat .childke .parentpusat 's. Bekerja ketika ukuran piksel tidak diketahui (dengan kata lain, selalu) dan tidak ada masalah dengan IE9 + juga.

.parent { position: relative; }

.child {
    position: absolute;
    top : 50%;
    left: 50%;
    -ms-transform: translate(-50%, -50%);
    transform    : translate(-50%, -50%);    
}
<div class="parent" style="background:lightyellow; padding:6em"> 
  <div class="child" style="background:gold; padding:1em">&mdash;</div> 
</div>

Kornieff
sumber
Ini sebenarnya solusi yang paling baik dilakukan, terutama karena sebagian besar proyek yang saya lihat sejauh ini memerlukan kompatibilitas IE9
Jabberwocky
20

Anda harus memakai vertical-align: middleelemen dalam, bukan elemen luar. Atur line-heightproperti pada elemen luar agar sesuai dengan heightelemen luar. Kemudian atur display: inline-blockdan line-height: normalpada elemen dalam. Dengan melakukan ini, teks pada elemen bagian dalam akan dibungkus dengan ketinggian garis normal. Bekerja di Chrome, Firefox, Safari, dan IE 8+

.main {
    height: 72px;
    line-height:72px;
    border: 1px solid black;
}
.inner {
    display: inline-block;
    vertical-align: middle;
    line-height: normal;
}
<div class="main">
    <div class="inner">Vertically centered text</div>
</div>

Biola

Tim Perkins
sumber
Ini mungkin cara paling sederhana ... semua jawaban lain pada halaman ini tidak perlu kikuk / hacky ATAU tidak didukung di browser yang lebih lama ATAU mengandalkan mengetahui ketinggian elemen dalam. Anda tidak benar-benar membutuhkan line-height: normal;dan display:inline;bekerja juga. Bonus dari metode ini adalah tidak mengganggu text-align:center;, yang menggunakan display: table-cell;dapat menimbulkan masalah. Cukup sering kita ingin menyelaraskan secara horizontal maupun vertikal. Lihat biola yang diedit ini: jsfiddle.net/br090prs/36
mike-source
2
@ mike-source alasan untuk digunakan line-height: normaldan display: inline-blockagar teks dalam akan terbungkus dengan benar. Jika Anda yakin teks di div bagian dalam tidak akan pernah terbungkus maka properti ini tidak akan diperlukan.
Tim Perkins
Sejak Microsoft mengakhiri dukungan untuk IE versi lama, saya telah menggunakan flexbox untuk hal semacam ini (seperti yang disarankan @ user1782556). Jawaban asli saya adalah cara untuk pergi jika Anda masih perlu mendukung IE 10 atau lebih lama.
Tim Perkins
100% setuju, tapi saya tidak akan secara pribadi menggunakan kotak fleksibel, hanya 76% browser yang mendukung sepenuhnya pada Mei 2016 (94% jika Anda menyertakan dukungan parsial), lihat: caniuse.com/#search=flexible% 20 kotak . Namun semakin mendekati menjadi pilihan yang paling masuk akal, tergantung pada basis pengguna Anda.
mike-source
10

Saya menggunakan ini untuk menyelaraskan segala sesuatu di tengah div pembungkus kalau-kalau itu membantu siapa pun - saya merasa paling sederhana:

div.wrapper {
  /* --- This works --- */
  display: flex;
  /* Align Vertically */
  align-items: center;
  /* Align Horizontally */
  justify-content: center;
  /* --- ---------- ----- */
  width: 100%;
  height:100px;
  background-color: blue;
}
div.inner {
  width: 50px;
  height: 50px;
  background-color: orange;
}
<div class="wrapper">
  <div class="inner">
  </div>
</div>

Ruth Young
sumber
7

Di sini Anda memiliki contoh dua cara melakukan pelurusan vertikal. Saya menggunakannya dan mereka bekerja dengan cukup baik. Satu menggunakan penentuan posisi absolut dan lainnya menggunakan flexbox .

Contoh Align Vertikal

Menggunakan flexbox, Anda dapat menyelaraskan sebuah elemen dengan sendirinya di dalam elemen lain dengan display: flex;menggunakan align-self. Jika Anda perlu menyelaraskannya juga secara horizontal, Anda dapat menggunakan align-itemsdan justify-contentdi dalam wadah.

Jika Anda tidak ingin menggunakan flexbox, Anda bisa menggunakan properti posisi. Jika Anda menjadikan wadah relatif dan konten absolut, konten akan dapat bergerak bebas di dalam wadah. Jadi, jika Anda menggunakan top: 0;dan left: 0;dalam konten, itu akan diposisikan di sudut kiri atas wadah.

Penentuan posisi absolut

Kemudian, untuk menyelaraskannya, Anda hanya perlu mengubah referensi atas dan kiri menjadi 50%. Ini akan memposisikan konten di pusat wadah dari sudut kiri atas konten.

Luruskan di tengah wadah

Jadi, Anda perlu memperbaiki ini menerjemahkan konten setengah ukurannya ke kiri dan atas.

Berpusat absolut

Timbergus
sumber
5

di sini adalah artikel bagus tentang cara menyelaraskan vetical .. Saya suka cara mengapung.

http://www.vanseodesign.com/css/vertical-centering/

HTML:

<div id="main">
    <div id="floater"></div>
    <div id="inner">Content here</div>
</div>

Dan gaya yang sesuai:

#main {
   height: 250px;
}

#floater {
   float: left;
   height: 50%;
   width: 100%;
   margin-bottom: -50px;
}

#inner {
   clear: both;
   height: 100px;
}
Dory Zidon
sumber
3
Saya berpikir bahwa jika Anda menentukan ketinggian blok #inner itu membatalkan konsep pemusatan vertikal yang tepat. OPS meminta untuk membuatnya otomatis, jadi saya akan membayangkan itu berarti ketinggian kotak dalam tidak diketahui pada waktu pembuahan.
Alexis Wilke
5

HTML

<div id="myparent">
  <div id="mychild">Test Content here</div>
</div>

CSS

#myparent {
  display: table;
}
#mychild {
  display: table-cell;
  vertical-align: middle;
}

Kami mengatur div induk untuk ditampilkan sebagai tabel dan div anak untuk ditampilkan sebagai sel tabel. Kita kemudian dapat menggunakan penyelarasan vertikal pada div anak dan mengatur nilainya ke tengah. Apa pun di dalam div anak ini akan dipusatkan secara vertikal.

Brijesh Patel
sumber
4

Itu mudah. Cukup tambahkan display:table-celldi kelas utama Anda.

.main {
  height: 72px;
  vertical-align: middle;
  display:table-cell;
  border: 1px solid #000000;
}

Lihatlah jsfiddle ini !

RizonBarns
sumber
4

Ini adalah solusi termudah terbaru - tidak perlu mengubah apa pun, cukup tambahkan tiga baris aturan CSS ke wadah div Anda di mana Anda ingin memusatkan. Saya suka Flex Box#LoveFlexBox

.main {
  /* I changed height to 200px to make it easy to see the alignment. */
  height: 200px;
  vertical-align: middle;
  border: 1px solid #000000;
  padding: 2px;
  
  /* Just add the following three rules to the container of which you want to center at. */
  display: flex;
  flex-direction: column;
  justify-content: center;
  /* This is true vertical center, no math needed. */
}
.inner {
  border: 1px solid #000000;
}
.second {
  border: 1px solid #000000;
}
<div class="main">
  <div class="inner">This box should be centered in the larger box
    <div class="second">Another box in here</div>
  </div>
  <div class="inner">This box should be centered in the larger box
    <div class="second">Another box in here</div>
  </div>
</div>

Bonus

yang justify-contentnilai dapat diatur untuk beberapa pilihan berikut:

  • flex-start, yang akan menyelaraskan div anak ke tempat aliran fleksibel dimulai dalam wadah induknya. Dalam hal ini, ia akan tetap di atas.

  • center, yang akan menyelaraskan div anak ke tengah wadah induknya. Ini benar-benar rapi, karena Anda tidak perlu menambahkan div tambahan untuk membungkus semua anak untuk meletakkan bungkusnya dalam wadah induk untuk memusatkan anak-anak. Karena itu, ini adalah pusat vertikal yang sebenarnya (dalam bahasa Indonesia column flex-direction. Demikian pula, jika Anda mengubah flow-directionke row, itu akan menjadi pusat secara horizontal.

  • flex-end, yang akan menyelaraskan div anak ke tempat aliran fleksibel berakhir di wadah induknya. Dalam hal ini, itu akan pindah ke bawah.

  • space-between, yang akan menyebarkan semua anak dari awal aliran ke akhir aliran. Jika demo, saya menambahkan div anak lain, untuk menunjukkan mereka tersebar.

  • space-around, mirip dengan space-between, tetapi dengan setengah ruang di awal dan akhir aliran.

Downhillski
sumber
Solusi sempurna. Peramban yang tidak kompatibel dapat membuat konten tidak selaras dan pengguna harus menanganinya atau memutakhirkan perambannya.
twicejr
0

Karena vertical-alignberfungsi seperti yang diharapkan pada td, Anda dapat menempatkan sel tunggal tabledi divuntuk menyelaraskan kontennya.

<div>
    <table style="width: 100%; height: 100%;"><tr><td style="vertical-align: middle; text-align: center">
        Aligned content here...
    </td></tr></table>
</div>

Kikuk, tetapi bekerja sejauh yang saya tahu. Mungkin tidak memiliki kelemahan dari solusi lainnya.

Smig
sumber
5
Tidak, tolong, tidak ada meja lagi. CSS dapat melakukannya dengan cara yang bersih. Tidak perlu menggunakan <tabel> dalam kasus ini.
enguerranws
0

Cukup masukkan konten di dalam tabel dengan tinggi 100%, dan atur tinggi untuk div utama

<div style="height:80px;border: 1px solid #000000;">
<table style="height:100%">
<tr><td style="vertical-align: middle;">
  This paragraph should be centered in the larger box
</td></tr>
</table>
</div>
Ramiro Mosquera
sumber
0

Untuk memusatkan elemen span atau div secara vertikal di dalam div lain, tambahkan posisi relatif ke div induk dan posisi absolut ke div anak. Sekarang div anak dapat diposisikan di mana saja di dalam div. Contoh di bawah ini memusatkan secara horizontal dan vertikal.

<div class="parent">
    <div class="child">Vertically and horizontally centered child div</div>
</div>

css:

.parent{
    position: relative;
}
.child{
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
}
Toki
sumber
0

Ini adalah pendekatan modern dan memanfaatkan fungsi CSS Flexbox. Anda sekarang dapat menyelaraskan konten secara vertikal dalam wadah induk Anda dengan hanya menambahkan gaya ini ke .mainwadah

.main {
        display: flex;
        flex-direction: column;
        justify-content: center;
}

Dan kamu baik untuk pergi!

Kingsley Gyimah
sumber