Saya memiliki tabel "sortable" di mana tajuk kolom yang saat ini disortir menampilkan ikon:
Ikon sortir akan ditampilkan di akhir teks (yaitu, kami mendukung LTR / RTL). Saya sedang menggunakan display:flex
. Namun, jika lebar tabel menyusut dan teks tajuk kolom mulai membungkus, saya mengalami keadaan ambigu di mana tidak jelas kolom mana yang diurutkan:
Sebaliknya saya ingin memenuhi persyaratan berikut:
- Ikon selalu "erat" selaras dengan "ujung" dari baris teks terpanjang (bahkan jika sel / tombol pembungkus lebih luas).
- Ikon juga harus sejajar dengan baris terakhir dari teks.
- Ikon tidak boleh membungkus ke garis sendiri.
- Tombol harus ada dan harus merentang sel penuh. (Ini gaya dan markup internal dapat berubah sesuai kebutuhan.)
- CSS dan HTML hanya jika memungkinkan.
- Itu tidak bisa mengandalkan lebar kolom atau teks header yang diketahui / diatur.
Sebagai contoh:
Saya telah bereksperimen dengan sekelompok kombinasi yang berbeda dari display: inline/inline-block/flex/grid
, position
, ::before/::after
, dan bahkan float
(!) Tapi tidak bisa mendapatkan perilaku yang diinginkan. Ini kode saya saat ini yang menunjukkan masalah:
.table {
border-collapse: collapse;
width: 100%;
}
.thead {
border-bottom: 3px solid #d0d3d3;
}
.thead .tr {
vertical-align: bottom;
}
.button {
padding: 1rem;
text-align: start;
font-family: Arial, "noto sans", sans-serif;
font-size: 0.875rem;
border: 0;
background-color: transparent;
width: 100%;
display: flex;
align-items: flex-end;
font-weight: bold;
line-height: 1.4;
}
.sort {
width: 1.25rem;
height: 1.25rem;
}
<table class="table">
<thead class="thead">
<tr class="tr">
<th class="th">
<button class="button">
Age
<span class="sort"></span>
</button>
</th>
<th class="th">
<button class="button">
Favorite Food
<span class="sort"></span>
</button>
</th>
<th class="th" aria-sort="ascending">
<button class="button">
Favorite Color
<span class="sort">
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" role="presentation" style="width: 1.25rem; height: 1.25rem;"> <path d="M11.4709 4.2136C11.7638 3.92071 12.2386 3.92071 12.5315 4.2136L17.1277 8.8098C17.4206 9.10269 17.4206 9.57756 17.1277 9.87046C16.8348 10.1633 16.3599 10.1633 16.0671 9.87046L12.7512 6.55459V19.25C12.7512 19.6642 12.4154 20 12.0012 20C11.587 20 11.2512 19.6642 11.2512 19.25V6.55459L7.93533 9.87046C7.64244 10.1633 7.16756 10.1633 6.87467 9.87046C6.58178 9.57756 6.58178 9.10269 6.87467 8.8098L11.4709 4.2136Z"> </path></svg>
</span>
</button>
</th>
<th class="th">
<button class="button">
Likes Neil Diamond?
<span class="sort"></span>
</button>
</th>
</tr>
</thead>
</table>
Ada ide tentang bagaimana mencapai UI ini? Ini mungkin tidak ada hubungannya dengan hal-hal tabel atau tombol. Benar-benar saya perlu Thing A
"erat" bawah / ujung selaras ke Thing B
(dari lebar yang fleksibel dan yang dapat membungkus teks) tetapi Thing A
tidak dapat membungkus ke baris sendiri.
Saya sudah mencoba mengacaukan flex
nilai - nilai tetapi kombinasi apa pun membuat pembungkus teks terlalu dini atau tidak cukup cepat.
Jawaban:
Pikirkan Anda membutuhkan JS untuk ini. Inilah jawaban yang harus memenuhi semua persyaratan kecuali 5.
sumber
Saya pikir tidak ada masalah sama sekali di sini kecuali ambiguitas visual. Inilah pengamatan saya.
Begitu terikat erat , memang ada, hanya saja jarak dinamisnya yang menyebabkan ambiguitas visual.
Sekarang datang ke solusi, solusi terdekat yang bisa saya buat tanpa intervensi JavaScript , meskipun tidak sempurna, adalah,
Batasi lebar teks ini dengan memberikan lebar maksimum:
Catatan: Ini
text-align: center
hanya untuk mengurangi efek ruang yang hilang, kecuali Anda memiliki persyaratan ketat untuk tidak melakukannya.Tolong beri tahu saya jika ini menjawab pertanyaan Anda.
Beginilah efeknya:
sumber
Saya pikir Anda hampir baik dan kehilangan (3) yang merupakan trik kecil. Gagasannya adalah membuat elemen ikon memiliki lebar sama dengan
0
dan menonaktifkan spasi putih antara teks dan ikon sortir. Untuk ini saya menggunakan pembungkus tambahan untuk teks dan menghapus penggunaan flexbox.Anda akan mengalami beberapa overflow tetapi itu tidak menjadi masalah karena Anda menerapkan padding. Anda juga dapat menambah
padding-right
jika Anda mausumber
jika judul thead Anda tidak dinamis maka saya telah memperbaiki sangat mudah.
untuk ini, Anda harus meletakkan kata terakhir dari judul dan ikon svg dalam rentang waktu bersamaan
misalnya: -html
hapus display: flex dari .button class dan beri style display: inline-block ke span yang ditambahkan
karena span menjadi inline-block ikon svg tidak akan pernah berada di baris terpisah. setidaknya akan ada satu kata di depannya
sumber
Anda dapat mencoba seperti ini:
Semoga jawaban ini akan membantu Anda. Saya tidak membuat css untuk tampilan seluler!
sumber