Как я могу заставить этот flexbox расширяться с помощью flex-элементов?

В моем примере кода нажмите кнопку "Создать контент", чтобы понять проблему.

Как только вы нажмете на кнопку, вы увидите, что все гибкие элементы (.each-result) сгенерированы. Они почти полностью заключены в div/flexbox (.result-container), обозначенные синей пунктирной рамкой. Если я удалю поля из flex-элементов, они идеально впишутся в div. Однако, когда я добавляю поля, родительский div (т.е. flexbox) не расширяется до полной ширины; он остается той же ширины, что и при отсутствии полей.

Можно ли как-то изменить это, чтобы div расширялся при добавлении поля?

const leftArrow = document.querySelector('#left-arrow');
const rightArrow = document.querySelector('#right-arrow');
const rootDiv = document.querySelector('#root');
const generateButton = document.querySelector("#button-generate");
var navMargin = '';
let rootContainerWidth = window.getComputedStyle(rootDiv, null).getPropertyValue("width");
console.log(`Window size onload: ${rootContainerWidth}`);
window.addEventListener('resize', () => {
  rootContainerWidth = window.getComputedStyle(rootDiv, null).getPropertyValue("width");
  console.log(`The new window size is ${rootContainerWidth}`);
})
//This code basically generates the content within the div
generateButton.addEventListener("click", () => {
  for (let i = 0; i < 10; i++) {
    const newDiv = document.createElement("div");
    newDiv.classList.add("each-result");
    newDiv.appendChild(addImg("https://uk.usembassy.gov/wp-content/uploads/sites/16/please_read_icon_150x150.jpg"));
    rootDiv.appendChild(newDiv);  
  }
  rootDiv.firstElementChild.classList.add('nav-margin');
  navMargin = document.querySelector('.nav-margin');
});

//These enable the arrow to scroll through the dynamically generated content
// function navArrow () {
//   leftArrow.addEventListener('click', () => {
 
//   });
// rightArrow.addEventListener('click', () => {
//   if ()
//   });
// }




//Simple function to create and image element with the src attribute set in one line
function addImg(url) {
  const newImg = document.createElement("img");
  newImg.setAttribute("src", url);
  return newImg;
}
html, body {
  height: 100%;
}

button {
  position: relative;
  z-index: 1
  width: auto;
  height: 50px;
}

.container {
  display: flex;
  justify-content: center;
  position: relative;
  top: 15%;
  z-index: 0
}

.each-result {
  height: 150px;
  width: 150px;
  border: 3px dotted red;
  margin: 0 1%;
}
img {
  height: 100%;
  width: auto;
}
.nav-arrows {
  display: flex;
  justify-content: space-between;
  width: 100%;
  height: auto;
  position: absolute;
  background: clear;
  pointer-events: none;
}

#left-arrow, #right-arrow {
  pointer-events: auto;
}

#root-container {
  display: flex;
  align-items: center;
  border: 1px solid black;
  height: 200px;
  position: relative;
  flex-flow: row no-wrap;
/*   overflow: hidden; */
  width: 100%;
}

.result-container {
  display: flex;
  border: 2px blue dotted;
  
}
<script src="https://use.fontawesome.com/releases/v5.0.6/js/all.js"></script>
<div class="container">
  <div class="nav-arrows">
      <button id="left-arrow"><i class="fas fa-arrow-alt-circle-left"></i>
      </button>
        <button id="right-arrow"> <i class="fas fa-arrow-alt-circle-right"></i>
      </button>
    </div>
  <div id="root-container">
  <div id="root" class="result-container">
  </div>
  </div>

</div>
<button id="button-generate">Generate Content</button>


