我有一个水平滚动的div,它有几个子项。根据宽度的不同,子项可能会被裁剪。所以你可能会得到4个1/2可见项。所以我使用Javascript强制设置宽度,以均匀分布子项。
我使用Javascript来检测.palette
的宽度,并将其除以我想要显示的项目数(减去边距),然后将其应用于每个.swatch
。
如果这是解决方案,我需要一点帮助,使这更负责任,使它更新窗口的大小。
1.我想在offsetWidth
更新调整大小,使宽度更新。
1.是否可以使用matchMedia
在某些"断点"之上使用不同的值?这是部分工作!
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>
1条答案
按热度按时间tjvv9vkg1#
其思想是,在
resize
回调函数中,只更新父元素(.palette
)的宽度,而不更新子元素(.swatch
)的宽度。要采用的新JS代码:
**额外好处:**我使函数更通用,这样您就可以选择在滑动窗口中想要多少个孩子。