cari

Rumah  >  Soal Jawab  >  teks badan

Segerakkan semula nilai "offsetWidth" pada saiz semula penyemak imbas

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粉463811100P粉463811100287 hari yang lalu469

membalas semua(1)saya akan balas

  • P粉920835423

    P粉9208354232024-03-30 15:55:14

    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.

    balas
    0
  • Batalbalas