Saya mencoba membuat sistem menu dengan gambar dan teks di atas dan di bawah. Data bersifat dinamis. Saya ingin sistem menu muncul sehingga setiap gambar berjarak sama dari satu sama lain sehingga mereka berbaris dalam kisi-kisi gambar baik secara horizontal maupun vertikal.
Masalahnya adalah teks. Jika teks lebih panjang dari gambar, maka div akan diperbesar. Namun, kemudian menciptakan celah yang terlihat canggung karena gambar tidak lagi sama jaraknya satu sama lain.
Untuk mengatasi ini, saya pikir pendekatan terbaik adalah meminta masing-masing div lainnya untuk mengadopsi ukuran div yang lebih besar. Namun, saya tidak yakin bagaimana cara melakukan ini.
Saya sudah mencoba dengan flexbox menggunakan flex-wrap
properti. Sementara itu dibungkus dengan baik, saya belum bisa menemukan cara untuk mendapatkan masing-masing gambar untuk sejajar jarak yang sama dari satu sama lain.
Bagaimana cara saya mencapai hal ini?
Kode saya adalah sebagai berikut:
#outer {
display: flex;
}
#main {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
border: solid black 25px;
border-radius: 25px;
width: 450px;
height: 500px;
padding: 20px;
}
.section {
background-color: #ddd;
padding: 15px;
}
.label, .icon {
text-align: center;
}
<div id="outer">
<div id="main">
<div class="section">
<div class="label">Label 1AAAAAAAAAAA</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 1B</div>
</div>
<div class="section">
<div class="label">Label 2A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 2B</div>
</div>
<div class="section">
<div class="label">Label 3A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 3B</div>
</div>
<div class="section">
<div class="label">Label 4A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 4B</div>
</div>
<div class="section">
<div class="label">Label 5A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 5B</div>
</div>
</div>
</div>
PS. Saya juga tidak yakin mengapa div bagian saya menambah tinggi badan mereka. Jadi wawasan apa pun tentang ini juga akan dihargai.
align-items
diaturstretch
secara default. Anda dapat dengan mudah mengubahnya:align-items: flex-start;
Jawaban:
Tidak yakin apakah Anda bisa membuatnya sehingga setiap elemen tumbuh menjadi sebesar elemen terbesar, tetapi jika Anda bisa berasumsi bahwa Anda menginginkan jumlah elemen tertentu di setiap baris, maka buatlah dengan ukuran yang sama. Saya pikir ini lebih mudah dilakukan dengan kotak css daripada flexbox. Lihat solusinya di bawah ini. Saya menggunakan kisi untuk memposisikan elemen bagian serta untuk memastikan bahwa di dalam setiap bagian ketiga bagian (teks atas, gambar, teks bawah) mengambil tepat 1/3 dari div masing-masing - ini adalah untuk memastikan semua gambar juga menyelaraskan secara vertikal . Selain itu saya menggunakan label flex untuk memastikan teks berada di tengah (horizontal dan vertikal).
sumber
Berikan kodepen cepat ini berputar. Satu hal yang hilang adalah permintaan media tentang bagaimana berperilaku ketika tidak dapat memuat 3 kolom berturut-turut yang akan saya ubah adalah
max-width
properti yang akan50% - individual item padding left and right - how much space you want between
diubah dan diubahflex: 1 33%
menjadiflex: 1 55%
(Anda dapat melewati nilai padding jika Anda mengubah cara kerja ukuran kotak Anda sehingga lebar menyertakan padding di lebarnya dengan properti ukuran kotak seperti ini )
https://codepen.io/mihaelnikic/pen/bGGPBYG
CSS :
sumber
Saya harap ini akan membantu.
CSS
HTML
sumber
Anda dapat mencoba menambahkan lebar dan kata-istirahat ke wadah label dan menyesuaikan lebar sesuai
sumber
Jika saya memahami masalah Anda dengan benar, kesenjangan aneh yang ingin Anda singkirkan adalah yang ada di baris kedua setelah baris pertama Anda selesai. Jika hanya itu yang Anda coba selesaikan, maka mungkin yang perlu Anda lakukan adalah mengubah
justify-content
darispace-between
menjadiflex-start
dengan margin ditambahkan ke.section
elemen Anda dan padding di Anda#main
disesuaikan untuk mencocokkan. Spasi sekarang akan menjadi 20px di antara semua gambar.Jika Anda tidak suka bagaimana yang terlihat, Anda dapat mencoba lain
justify-content
nilai-nilai sepertiflex-start
,flex-end
,space-around
,space-evenly
.Atau, Anda dapat menyingkirkan
justify-content
dan menggunakanflex-grow
untuk memperluas masing.section
- masing agar sesuai dengan lingkungannya.Sebagai alternatif, jika Anda ingin talangnya berbaris sementara masih meluas agar sesuai dengan konten masing-masing
.section
elemen, Anda dapat mencoba menggunakannyadisplay: table
.Kerugian di sini adalah Anda harus membagi HTML menjadi baris.
Jika Anda benar-benar ingin semua
.section
elemen berkembang sama dengan.section
elemen terbesar ,Anda kemungkinan besar perlu menggunakan JavaScript karena elemen saudara di CSS tidak tahu banyak tentang satu sama lain.
Anda dapat menambahkan JavaScript berikut ke halaman Anda dan menyesuaikan CSS seperti itu:
sumber
Saya akan menyarankan CSS Grid juga.
Anda menentukan 3 kolom dan 2 baris yang berbagi lebar sama rata satu sama lain, dan memberi tahu bagian untuk memiliki margin kecil untuk menunjukkan celah di antara:
sumber
Solusi CSS murni dengan semua kriteria itu, saya pikir, tidak mungkin tetapi solusi JS yang dikombinasikan dengan CSS Grid adalah mungkin.
Solusi CSS murni di mana elemen beradaptasi secara dinamis dengan teks dan set yang mengubah semua elemen lain tidak mungkin. Kami dapat secara dinamis mengatur lebar elemen untuk beradaptasi dengan teks tetapi kami tidak dapat membuat lebar itu minimum untuk semua elemen lain yang memiliki kelas yang sama.
sumber
div
dan biarkan paddings, perbatasan. danmin-width
danmin-height
di utamadiv
.Ini dia:
periksa https://jsfiddle.net/sugandhnikhil/b216mx5d/
mengubah ukuran jendela untuk melihat penyamaan yang sama antara gambar !!!!
Terima kasih banyak!!!!!!!
:-)
sumber
Hanya ingin tahu mengapa biarkan panjang teks menentukan ukuran
div
? Bukankah itu membuat UI aneh? Saya sarankan mengatur lebar untuk label dan semua teks menjadi overflowellipsis (...)
. Dengan ini, tidak perluJavaScript
kode, hanya beberapa tambahancss
untuk kode Anda.label
. Ini cuplikan. Ini akan terlihat jauh lebih baik daripadadiv
mengubah ukuran Anda setiap kali akan ada teks yang panjang.Jika Anda khawatir tentang "bagaimana pemirsa saya dapat membaca seluruh teks?" maka Anda cukup menerapkan beberapa efek
on hover
pada sampelellipsis
codepen seperti ini (sampel bukan milik saya) atau mungkin mencoba sesuatu seperti solusi SO ini .Semoga ini membantu!
sumber
Ini adalah sudut yang sedikit berbeda dari apa yang disarankan jawaban lain. Anda mungkin berpotensi mempertimbangkan pemotongan teks.
sumber