Segerakkan semula nilai "offsetWidth" pada saiz semula penyemak imbas
P粉463811100
P粉463811100 2024-03-29 17:24:18
0
1
455

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.

  1. Saya mahu offsetWidth mengemas kini pada saiz semula supaya lebar kemas kini.
  2. Adakah mungkin untuk menggunakan 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>

P粉463811100
P粉463811100

membalas semua(1)
P粉920835423

Ideanya adalah, dalam resize 回调函数中,您只是更新父元素 (.palette) 的宽度,而不是子元素的宽度(.swatch anda).

Menggunakan kod JS baharu:

let palette = document.querySelector('.palette');
let swatchs = document.querySelectorAll('.swatch')

function setSwatchWidth(n = 5) {
  let paletteWidth = palette.offsetWidth;
  swatchs.forEach((swatch) => {
    swatch.style.width = (
      paletteWidth - (n-1) * 10
    ) / n + "px";
  });
}
onload = () => setSwatchWidth();
onresize = () => setSwatchWidth();

Bonus: Saya menjadikan fungsi ini lebih umum supaya anda boleh memilih bilangan kanak-kanak yang anda inginkan dalam tingkap gelongsor.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan