CSS для выравнивания столбца по правому краю на основе самого широкого элемента

У меня макет из двух столбцов, как на этом рисунке:

введите описание изображения здесь

Каждый столбец содержит строки, состоящие из значка и метки текста.

Каждая строка левого столбца должна быть выровнена по левому краю, как есть.

Строки правого столбца должны быть выровнены таким образом, чтобы самая широкая строка касалась правого края родительского контейнера, а остальные строки выровнялись так, чтобы их левые края были выровнены, как на этом рисунке:

введите описание изображения здесь

Трудно обдумать это ... Я подумываю установить display контейнера на flex, установить flex каждого столбца на 1, чтобы они были одинаковой ширины, а затем попытаться что-то сделать со строками правого столбца , но я не знаю что. Я не знаю заранее, какими будут подписи к тексту, но уверен, что они могут сильно различаться по длине и могут переноситься. Можно ли выровнять этикетку упаковки по правому краю после упаковки?

Вот код, который у меня есть, https://jsfiddle.net/t7qksr3g/1/. Он основан на ответе @Kretiss, но работает некорректно. Когда текст в правом столбце переносится, он не выравнивается по правому краю.

Я надеюсь, что кто-то может мне помочь. Решение может полностью отличаться от того, что я описал выше, это не требование, чтобы строки действительно находились внутри вертикальных контейнеров, мне просто нужно добиться визуального эффекта.

ОБНОВЛЕНИЕ

Я думаю, что то, что я хочу достичь, может быть невозможно без использования JS, потому что логика браузера для вычисления ширины контейнера с обернутым текстом внутри не работает таким образом, чтобы это позволяло Ширина CSS / максимальная ширина при переносе строки?.


person Salivan    schedule 02.03.2021    source источник
comment
По крайней мере, приведите пример структуры HTML, чтобы людям было с чем работать (без необходимости создавать это самостоятельно).   -  person CBroe    schedule 02.03.2021
comment
@CBroe Я не хочу ограничивать решения структурой, о которой я думаю, поскольку я понятия не имею, как могло бы выглядеть простейшее или, возможно, единственное возможное решение.   -  person Salivan    schedule 02.03.2021
comment
«Можно ли выровнять этикетку упаковки по правому краю после того, как она была упакована?» - в общем сложно, см. например. stackoverflow.com/q/41389292/1427878   -  person CBroe    schedule 02.03.2021


Ответы (1)


В конце концов, я нашел решение. Поскольку мое исходное решение уже включено в вопрос, я отредактирую этот ответ на новый.

Вот рабочая скрипка: https://jsfiddle.net/Kretiss/mbt68qw2/

Во-первых, это HTML. Добавьте класс editWidth в абзацы, которые можно редактировать.

<div class="container">

    <div class="column">
      <div class="columnChild">
        <img src="smile.jpg">
        <p class="">Some text</p>
      </div>
      <div class="columnChild">
        <img src="smile.jpg">
        <p>Some text that wraps because its long long long</p>
      </div>
      <div class="columnChild">
        <img src="smile.jpg">
        <p>Some text</p>
      </div>
    </div>

    <div class="column">
        <div class="columnChild">
          <img src="smile.jpg">
          <p>Some longerrrrr text</p>
        </div>
        <div class="columnChild">
          <img src="smile.jpg">
          <p>Some text</p>
        </div>
        <div class="columnChild">
          <img src="smile.jpg">
          <p class="editWidth">Some text that wraps because its long sad Some text that wraps because its long</p>
        </div>
    </div>

  </div>

CSS почти такой же.

*{
  box-sizing: border-box;
}

.container{
  max-width: 500px;
  width: 100%;
  margin: 0 auto;
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  border: 2px solid black;
}

.column{
  width: fit-content;
  width: -moz-fit-content;
  width: -webkit-fit-content;
  border: 1px solid red;
}

.columnChild{
  display: flex;
  justify-content:flex-start;
  align-items: center;
}

.columnChild img{
  height: 50px;
}

А вот и волшебство. Включите JQuery в файл, например, с помощью этого сценария <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>, а затем добавьте этот сценарий:

<script>
$(document).ready(function(){

  $.fn.textWidth = function(){
    const html_org = $(this).html();
    const html_calc = '<span>' + html_org + '</span>';
    $(this).html(html_calc);
    const width = $(this).find('span:first').width();
    $(this).html(html_org);
    return width;
  };

  function changeWidth(resizing){
    const elements = $(".editWidth");

    elements.each(function(index){
      if(resizing) $(this).css("width", "auto");

      const currentWidth = $(this).textWidth();
      $(this).css("width", currentWidth + 2);

    });

  }

  changeWidth(false);

  $(window).resize(function(){
    changeWidth(true);
  });

});

</script>

Все начинается с changeWidth(false); после загрузки DOM. Он вызывает функцию changeWidth(resizing) с аргументом false, потому что окна браузера не меняют размер. Эта функция перебирает все параграфы, в которых содержится класс editWidth. Внутри функции .each() вызывается функция $.fn.textWidth, которая возвращает точную ширину текста внутри абзацев. После этого строка $(this).css("width", currentWidth + 2); устанавливает ширину абзаца равной ширине текста + 2 пикселя (при желании можно изменить).

И когда пользователь изменяет размер браузера,

$(window).resize(function(){
  changeWidth(true);
});

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

Функция, которая возвращает точную ширину текста, взята из этого сообщения: Расчет ширины текста

person Kretiss    schedule 02.03.2021
comment
Столбец не может иметь статическую ширину, т.е. max-width: 200px;. Он должен быть максимально широким. Вот откуда взялась сложность. - person Salivan; 02.03.2021
comment
Текст может переноситься и т. Д. - person Salivan; 02.03.2021
comment
Да, но как вы хотите сократить расстояние между ними? - person Kretiss; 02.03.2021
comment
Возможно, вы можете изменить css столбца на это: max-width: fit-content; max-width: -moz-fit-content; width: 40%;, и с шириной определите, насколько широким он будет. - person Kretiss; 02.03.2021
comment
Разрыв не обязателен, дети столбика могут касаться друг друга. Цель состоит в том, чтобы выровнять самый широкий дочерний столбец правого столбца по правому краю и все остальные на основе этого. Здесь я изменил ваш код, чтобы не устанавливать статическую ширину для столбца, и включил текст, который обертывает jsfiddle.net/t7qksr3g. Теперь он неправильно выравнивается по правому краю. - person Salivan; 02.03.2021
comment
Я думаю, это невозможно stackoverflow.com/questions/12377826/, потому что логика браузера для установки ширины контейнера с переносом текста внутри так не работает. - person Salivan; 02.03.2021
comment
@Salivan Я нашел решение и скорректировал ответ. - person Kretiss; 02.03.2021