Динамическая горизонтальная ширина CSS Flex на основе ширины вложенного элемента

Я пытаюсь создать следующий макет с помощью CSS Flex. Это кажется простым, но есть одна сложная часть, которую я объясню ниже.

Динамическая горизонтальная ширина CSS Flex на основе ширины вложенного элемента

HTML:

<div class = "flex">

  <div class = "icon-col">
    <div class = "icon" style = "max-width:120px;">
      <svg>image code here...</svg>
    </div>  
  </div>

  <div class = "text-col">
    <h4>Awesome Design</h4>
    <p>Nullam vel sem. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur blandit mollis lacus. Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc.</p>
  </div>

</div>

CSS:

.flex {
  display: flex;
  flex-direction: row;
}

.icon-col, .text-col {
  flex: 1;
}

.icon {
  width: 100%;
}

Предварительный просмотр кода:https://codepen.io/anon/pen/KEjJeO

Как видно на превью, между иконкой и текстом слишком много места. Значок должен иметь размер 120 пикселей, как указано во встроенном CSS, а ширина текстового столбца должна увеличиваться или уменьшаться в зависимости от размера значка.

Попробуйте сложную часть:

Значок имеет динамическую ширину.

Я могу определить ширину значка, используя только встроенный стиль в HTML, в элементе .icon, как показано выше в HTML.

У меня нет контроля над элементом .icon-col, поскольку я добавляю ему динамическую ширину. Было бы легко, если бы я мог просто добавить ширину к .icon-col.

Я также не могу добавить ширину к .text-col, потому что он должен автоматически изменяться в зависимости от размера значка.

Как .icon-col может иметь ту же ширину, что и его дочерний элемент .icon, и автоматически изменять размер текстового столбца?

Объяснение слишком широкое. можете сделать короткую заметку в комментарии

Saravana 28.03.2019 07:41

Очень запутанно. Можете ли вы уточнить свой вопрос?

Andy Hoffman 28.03.2019 07:41

ваша ссылка на codepen также не работает. отредактируйте вопрос и добавьте короткую заметку со скриншотом, как и ожидалось.

Saravana 28.03.2019 07:43

@Saravana сайт codepen, кажется, не работает

CyberJ 28.03.2019 07:45

Короче говоря, я хочу создать макет на картинке, но могу добавить ширину только к элементу .icon

CyberJ 28.03.2019 07:46

поэтому содержимое приближается в зависимости от ширины значка? Вы используете значок svg или источник изображения.

Saravana 28.03.2019 07:53

почему бы не добавить flex-grow:0 к icon-col?

Temani Afif 28.03.2019 09:33

@Саравана svg значок

CyberJ 28.03.2019 10:48
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
8
137
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете группировать и перемещать вещи, но это просто для того, чтобы получить представление.

.flex2 {
  width: 100%;
  display: flex;
  flex-direction: row;
  align-items: center;
  background-color: blue;
}

.icon-col {
  flex: 1 1 20%;
  background-color: #ff0000;
  position: relative;
  padding: 20px;
}

.abacadabra {
  width: 120px;
  max-width: 120px;
  position: relative;
  float: right;
  right: 5px
}

.text-col {
  flex: 1 1 80%;
  background-color: #ffff00;
  padding: 20px
}
<div class = "flex2">

  <div class = "icon-col">
    <div class = "abacadabra">
      <svg aria-hidden = "true" data-prefix = "fas" data-icon = "tools" class = "svg-inline--fa ugbfa-tools fa-w-16 " role = "img" xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 512 512"><path fill = "currentColor" d = "M501.1 395.7L384 278.6c-23.1-23.1-57.6-27.6-85.4-13.9L192 158.1V96L64 0 0 64l96 128h62.1l106.6 106.6c-13.6 27.8-9.2 62.3 13.9 85.4l117.1 117.1c14.6 14.6 38.2 14.6 52.7 0l52.7-52.7c14.5-14.6 14.5-38.2 0-52.7zM331.7 225c28.3 0 54.9 11 74.9 31l19.4 19.4c15.8-6.9 30.8-16.5 43.8-29.5 37.1-37.1 49.7-89.3 37.9-136.7-2.2-9-13.5-12.1-20.1-5.5l-74.4 74.4-67.9-11.3L334 98.9l74.4-74.4c6.6-6.6 3.4-17.9-5.7-20.2-47.4-11.7-99.6.9-136.6 37.9-28.5 28.5-41.9 66.1-41.2 103.6l82.1 82.1c8.1-1.9 16.5-2.9 24.7-2.9zm-103.9 82l-56.7-56.7L18.7 402.8c-25 25-25 65.5 0 90.5s65.5 25 90.5 0l123.6-123.6c-7.6-19.9-9.9-41.6-5-62.7zM64 472c-13.2 0-24-10.8-24-24 0-13.3 10.7-24 24-24s24 10.7 24 24c0 13.2-10.7 24-24 24z"></path></svg>
    </div>
  </div>

  <div class = "text-col">
    <h4>Awesome Design</h4>
    <p>Nullam vel sem. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur blandit mollis lacus. Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc.</p>
  </div>

</div>

Другие вопросы по теме