Oke, saya mengalami masalah tata letak sederhana satu atau dua minggu yang lalu. Yaitu bagian dari halaman membutuhkan header:
+---------------------------------------------------------+
| Title Button |
+---------------------------------------------------------+
Hal-hal yang cukup sederhana. Masalahnya adalah kebencian tabel tampaknya telah mengambil alih di dunia Web, yang saya ingat ketika saya bertanya Mengapa menggunakan tag daftar definisi (DL, DD, DT) untuk formulir HTML daripada tabel? Sekarang topik umum tabel vs divs / CSS telah dibahas sebelumnya, misalnya:
- DIV vs Tabel ; dan
- Tabel, bukan DIV .
Jadi ini tidak dimaksudkan sebagai diskusi umum tentang CSS vs tabel untuk tata letak. Ini hanyalah solusi untuk satu masalah. Saya mencoba berbagai solusi di atas menggunakan CSS termasuk:
- Mengambang tepat untuk tombol atau div yang berisi tombol;
- Posisi relatif untuk tombol; dan
- Posisi relatif + absolut.
Tak satu pun dari solusi ini memuaskan karena alasan yang berbeda. Misalnya pemosisian relatif menghasilkan masalah indeks-z di mana menu tarik-turun saya muncul di bawah konten.
Jadi saya akhirnya kembali ke:
<style type="text/css">
.group-header { background-color: yellow; width: 100%; }
.group-header td { padding: 8px; }
.group-title { text-align: left; font-weight: bold; }
.group-buttons { text-align: right; }
</style>
<table class="group-header">
<tr>
<td class="group-title">Title</td>
<td class="group-buttons"><input type="button" name="Button"></td>
</tr>
</table>
Dan itu bekerja dengan sempurna. Ini sederhana, kompatibel dengan versi sebelumnya (yang mungkin akan bekerja bahkan pada IE5) dan berfungsi. Tidak mengotak-atik positioning atau float.
Jadi, adakah yang bisa melakukan hal yang setara tanpa tabel?
Persyaratannya adalah:
- Kompatibel dengan versi sebelumnya : ke FF2 dan IE6;
- Cukup konsisten: di berbagai browser;
- Ditengah vertikal: tombol dan judul memiliki ketinggian yang berbeda; dan
- Fleksibel: memungkinkan kontrol yang cukup tepat atas pemosisian (padding dan / atau margin) dan gaya.
Di samping catatan, saya menemukan beberapa artikel menarik hari ini:
EDIT: Izinkan saya menguraikan masalah float. Jenis pekerjaan ini:
<html>
<head>
<title>Layout</title>
<style type="text/css">
.group-header, .group-content { width: 500px; margin: 0 auto; }
.group-header { border: 1px solid red; background: yellow; overflow: hidden; }
.group-content { border: 1px solid black; background: #DDD; }
.group-title { float: left; padding: 8px; }
.group-buttons { float: right; padding: 8px; }
</style>
</head>
<body>
<div class="group-header">
<div class="group-title">This is my title</div>
<div class="group-buttons"><input type="button" value="Collapse"></div>
</div>
<div class="group-content">
<p>And it works perfectly. It's simple, as backward compatibile as it gets (that'll work probably even on IE5) and it just works. No messing about with positioning or floats.</p>
<p>So can anyone do the equivalent without tables that is backwards compatible to at least FF2 and IE6?</p>
<p>On a side note, I came across a couple of interesting articles today:</p>
</div>
</body>
</html>
Terima kasih kepada Ant P untuk overflow: hidden
bagiannya (masih belum mengerti mengapa). Di sinilah masalahnya masuk Misalnya saya ingin judul dan tombol berada di tengah secara vertikal. Ini bermasalah karena elemen memiliki ketinggian yang berbeda. Bandingkan ini dengan:
<html>
<head>
<title>Layout</title>
<style type="text/css">
.group-header, .group-content { width: 500px; margin: 0 auto; }
.group-header { border: 1px solid red; background: yellow; overflow: hidden; }
.group-content { border: 1px solid black; background: #DDD; }
.group-header td { vertical-align: middle; }
.group-title { padding: 8px; }
.group-buttons { text-align: right; }
</style>
</head>
<body>
<table class="group-header">
<tr>
<td class="group-title">This is my title</td>
<td class="group-buttons"><input type="button" value="Collapse"></td>
</tr>
</table>
<div class="group-content">
<p>And it works perfectly. It's simple, as backward compatibile as it gets (that'll work probably even on IE5) and it just works. No messing about with positioning or floats.</p>
<p>So can anyone do the equivalent without tables that is backwards compatible to at least FF2 and IE6?</p>
<p>On a side note, I came across a couple of interesting articles today:</p>
</div>
</body>
</html>
yang bekerja dengan sempurna.
Jawaban:
Tidak ada salahnya menggunakan alat-alat yang tersedia bagi Anda untuk melakukan pekerjaan dengan cepat dan benar.
Dalam hal ini meja bekerja dengan sempurna.
Saya pribadi akan menggunakan tabel untuk ini.
Saya pikir tabel bersarang harus dihindari, hal-hal bisa menjadi berantakan.
sumber
Cukup melayang ke kiri dan kanan dan atur untuk menghapus keduanya dan Anda selesai. Tidak perlu tabel.
Sunting: Saya tahu bahwa saya mendapat banyak suara positif untuk ini, dan saya yakin saya benar. Tetapi ada kasus di mana Anda hanya perlu memiliki tabel. Anda dapat mencoba melakukan semuanya dengan CSS dan itu akan berfungsi di browser modern, tetapi jika Anda ingin mendukung yang lebih tua ... Jangan terulang lagi, di sini utas stack overflow terkait dan kata - kata kasar di blog saya .
Sunting2: Karena browser lama tidak lagi menarik, saya menggunakan bootstrap Twitter untuk proyek baru. Ini bagus untuk sebagian besar kebutuhan tata letak dan tidak menggunakan CSS.
sumber
Ini semacam pertanyaan jebakan: kelihatannya sangat sederhana sampai Anda melakukannya
Saya ingin menyatakan sebagai catatan bahwa ya, pemusatan vertikal sulit di CSS. Ketika orang memposting, dan sepertinya tidak ada habisnya di SO, "dapatkah Anda melakukan X di CSS" jawabannya hampir selalu "ya" dan keluhan mereka tampaknya tidak dapat dibenarkan. Dalam hal ini, ya, satu hal itu sulit.
Seseorang sebaiknya mengedit seluruh pertanyaan menjadi "apakah pemusatan vertikal bermasalah di CSS?".
sumber
Judul float kiri, tombol float kanan, dan (inilah bagian yang tidak pernah saya ketahui sampai saat ini) - buat wadah dari keduanya
{overflow:hidden}
.Itu seharusnya menghindari masalah indeks-z. Jika tidak berhasil, dan Anda benar - benar membutuhkan dukungan IE5, lanjutkan dan gunakan tabel.
sumber
overflow:hidden
.Dalam CSS murni, jawaban yang berhasil suatu hari akan digunakan
"display:table-cell"
. Sayangnya itu tidak berfungsi di browser kelas A saat ini, jadi untuk semua itu Anda mungkin juga menggunakan tabel jika Anda hanya ingin mencapai hasil yang sama. Setidaknya Anda akan yakin bahwa ini bekerja cukup jauh di masa lalu.Jujur, gunakan saja meja jika lebih mudah. Tidak akan sakit.
Jika semantik dan aksesibilitas elemen tabel benar-benar penting bagi Anda, ada draf yang berfungsi untuk menjadikan tabel Anda non-semantik:
http://www.w3.org/TR/wai-aria/#presentation
Saya pikir ini memerlukan DTD khusus di luar XHTML 1.1, yang hanya akan memicu perdebatan
text/html
vs keseluruhanapplication/xml
, jadi jangan pergi ke sana.Jadi, ke masalah CSS yang belum terselesaikan ...
Untuk menyelaraskan dua elemen secara vertikal di tengahnya: itu dapat dilakukan dengan beberapa cara berbeda, dengan beberapa peretasan CSS yang tumpul.
Jika Anda dapat menyesuaikan dengan batasan berikut, maka ada cara yang relatif sederhana:
Kemudian Anda dapat menggunakan pemosisian absolut dengan margin negatif:
Tapi ini tidak ada gunanya dalam kebanyakan situasi ... Jika Anda sudah mengetahui ketinggian elemen, maka Anda bisa menggunakan float dan menambahkan margin yang cukup untuk memposisikannya sesuai kebutuhan.
Berikut adalah metode lain yang menggunakan garis dasar teks untuk meratakan dua kolom secara vertikal sebagai blok sebaris. Kekurangannya di sini adalah Anda perlu mengatur lebar tetap untuk kolom mengisi lebar dari tepi kiri. Karena kita perlu menjaga elemen terkunci pada garis dasar teks, kita tidak bisa hanya menggunakan float: tepat untuk kolom kedua. (Sebaliknya, kita harus membuat kolom pertama cukup lebar untuk mendorongnya.)
HTML: Kami menambahkan pembungkus .valign di sekitar setiap kolom. (Beri mereka nama yang lebih "semantik" jika itu membuat Anda lebih bahagia.) Ini perlu disimpan tanpa spasi di antaranya atau spasi teks akan memisahkan mereka. (Saya tahu itu menyebalkan, tapi itulah yang Anda dapatkan karena "murni" dengan markup dan memisahkannya dari lapisan presentasi ... Ha!)
CSS: Kami menggunakan
vertical-align:middle
untuk menyejajarkan blok ke garis dasar teks dari elemen header grup. Ketinggian yang berbeda dari setiap blok akan tetap berada di tengah secara vertikal dan mendorong tinggi wadah mereka. Lebar elemen perlu dihitung agar sesuai dengan lebarnya. Di sini, angka 400 dan 100, dikurangi bantalan horizontal.Perbaikan IE: Internet Explorer hanya menampilkan blok-sebaris untuk elemen sebaris asli (mis. Span, bukan div). Tapi, jika kita memberikan hasLayout div dan kemudian menampilkannya secara inline, itu akan berperilaku seperti blok-inline. Penyesuaian margin adalah untuk memperbaiki celah 1px di bagian atas (coba tambahkan warna latar belakang ke .group-title untuk melihatnya).
sumber
Saya akan merekomendasikan untuk tidak menggunakan tabel dalam hal ini, karena itu bukan data tabel; Ini murni presentasi untuk memiliki tombol yang terletak di paling kanan. Inilah yang akan saya lakukan untuk menduplikasi struktur tabel Anda (ubah ke H # yang berbeda agar sesuai dengan posisi Anda di hierarki situs Anda):
Jika Anda ingin perataan vertikal yang sebenarnya di tengah (yaitu, jika teks membungkus tombol masih rata tengah sehubungan dengan kedua baris teks), maka Anda perlu membuat tabel atau mengerjakan sesuatu dengan
position: absolute
dan margin. Anda dapat menambahkanposition: relative
ke menu tarik-turun (atau lebih mungkin induknya) untuk menariknya ke tingkat urutan yang sama dengan tombol, memungkinkan Anda untuk menabraknya di atasnya dengan indeks-z, jika itu yang terjadi.Perhatikan bahwa Anda tidak memerlukan
width: 100%
div karena ini adalah elemen level blok, danzoom: 1
membuat div berperilaku seperti memiliki clearfix di IE (browser lain mengambil clearfix yang sebenarnya). Anda juga tidak memerlukan semua kelas asing tersebut jika Anda menargetkan sesuatu secara lebih spesifik, meskipun Anda mungkin memerlukan div pembungkus atau span pada tombol untuk mempermudah pemosisian.sumber
zoom: 1
in.group-header
, yang memicu hasLayout dan menyebabkan IE 6 berperilaku sama seperti jika ia memiliki elemen: after yang aktif.Lakukan double float di div dan gunakan clearfix. http://www.webtoolkit.info/css-clearfix.html Apakah Anda memiliki batasan padding / margin?
sumber
sumber
Saya memilih untuk menggunakan Flexbox, karena itu membuat segalanya menjadi lebih mudah.
Pada dasarnya Anda harus pergi ke induk dari anak-anak yang ingin Anda ratakan dan tambahkan
display:box
(tentu saja diawali). Untuk membuatnya duduk di samping, gunakan justify-content . Spasi di antara adalah hal yang tepat ketika Anda memiliki elemen yang perlu disejajarkan sampai akhir, seperti dalam kasus ini (lihat tautan) ...Kemudian masalah perataan vertikal. Karena saya membuat induk dari dua elemen, Anda ingin menyelaraskan Flexbox. Sekarang mudah digunakan
align-items: center
.Kemudian saya menambahkan gaya yang Anda inginkan sebelumnya, menghapus float dari judul dan tombol di header dan menambahkan padding:
Lihat Demo
sumber
Saya setuju bahwa seseorang seharusnya hanya menggunakan tabel untuk data tabular, karena alasan sederhana bahwa tabel tidak muncul sampai mereka selesai memuat (tidak peduli seberapa cepatnya; metode CSS lebih lambat). Namun, saya merasa ini adalah solusi paling sederhana dan paling elegan:
Fungsi tombol dan detail tambahan lainnya dapat ditata dari bentuk dasar ini. Maaf atas tag yang buruk.
sumber