suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Synchronisieren Sie den Wert „offsetWidth“ bei der Größenänderung des Browsers neu

Ich habe ein horizontal scrollendes Div mit mehreren Unterelementen. Abhängig von der Breite können Unterelemente beschnitten werden. Es kann also sein, dass Sie am Ende 4 1/2 sichtbare Elemente haben. Daher verwende ich Javascript, um die Breite zu erzwingen, um die untergeordneten Elemente gleichmäßig zu verteilen.

Ich verwende Javascript, um .palette的宽度,并将其除以我想要显示的项目数(减去边距),并将其应用于每个.swatch zu erkennen. Sie sind sich nicht sicher, ob es einen besseren/einfacheren Weg gibt?

Wenn dies die Lösung ist, benötige ich Hilfe, um es verantwortungsvoller zu machen, damit es aktualisiert wird, wenn die Fenstergröße geändert wird.

  1. Ich möchte offsetWidth bei der Größenänderung aktualisieren, damit die Breite aktualisiert wird.
  2. Ist es möglich, matchMedia unterschiedliche Werte oberhalb bestimmter „Haltepunkte“ zu verwenden? Dieser Teil funktioniert!

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粉463811100240 Tage vor420

Antworte allen(1)Ich werde antworten

  • P粉920835423

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

    这个想法是,在您的 resize 回调函数中,您只是更新父元素 (.palette) 的宽度,而不是子元素的宽度(.swatch)。

    采用新的 JS 代码:

    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();
    

    奖励:我使该函数更加通用,以便您可以选择滑动窗口中想要有多少个子级。

    Antwort
    0
  • StornierenAntwort