person WonkasWilly    schedule 25.02.2018    source источник
comment
Как предполагает обман, все, что вам нужно, это, например. используйте единицы области просмотра вместо процентов для поля, margin: 0 1vw.   -  person Ason    schedule 25.02.2018
comment
Добавление margin: 0 1vw; не дает желаемого результата.   -  person Brett DeWoody    schedule 25.02.2018
comment
Использование единиц Viewport определенно сделало свое дело. Я также оценил ваш другой ответ.   -  person WonkasWilly    schedule 25.02.2018
comment
@BrettDeWoody Конечно, да (и так говорит ОП). В этом случае 1% берется из родителя, который имеет полную ширину области просмотра, и с этим 1% = 1 vw.   -  person Ason    schedule 26.02.2018
comment
Согласитесь не согласиться @LGSon. С 1vw расстояние не то же самое.   -  person Brett DeWoody    schedule 26.02.2018
comment
@BrettDeWoody Вы имеете в виду в приведенном выше случае, когда 1% не создает такой же интервал, как 1vw?   -  person Ason    schedule 26.02.2018
comment
@BrettDeWoody Или вы имеете в виду, что 1% элемента, занимающего 100% области просмотра, не совпадает с 1vw?   -  person Ason    schedule 26.02.2018
comment
Первый - 1vw не дает того же результата, что и 1%.   -  person Brett DeWoody    schedule 26.02.2018
comment
@BrettDeWoody Точно ... и дубликат объясняет, почему, и в этом случае, когда родитель занимает всю ширину области просмотра, 1% в негибкой настройке будет таким же, как 1vw, следовательно, 1vw можно использовать для достижения хотел вывод.   -  person Ason    schedule 27.02.2018


Ответы (1)


Если margin может быть фиксированным значением (вместо процента), мы можем calc() ширины элемента учитывать поля. Например, если бы нам нужно было поле 20px, мы бы сделали следующее для элементов .each-result:

.each-result {
  width: calc(10% + 20px);
  margin: 0 20px;
}

Вот рабочая демонстрация:

const leftArrow = document.querySelector('#left-arrow');
const rightArrow = document.querySelector('#right-arrow');
const rootDiv = document.querySelector('#root');
const generateButton = document.querySelector("#button-generate");
var navMargin = '';
let rootContainerWidth = window.getComputedStyle(rootDiv, null).getPropertyValue("width");
console.log(`Window size onload: ${rootContainerWidth}`);
window.addEventListener('resize', () => {
  rootContainerWidth = window.getComputedStyle(rootDiv, null).getPropertyValue("width");
  console.log(`The new window size is ${rootContainerWidth}`);
})
//This code basically generates the content within the div
generateButton.addEventListener("click", () => {
  for (let i = 0; i < 10; i++) {
    const newDiv = document.createElement("div");
    newDiv.classList.add("each-result");
    newDiv.appendChild(addImg("https://uk.usembassy.gov/wp-content/uploads/sites/16/please_read_icon_150x150.jpg"));
    rootDiv.appendChild(newDiv);  
  }
  rootDiv.firstElementChild.classList.add('nav-margin');
  navMargin = document.querySelector('.nav-margin');
});

//These enable the arrow to scroll through the dynamically generated content
// function navArrow () {
//   leftArrow.addEventListener('click', () => {
 
//   });
// rightArrow.addEventListener('click', () => {
//   if ()
//   });
// }




//Simple function to create and image element with the src attribute set in one line
function addImg(url) {
  const newImg = document.createElement("img");
  newImg.setAttribute("src", url);
  return newImg;
}
html, body {
  height: 100%;
}

button {
  position: relative;
  z-index: 1
  width: auto;
  height: 50px;
}

.container {
  display: flex;
  justify-content: center;
  position: relative;
  top: 15%;
  z-index: 0
}

.each-result {
  height: 150px;
  width: calc(10% + 20px);
  margin: 0 20px;
  border: 3px dotted red;
}

img {
  height: 100%;
  width: auto;
}
.nav-arrows {
  display: flex;
  justify-content: space-between;
  width: 100%;
  height: auto;
  position: absolute;
  background: clear;
  pointer-events: none;
}

#left-arrow, #right-arrow {
  pointer-events: auto;
}

#root-container {
  display: flex;
  align-items: center;
  border: 1px solid black;
  height: 200px;
  position: relative;
  flex-flow: row no-wrap;
/*   overflow: hidden; */
  width: 100%;
}

.result-container {
  display: flex;
  border: 2px blue dotted;
}
<script src="https://use.fontawesome.com/releases/v5.0.6/js/all.js"></script>
<div class="container">
  <div class="nav-arrows">
      <button id="left-arrow"><i class="fas fa-arrow-alt-circle-left"></i>
      </button>
        <button id="right-arrow"> <i class="fas fa-arrow-alt-circle-right"></i>
      </button>
    </div>
  <div id="root-container">
  <div id="root" class="result-container">
  </div>
  </div>

</div>
<button id="button-generate">Generate Content</button>

person Brett DeWoody    schedule 25.02.2018
comment
Нет абсолютно никакой причины возиться с calc();, это полностью связано с проблемой использования процентов на flex дочерних элементах, поэтому я закрыл это как дубликат. - person Ason; 25.02.2018