提问者:小点点

CSS缩放flexbox内容以适应


假设我有一个flexbox,里面填满了一些方块。。。

null

const init = () => {
  const container = document.querySelector('.container')
  for(const i of Array(70).keys()){
    const square = document.createElement('div')
    square.classList.add('square')
    container.appendChild(square)
  }
}

init()
* {
  box-sizing: border-box;
}

.container {
  height: 100%;
  width: 100%;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
}

.square{
    background-color: orange;
    height: 8em;
    width: 8em;    
    margin: .2em;
    perspective: 1000px;
}
<div class="container">
</div>

null

我现在希望这些方块收缩,直到全部适合一个非滚动容器(当然,同时保持纵横比)。

我该怎么做?


共2个答案

匿名用户

这是一个非常manuel的解决方案。 如果您正确设置MainContainer的宽度和高度,它将保持同步。

null

const init = () => {
  const container = document.querySelector('.container');
  const l = 70; //how many element you want
  const h = container.clientHeight;
  const w = container.clientWidth;
  for(const i of Array(l).keys()){
    const square = document.createElement('div')
    square.classList.add('square');
    const x = parseInt(Math.sqrt((w*h) / (l)));
    const xcount = Math.ceil(w/x);
    const xLength = Math.ceil(w / xcount);
    const ycount = Math.ceil((l/xcount));
    const yLength = parseInt(h / ycount);
    const edge = Math.min(xLength, yLength);
    square.style.width = edge + "px";
    square.style.height = edge + "px";
    container.appendChild(square)
  }
}

init()
* {
  box-sizing: border-box;
}

.mainContainer{
  width: 500px;
  height: 150px;
  min-height: 100%;
  background-color: #dfdfdf;
}

.container {
  height: 100%;
  width: 100%;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
}

.square{
    background-color: orange;
    border: solid 1px;
    height: 1px;
    width: 1px;    
}
<div class="mainContainer"><div class="container">
</div></div>

匿名用户

我试过这样做,但当您调整大小时,需要重新加载,以便使clientwidts检测和预测框的高度和宽度

null

(function(){
    const init = () => {
        const container = document.querySelector('.container')
        for(const i of Array(70).keys()){
            const square = document.createElement('div')
            square.classList.add('square')
            var w = document.body.clientWidth;
            if (w > 800){
                square.style.width = w / 385 + 'em';
                square.style.height = w/ 395 + 'em';
                square.style.margin = .3 + 'em';
            } else {
                square.style.width = w / 475 + 'em';
                square.style.height = w/ 485 + 'em';
                square.style.margin = .2 + 'em';
            }
            container.appendChild(square)
        }
    }
init()
}())
*{
  box-sizing: border-box;
  padding: 0;
  margin: 0;
}

.container {
    position: relative;
    max-height: 100vh;
    width: 100%;
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
}

.square{
    background-color: orange;
    perspective: 1000px;
}
<div class="container"></div>