Saya mempunyai masalah ketika saya mencoba untuk memusatkan "produk" blok div karena saya tidak tahu sebelumnya lebar div. Adakah yang punya solusi?
Pembaruan: Masalah yang saya miliki adalah saya tidak tahu berapa banyak produk yang akan saya tampilkan, saya dapat memiliki 1, 2 atau 3 produk, saya dapat memusatkan mereka jika itu nomor yang tetap karena saya tahu lebar induknya div, saya hanya tidak tahu bagaimana melakukannya ketika kontennya dinamis.
.product_container {
text-align: center;
height: 150px;
}
.products {
height: 140px;
text-align: center;
margin: 0 auto;
clear: ccc both;
}
.price {
margin: 6px 2px;
width: 137px;
color: #666;
font-size: 14pt;
font-style: normal;
border: 1px solid #CCC;
background-color: #EFEFEF;
}
<div class="product_container">
<div class="products" id="products">
<div id="product_15">
<img src="/images/ecommerce/card_default.png">
<div class="price">R$ 0,01</div>
</div>
<div id="product_15">
<img src="/images/ecommerce/card_default.png">
<div class="price">R$ 0,01</div>
</div>
<div id="product_15">
<img src="/images/ecommerce/card_default.png">
<div class="price">R$ 0,01</div>
</div>
</div>
</div>
Jawaban:
Pembaruan 27 Feb 2015: Jawaban orisinal saya terus dipilih, tetapi sekarang saya biasanya menggunakan pendekatan @ bobince.
Pos asli saya untuk tujuan historis:
Anda mungkin ingin mencoba pendekatan ini.
Inilah gaya yang cocok:
JSFiddle
Idenya di sini adalah bahwa Anda mengandung konten yang ingin Anda pusatkan dalam dua div, yang luar dan yang dalam. Anda mengapung kedua div sehingga lebarnya secara otomatis menyusut agar sesuai dengan konten Anda. Selanjutnya, Anda relatif memposisikan div luar dengan tepi kanan di tengah wadah. Terakhir, Anda relatif memposisikan div dalam arah yang berlawanan dengan setengah dari lebar sendiri (sebenarnya lebar div luar, tetapi mereka sama). Pada akhirnya itu memusatkan konten dalam wadah apa pun yang ada di dalamnya.
Anda mungkin memerlukan div kosong itu di akhir jika Anda bergantung pada konten "produk" Anda untuk mengukur ketinggian "product_container".
sumber
overflow:hidden
untuk.product_container
paraouter-center
div akan tumpang tindih isi lain di dekatnya di sebelah kanan itu. Tautan atau tombol apa pun di sebelah kananouter-center
tidak akan berfungsi. Coba warna latar belakang untukouter-center
memahami kebutuhanoverflow :hidden
. Ini adalah suntingan yang disarankan oleh Cicil ThomasElemen dengan 'display: block' (seperti div secara default) memiliki lebar yang ditentukan oleh lebar wadahnya. Anda tidak dapat membuat lebar blok bergantung pada lebar isinya (shrink-to-fit).
(Kecuali untuk blok yang 'mengambang: kiri / kanan' di CSS 2.1, tapi itu tidak berguna untuk pemusatan.)
Anda bisa mengatur properti 'display' ke 'inline-block' untuk mengubah blok menjadi objek shrink-to-fit yang dapat dikontrol oleh properti text-align orang tuanya, tetapi dukungan browser tidak tepat. Sebagian besar Anda bisa lolos dengan menggunakan peretasan (mis. Lihat -moz-inline-stack) jika Anda ingin melakukannya.
Cara lain untuk pergi adalah tabel. Ini bisa diperlukan ketika Anda memiliki kolom yang lebarnya benar-benar tidak dapat diketahui sebelumnya. Saya benar-benar tidak tahu apa yang Anda coba lakukan dari kode contoh - tidak ada yang jelas di sana yang perlu blok menyusut-agar-cocok - tetapi daftar produk mungkin dapat dianggap tabular.
[PS. jangan pernah menggunakan 'pt' untuk ukuran font di web. 'px' lebih dapat diandalkan jika Anda benar-benar membutuhkan teks ukuran tetap, jika tidak, unit relatif seperti '%' lebih baik. Dan "jelas: ccc keduanya" - salah ketik?]
JSFiddle
sumber
display: inline-block
tidak didukung di IE7 dan versi Firefox yang lebih lamaSebagian besar browser mendukung
display: table;
aturan CSS. Ini adalah trik yang baik untuk memusatkan div dalam wadah tanpa menambahkan HTML tambahan atau menerapkan gaya pembatas ke wadah (sepertitext-align: center;
yang akan memusatkan semua konten inline lainnya dalam wadah), sambil menjaga lebar dinamis untuk div yang terkandung:HTML:
CSS:
Tampilkan cuplikan kode
Pembaruan (2015-03-09):
Cara yang tepat untuk melakukan ini hari ini sebenarnya adalah dengan menggunakan aturan flexbox. Dukungan browser sedikit lebih terbatas ( dukungan tabel CSS vs dukungan flexbox ) tetapi metode ini juga memungkinkan banyak hal lain, dan merupakan aturan CSS khusus untuk jenis perilaku ini:
HTML:
CSS:
Tampilkan cuplikan kode
sumber
display: table;
varian ideal untuk pseudo-elemen (::before
,::after
) di mana Anda tidak dapat menambahkan markup tambahan, dan Anda ingin gangguan menghindari untuk gaya elemen yang berdekatan.enam cara untuk menguliti kucing itu:
Tombol satu: tipe apa pun
display: block
akan menganggap lebar orang tua penuh. (kecuali jika dikombinasikan denganfloat
ataudisplay: flex
orang tua). Benar. Contoh burukTombol 2: pergi untuk
display: inline-block
akan mengarah ke lebar otomatis (bukan penuh). Anda kemudian dapat memusatkan menggunakantext-align: center
pada blok pembungkus . Mungkin yang paling mudah, dan paling kompatibel secara luas, bahkan dengan browser 'vintage' ...Tombol 3: Tidak perlu meletakkan apa pun di bungkus. Jadi mungkin ini adalah solusi paling elegan. Juga berfungsi secara vertikal. (Dukungan browser untuk transtlate cukup baik (≥IE9) hari ini ...).
Btw: Juga cara yang bagus untuk blok pemusatan vertikal yang ketinggiannya tidak diketahui (sehubungan dengan penentuan posisi absolut).
Tombol 4: Penentuan posisi absolut. Pastikan untuk menyimpan cukup tinggi di bungkusnya, karena tidak ada orang lain yang mau (tidak ada perbaikan jelas maupun implisit ...)
Tombol 5: float (yang juga membawa elemen level blok ke lebar dinamis) dan pergeseran relatif. Meskipun saya belum pernah melihat ini di alam liar. Mungkin ada kerugiannya ...
Pembaruan: Tombol 6: Dan saat ini, Anda juga dapat menggunakan kotak fleksibel. Perhatikan, gaya itu berlaku untuk pembungkus objek yang berada di tengah.
→ kode sumber lengkap (sintaks stylus)
sumber
Saya menemukan solusi yang lebih elegan, menggabungkan "inline-block" untuk menghindari penggunaan float dan hacky clear: keduanya. Masih membutuhkan div bersarang tho, yang tidak semantik tetapi hanya berfungsi ...
Semoga ini bisa membantu!
sumber
Jika elemen target benar-benar diposisikan, Anda dapat memusatkannya dengan menggerakkannya 50% dalam satu arah (
left: 50%
) dan kemudian mengubahnya 50% dalam arah oposisi (transform:translateX(-50%)
). Ini berfungsi tanpa menentukan lebar elemen target (atau denganwidth:auto
). Posisi elemen induk bisa statis, absolut, relatif, atau tetap.sumber
Secara default,
div
elemen ditampilkan sebagai elemen blok, sehingga lebarnya 100%, menjadikannya tidak berarti di tengah. Seperti yang disarankan oleh Arief, Anda harus menentukanwidth
dan kemudian dapat Anda gunakanauto
saat menentukanmargin
untuk memusatkan adiv
.Atau, Anda juga bisa memaksa
display: inline
, tetapi kemudian Anda akan memiliki sesuatu yang berperilaku sepertispan
bukandiv
, jadi itu tidak masuk akal.sumber
Ini akan memusatkan elemen seperti Daftar Pesanan, atau Daftar Tanpa Urutan, atau elemen apa pun. Bungkus saja dengan Div dengan kelas outerElement dan berikan elemen inner kelas innerElement.
Akun outerelement untuk IE, Mozilla lama, dan sebagian besar browser yang lebih baru.
sumber
gunakan css3 flexbox dengan justify-content: center;
sumber
Sedikit variasi pada jawaban Mike M. Lin
Jika Anda menambahkan
overflow: auto;
(atauhidden
) kediv.product_container
, maka Anda tidak perludiv.clear
.Ini berasal dari artikel ini -> http://www.quirksmode.org/css/clearing.html
Berikut ini HTML yang dimodifikasi:
Dan di sini adalah CSS yang dimodifikasi:
Alasannya, mengapa lebih baik tanpa
div.clear
(selain itu terasa salah untuk memiliki elemen kosong) adalah tugas margin Firefox terlalu bersemangat.Misalnya, jika Anda memiliki html ini:
kemudian, di Firefox (8,0 pada titik penulisan), Anda akan melihat
11px
margin sebelumnyaproduct_container
. Yang lebih buruk, adalah Anda akan mendapatkan bilah gulir vertikal untuk seluruh halaman, bahkan jika kontennya cocok dengan dimensi layar.sumber
Coba css dan markup baru ini
Berikut ini HTML yang dimodifikasi:
Dan di sini adalah CSS yang dimodifikasi:
sumber
Jika Anda tidak memberikan "overflow: hidden" for ".product_container" div "luar-tengah" akan tumpang tindih dengan konten terdekat lainnya di sebelah kanannya. Tautan atau tombol apa pun di sebelah kanan "luar-tengah" tidak akan berfungsi. Coba warna latar belakang untuk "luar-tengah" untuk memahami kebutuhan "overflow: tersembunyi"
sumber
Saya menemukan solusi yang menarik, saya membuat slider dan harus memusatkan kontrol slide dan saya melakukan ini dan berfungsi dengan baik. Anda juga dapat menambahkan posisi relatif ke orang tua dan memindahkan posisi anak vertikal. Lihatlah http://jsfiddle.net/bergb/6DvJz/
CSS:
HTML:
sumber
Lakukan
display:table;
dan aturmargin
keauto
Sedikit kode penting:
Tidak peduli berapa banyak elemen yang Anda dapatkan sekarang, itu akan otomatis menyelaraskan di tengah
Contoh dalam cuplikan kode:
Tampilkan cuplikan kode
sumber
Saya takut satu-satunya cara untuk melakukan ini tanpa secara eksplisit menentukan lebarnya adalah dengan menggunakan tabel (terkesiap).
sumber
Memperbaiki yang buruk, tetapi tidak berhasil ...
CSS:
HTML:
sumber
Perbaikan sederhana yang bekerja di browser lama (tetapi menggunakan tabel, dan membutuhkan ketinggian yang harus ditetapkan):
sumber
}
gunakan span istead dari divs bagian dalam
sumber
Saya tahu pertanyaan ini sudah lama, tetapi saya tidak menghiraukannya. Sangat mirip dengan jawaban bobince tetapi dengan contoh kode kerja.
Jadikan setiap produk sebagai blok-inline. Tengahkan isi wadah. Selesai
http://jsfiddle.net/rgbk/6Z2Re/
Lihat juga: Center inline-blok dengan lebar dinamis di CSS
sumber
Ini adalah salah satu cara untuk memusatkan sesuatu di dalam div yang tidak mengetahui lebar bagian dalam elemen.
sumber
solusi saya adalah:
sumber
tambahkan css ini ke kelas product_container Anda
sumber