Saya mempunyai div menatal mendatar dengan beberapa sub-item. Bergantung pada lebar, subitem boleh dipangkas. Jadi anda mungkin akan mendapat 4 dan 1/2 item yang kelihatan. Oleh itu, saya menggunakan Javascript untuk memaksa lebar untuk mengagihkan kanak-kanak secara sama rata.
Saya menggunakan Javascript untuk mengesan .palette
的宽度,并将其除以我想要显示的项目数(减去边距),并将其应用于每个.swatch
. Tidak pasti jika ada cara yang lebih baik/mudah?
Jika ini penyelesaiannya, saya memerlukan bantuan untuk menjadikannya lebih bertanggungjawab supaya ia dikemas kini apabila saiz tetingkap diubah suai.
offsetWidth
mengemas kini pada saiz semula supaya lebar kemas kini. matchMedia
nilai yang berbeza di atas "titik putus" tertentu? Bahagian ini berfungsi!
let palette = document.querySelector('.palette'); let paletteWidth = palette.offsetWidth; let swatch = document.querySelectorAll('.swatch') swatch.forEach((item) => { if (window.matchMedia("(min-width: 700px)").matches) { item.style.width = (paletteWidth - 40) / 5 + "px"; } else { item.style.width = (paletteWidth - 30) / 4 + "px"; } }); const handleResize = () => { let paletteWidth = palette.offsetWidth; }; window.addEventListener('resize', handleResize);
.p-card { background: #eee; box-sizing: border-box; display: flex; flex-shrink: 0; overflow: hidden; padding: 30px 15px; max-width: 50%; } .palette { display: flex; overflow-x: scroll; } .palette__inner { display: flex; overflow-x: scroll; scroll-snap-type: x mandatory; scrollbar-width: none; /* Firefox */ -ms-overflow-style: none; /* IE and Edge */ } .palette__inner::-webkit-scrollbar { display: none; } .palette__group { display: flex; flex-direction: column; } .palette__title { font-family: "Arial", sans-serif; font-size: 11px; font-weight: normal; margin: 0 10px 10px 0; padding: 0; position: sticky; align-self: flex-start; left: 0; } .palette__swatches { display: flex; } .swatch { background: red; display: flex; height: 20px; margin-right: 10px; scroll-snap-align: start; width: 40px; }
<div class="p-card"> <div class="palette"> <div class="palette__inner"> <div class="palette__group"> <h4 class="palette__title">Classic</h4> <div class="palette__swatches"> <div class="swatch" style="background: red;"></div> <div class="swatch" style="background: red;"></div> <div class="swatch" style="background: red;"></div> <div class="swatch" style="background: red;"></div> <div class="swatch" style="background: red;"></div> <div class="swatch" style="background: red;"></div> </div> </div> <div class="palette__group"> <h4 class="palette__title">Matte</h4> <div class="palette__swatches"> <div class="swatch" style="background: blue;"></div> <div class="swatch" style="background: blue;"></div> <div class="swatch" style="background: blue;"></div> <div class="swatch" style="background: blue;"></div> <div class="swatch" style="background: blue;"></div> <div class="swatch" style="background: blue;"></div> </div> </div> <div class="palette__group"> <h4 class="palette__title">Glimmer</h4> <div class="palette__swatches"> <div class="swatch" style="background: green;"></div> <div class="swatch" style="background: green;"></div> <div class="swatch" style="background: green;"></div> <div class="swatch" style="background: green;"></div> <div class="swatch" style="background: green;"></div> <div class="swatch" style="background: green;"></div> </div> </div> </div> </div> </div>
Ideanya adalah, dalam
resize
回调函数中,您只是更新父元素 (.palette
) 的宽度,而不是子元素的宽度(.swatch
anda).Menggunakan kod JS baharu:
Bonus: Saya menjadikan fungsi ini lebih umum supaya anda boleh memilih bilangan kanak-kanak yang anda inginkan dalam tingkap gelongsor.