Как сделать, чтобы вертикальные дочерние элементы гибкого контейнера имели независимую ширину - PullRequest
0 голосов
/ 15 января 2020

Я считаю, что это невозможно с flexbox, так как я не нашел способа сделать это, но, возможно, я что-то упустил.

Один родительский контейнер имеет два дочерних контейнера - один под другим. Ширина второго дочернего элемента (links-container) увеличивается, как только мы загружаем файл HTML со ссылками с длинным текстом. Когда это происходит, ширина первого дочернего элемента (form-wrapper) также увеличивается - так как второй дочерний элемент фактически расширяет весь родительский элемент, и оба его дочерних элемента регулируют свою ширину. Однако мне нужно сохранить ширину первого дочернего элемента (form-wrapper) такой, какой она была раньше.

Я получил эффект, используя display: inline-block для дочернего элемента, ширину которого я хочу сохранить , Но возможно ли это сделать с помощью свойств flexbox?

Вот код. Чтобы увидеть проблему - удалите деталь .form-wrapper {display: inline-block;} из css.

В коде ручки https://codepen.io/bakrall/pen/rNaZKgq У меня тот же код, но уже без display: inline-block; для comaprison. Вы увидите, как увеличивается ширина кнопки загрузки после загрузки файла html со ссылками.

(function(){
	function bindUiEvents() {
		$('#file-upload').change( function() { 
			renderLinks(this.files[0]);
		});
	}

	function renderLinks(file) {
		const reader = new FileReader(),
			$linksContainer = $('.links-container');

		reader.onload = function(event) {
			const text = event.target.result,
				pattern = /(<a.+)(<\/a>)/gm,
				links = text.match(pattern);

			$linksContainer.empty();

			links.forEach(link => {
				$linksContainer.append(
					`<li class='link-item'>${link}</li>`
				)
			});
		}

		reader.readAsText(file);
	}

	bindUiEvents();
})();
html {
	font-size: 16px;
}

body {
	display: flex;
	justify-content: center;
	height: calc(100vh - 5rem);
	margin: 5rem 0 0;
	background-color: #007da1;
}

h1 {
	padding: 0 0.4rem;
}

.form-wrapper {
	display: inline-block;
}

.link-harvester-form fieldset {
	margin: 0;
	border: 0;
	padding: 0;
	color: #fff;
}

#file-upload {
  border: 0;
  clip: rect(0, 0, 0, 0);
  height: 1px;
  overflow: hidden;
  padding: 0;
  position: absolute !important;
  white-space: nowrap;
  width: 1px;
}
 
#file-upload + label {
  background-color: #12312b;
  border-radius: 4rem;
  color: #fff;
  cursor: pointer;
  display: inline-block;
  padding: 1rem 2rem;
  box-shadow: 0 0 3px #12312b;
  box-sizing: border-box;
  width: 100%;
  text-align: center;
  text-transform: uppercase;
}
  
#file-upload:focus + label,
#file-upload + label:hover {
    background-color: #06425b;
}
  
#file-upload:focus + label {
  outline: 1px dotted #000;
}

.links-container {
	margin-top: 1.25rem;
	list-style: none;
	padding: 0 0 0 5px;
	font-size: 1.3rem;
}

.links-container a {
	color: #12312b;
	font-weight: bold;
}

.link-item {
	margin: 5px 0;
}
<body>
    <div class="link-harvester-wrapper">
        <div class="form-wrapper">
            <h1>Link Harvester</h1>
            <form class="link-harvester-form">
               <fieldset>
                <input id="file-upload" type="file">
                <label for="file-upload">Upload file</label>
            </fieldset>
            </form>
        </div>
        <ul class="links-container"></ul>
    </div>

    <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
crossorigin="anonymous"></script>
    <script src="js/linkHarvester.js"></script>
</body>

1 Ответ

1 голос
/ 16 января 2020

Вы можете контролировать это с помощью свойства flex. Он принимает три параметра: flex-grow, flex-shrink и flex-basis. Основой гибкости является начальная ширина элемента. Flex Grow - это рост элемента, если контейнер шире, чем сумма ширины элементов. Сжатие при изгибе - это степень сжатия элемента, если контейнер уже, чем сумма ширины элементов.

Таким образом, они оба имеют основу в 200 пикселей. Первый элемент имеет значение flex flex, равное 0, что означает, что он будет поддерживать ширину 200 пикселей. Последний элемент имеет изгиб в 1, что означает, что он будет занимать всю ширину родительского контейнера. Поскольку он также имеет ширину 300 пикселей, он расширит контейнер до 300 пикселей, а затем убедитесь, что он занимает эту ширину.

*{box-sizing: border-box}

.par{
    display: inline-flex;
    flex-wrap: wrap;
    border: solid 3px dodgerblue;
    height: 80vh;
}

.chi{
    border: solid 3px orangered;
    height: 50%;
}

.chi:first-child{
    background: orangered;
    flex: 0 0 200px;
}

.chi:last-child{
    width: 300px;
    flex: 1 0 200px;
}
<div class="par">
    <div class="chi"></div>
    <div class="chi"></div>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...