Butang dengan teks dan ikon berpusat
P粉033429162
2023-08-15 11:01:09
<p>Saya sedang membangunkan komponen butang dengan ikon dan teks. </p>
<p>Ikon diletakkan di sebelah kiri butang dan teks dijajarkan di tengah-tengah butang. </p>
<p>Jika teks tidak boleh dimuatkan ke dalam butang, ia tidak sepatutnya membalut tetapi boleh dipotong. </p>
<p>Syarat utama untuk memotong teks ialah teks hendaklah jarak yang sama dari tepi butang dengan ikon dari tepi butang. </p>
<p>Jadi anda tidak boleh menambah padding sebaris yang sama dalam butang. </p>
<p>Jika teks tidak dipotong, ia akan dijajarkan di tengah-tengah butang. </p>
<p>Walau bagaimanapun, sebaik sahaja ia mula bertindih dengan ikon atau gagal dimuatkan ke dalam butang, teks akan dipotong. </p>
<p>Dalam erti kata lain, dalam keadaan biasa, kedudukan ikon kekal tidak berubah, tetapi apabila ruang tidak mencukupi untuk teks, ikon akan menolak teks ke kedudukan terpotong. </p>
<p>Contoh visual butang</p>
<p>Saya cuba menggunakan CSS untuk mencapai kesan ini, tetapi gagal. </p>
<p>Akhir sekali, saya menambah ResizeObserver pada setiap butang yang mengira sama ada terdapat ruang yang mencukupi untuk teks. </p>
<p>Jika ruang tidak mencukupi, gaya berbeza akan digunakan pada ikon. </p>
<p>Penyelesaian ResizeObserver saya, cuba ubah saiz tetingkap</p>
<p>CodePen</p>
<pre class="brush:php;toolbar:false;">const CLASS_TEXT = `button__text`;
const CLASS_NO_FREE_SPACE = `butang_tiada-ruang-kosong`;
const FREE_SPACE_SIZE = 70;
butang const = document.querySelectorAll(`.${CLASS_ROOT}`);
const handleButtonResize = (entri) =>
entries.forEach((entry) => {
const { sasaran } = kemasukan;
teks const = target.querySelector(`.${CLASS_TEXT}`);
const { width: widthButton } = entry.contentRect;
if (!(text instanceof HTMLElement)) {
kembali;
}
const widthText = text.offsetWidth;
const freeSpaceLeft = (widthButton - widthText) / 2;
const noFreeSpace = freeSpaceLeft <= FREE_SPACE_SIZE;
target.classList.toggle(CLASS_NO_FREE_SPACE, noFreeSpace);
});
};
const resizeObserver = new ResizeObserver(handleButtonResize);
[...butang].forEach((butang) => {
resizeObserver.observe(butang);
});</pre>
<p><strong>Soalan saya ialah:</strong></p>
<p>Adakah mungkin untuk mencapai kesan yang sama menggunakan CSS tulen? </p>
Memandangkan lebar ikon sentiasa sama (
2em
),我们可以使用::after
unsur pseudo bertindak sebagai "penampan" untuk mengimbangi ruang di sebelah kanan.Letak
.button__icon
设置为弹性布局流。这在“推动”其他元素时至关重要。给它margin-right
untuk mengimbangi padding kiri butang.Buat ruang yang mempunyai
flex-basis: calc(2em + 20px)
的::after
伪元素。其中2em
是.button__icon
的宽度,20px
是.button__icon
的margin-right
。这样可以在.button__text
seimbang kiri dan kanan apabila lebih pendek.akan
justify-content: space-between
应用于父元素,以帮助平衡.button__icon
、.button__text
和::after
当.button__text
menjadi lebih pendek.Tambah
flex-shrink: 999
,一个巨大的收缩因子,以便布局引擎在.button__text
较长时优先收缩::after
elemen.