Saya yakin masalah ini telah ditanyakan sebelumnya tetapi saya tidak dapat menemukan jawabannya.
Saya memiliki markup berikut:
<div id="foo">
<div id="bar">
here be dragons
</div>
</div>
Keinginan saya adalah membuat foo memiliki lebar 600px
( width: 600px;
) dan membuat bar memiliki perilaku berikut:
padding-left: 2px;
padding-right: 2px;
margin-left: 2px;
margin-right: 2px;
outerWidth: 100%;
Dengan kata lain, alih-alih menyetel lebar bilah ke, 592px
saya ingin menyetel lebar terluar bilah 100%
agar dihitung 592px
. Yang penting di sini adalah bahwa saya dapat mengubah lebar foo menjadi 800px
dan bilah akan menghitung ketika diberikan alih-alih saya harus melakukan matematika untuk semua contoh ini secara manual.
Apakah ini mungkin dalam CSS murni?
Beberapa lebih menyenangkan dengan itu:
- Bagaimana jika
#bar
meja itu? - Bagaimana jika
#bar
textarea? Bagaimana jika
#bar
sebuah masukan?Bagaimana jika
#foo
tabel sel (td
)? (Apakah ini mengubah masalah atau apakah masalahnya sama?)
Sejauh ini table#bar
, input#bar
telah dibahas. Saya belum melihat solusi yang baik untuk textarea # bar. Saya pikir textarea tanpa batas / margin / padding dengan div
bungkus mungkin bekerja dengan div
gaya untuk bekerja sebagai batas textarea
.
inline-block
daripadablock
elemen. Perhatikan bahwa saya mengatakan lebih seperti tidak sama dengan :-) Apa yang mungkin Anda alami adalah bahwa kecuali ditentukan lain, mereka umumnya akan diperluas untuk mengakomodasi semua kolom yang dapat sangat mengganggu jika beberapa header / sel memiliki teks lama yang tidak dapat dibuka di dalamnya.textarea#bar
Anda harus dapat mengaturnyadisplay: block
dengan sedikit efek samping. Sejauh tabel, saya tahu saya telah menggunakan semacam solusi / mitigasi untuk itu di masa lalu tetapi saya tidak ingat apa itu saat ini. Namun saya akan mengatakan bahwa saya biasanya tidak menetapkan "margin" pada tabel melainkan membungkusnya dalam div dengan padding / margin ... ini bisa #foo sendiri atau div lain yang digunakan hanya untuk menerapkan jenis spasi ini. Anda juga dapat melakukan untuk mengatasi masalah perbatasan untuk menerapkan batas hanya ke sel pertama / terakhir dalam satu baris / sel di baris pertama / terakhirhampir selesai, ubah saja
outerWidth: 100%;
kewidth: auto;
(outerWidth bukan properti CSS)alternatifnya, terapkan gaya berikut ke bilah:
width: auto; display: block;
sumber
bar
karena akan ditambahkan ke 100% secara efektif membuatbar
lebih luas dari induknyafoo
.display:block;
(juga dikenal sebagai elemen level blok) akan mengadopsi perilaku ini. elemen DIV memilikiwidth:auto;
dandisplay:block;
diatur secara default.Gunakan gaya
left: 0px;
atau dan
right: 0px;
atau dan
top: 0px;
atau dan
bottom: 0px;
Saya pikir untuk kebanyakan kasus itu akan melakukan pekerjaan itu
sumber
Jadi setelah penelitian ditemukan hal berikut:
Untuk
div#bar
pengaturandisplay:block; width: auto;
menyebabkan setaraouterWidth:100%;
Untuk
table#bar
Anda perlu membungkusnya dalam div dengan aturan yang dinyatakan di bawah ini. Jadi struktur Anda menjadi:<div id="foo"> <div id="barWrap" style="border...."> <table id="bar" style="width: 100%; border: 0; padding: 0; margin: 0;">
Dengan cara ini tabel menggunakan div induk 100%, dan
#barWrap
digunakan untuk menambahkan batas / margin / padding ke#bar
tabel. Perhatikan bahwa Anda perlu mengatur latar belakang semuanya#barWrap
dan memiliki#bar
latar belakang transparan atau sama seperti#barWrap
.Untuk
textarea#bar
daninput#bar
Anda perlu melakukan hal yang sama sepertitable#bar
, sisi negatifnya adalah dengan menghapus border Anda menghentikan rendering widget asli dari input / textarea dan#barWrap
border akan terlihat sedikit berbeda dari yang lainnya, jadi Anda mungkin harus melakukannya gaya semua masukan Anda dengan cara ini.sumber
box-sizing: border-box; width: 100%; padding: 5px;
ukuran kotak: kotak perbatasan; membuatnya sedemikian rupa sehingga padding, margin, dan border disertakan dalam kalkulasi lebar.
MDN
sumber