Соединение двух текстов через многоточие на CSS

Вот пример того что надо получить

https://codepen.io/spensersab/pen/MWLBNKo

li {
  width: 400px;
  overflow: hidden;
  border: 0px solid red;
}

li+li {
  margin-top: 10px;
}

li:after {
  border: 0px solid green;
  content: '.....................................................................................................';
  display: block;
  white-space: nowrap;
  overflow: hidden;
  margin-top: 2pt;
}

li .challenge {
  border: px solid blue;
  float: left;
  background-image: url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PScwIDAgNCAyJyBoZWlnaHQ9JzInIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PGNpcmNsZSBjeD0nMicgY3k9JzAuOCcgcj0nMC44Jy8+PC9zdmc+");
  background-repeat: repeat-x;
  background-position: 0 calc(100% - 1.5pt);
}

li .challenge:after {
  border: 1px solid green;
  content: '.....................................................................................................';
  display: block;
  white-space: nowrap;
  overflow: hidden;
  float: left;
  margin-top: -100%;
}

li .challenge span {
  background-color: #fff;
}

li .response {
  border: 0px solid orange;
  float: right;
  text-align: right;
  background-image: url("data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PScwIDAgNCAyJyBoZWlnaHQ9JzInIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PGNpcmNsZSBjeD0nMicgY3k9JzAuOCcgcj0nMC44Jy8+PC9zdmc+");
  background-repeat: repeat-x;
  background-position: 0 11pt;
}

li .response span {
  background-color: #fff;
  padding-left: 1pt;
}
<ul>
  <li>
    <span class="challenge"><span>challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge</span></span>
    <span class="response"><span>response response response response response response response</span></span>
  </li>
  <li>
    <span class="challenge"><span>challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge</span></span>
    <span class="response"><span>response response</span></span>
  </li>
  <li>
    <span class="challenge"><span>challenge challenge </span></span>
    <span class="response"><span>response response response response response response response response response response</span></span>
  </li>
  <li>
    <span class="challenge"><span>challenge</span></span>
    <span class="response"><span>response</span></span>
  </li>
</ul>

Первых три пункта работаю правильно.

Четвертый пункт должен располагаться в одной строке т.к. левый и правый тексты короткие, но не могу ничего придумать.

Как что можно придумать? JS нельзя использовать.

Дополнение по задаче

Задача следующая: Надо сделать что то вроде содержания с правым и левым текстами. Количество текста с обоих сторон заранее не известно.

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

Случай второй: левая часть длинная (несколько строк), то эта строка должна дополниться многоточие до конца строки, а правая часть должна начаться на следующей строки, в начале должно быть минимальное расстояние с точкам (например 30пикс) и дальше правый текст. Правый текст должен прижат к правой стороне. Он так же может быть в одне или несколько строк

Может сумбурно написал, но вроде как на примере видно как должно работать. Но не работает случай когда они оба текста помещаются в одну строку.


Ответы (1 шт):

Автор решения: UModeL

Думаю, что решение ниже - это максимум, что можно сделать без скриптов и существенного вмешательства в разметку.

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

ul {
  margin: 0;
  display: flex;
  flex-direction: column;
  width: 400px;
  padding: 0.5em;
  /* For example only --> */ background-color: #ccf; overflow: scroll; resize: both;
}

li {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-content: flex-start;
  /* For example only --> */ background-color: #cdd;
}
li + li { margin-top: 2em; }

li > span.challenge {
  min-width: fit-content;
  flex: 1;
  background: left bottom 0.25em / 4px 2px radial-gradient(circle, #f0f 0 0.5px, #f0f0 1px) repeat-x;
}
li > span.response {
  margin-left: auto;
  min-width: fit-content;
  flex: 1;
  text-align: right;
  background: left top 0.75em / 4px 2px radial-gradient(circle, #f0f 0 0.5px, #f0f0 1px) repeat-x;
}

li > span.challenge > span { background-color: #fff; padding-right: 5px; }
li > span.response > span { background-color: #fff; padding-left: 5px; }
<ul>
  <li>
    <span class="challenge"><span>challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge</span></span>
    <span class="response"><span>response response response response response response response</span></span>
  </li>
  <li>
    <span class="challenge"><span>challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge</span></span>
    <span class="response"><span>response response</span></span>
  </li>
  <li>
    <span class="challenge"><span>challenge challenge </span></span>
    <span class="response"><span>response response response response response response response response response response</span></span>
  </li>
  <li>
    <span class="challenge"><span>challenge</span></span>
    <span class="response"><span>response</span></span>
  </li>
</ul>

Запустите сниппет и разверните на полный экран, измените размеры списка, "ухватив" его за правый нижний угол, чтобы проверить адаптивность. Цвета добавлены для наглядности работы. Необязательные строки помечены комментариями.


Данное оформление я использую для формирования ПДФ файла с помощью модуля WeasyPrint. В документации написано "The min-content, max-content and fit-content() sizing values are not supported." Вот ссылка на документацию weasyprint CSS. Есть ли возможность переделать ваше решение?

Если отказаться от использования вычисляемых значений, тогда response будет всегда начинаться ниже, и поставить его в одну строку с challenge не получится:

ul {
  margin: 0;
  display: flex;
  flex-direction: column;
  width: 400px;
  padding: 0.5em;
  /* For example only --> */ background-color: #ccf; overflow: scroll; resize: both;
}

li {
  display: flex;
  flex-direction: column;
  /* For example only --> */ background-color: #cdd;
}
li + li { margin-top: 2em; }

li > span.challenge {
  background: left bottom 0.25em / 4px 2px radial-gradient(circle, #f0f 0 0.5px, #f0f0 1px) repeat-x;
}
li > span.response {
  text-align: right;
  background: left top 0.75em / 4px 2px radial-gradient(circle, #f0f 0 0.5px, #f0f0 1px) repeat-x;
}

li > span.challenge > span { background-color: #fff; padding-right: 5px; }
li > span.response > span { background-color: #fff; padding-left: 5px; }
<ul>
  <li>
    <span class="challenge"><span>challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge</span></span>
    <span class="response"><span>response response response response response response response</span></span>
  </li>
  <li>
    <span class="challenge"><span>challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge</span></span>
    <span class="response"><span>response response</span></span>
  </li>
  <li>
    <span class="challenge"><span>challenge challenge </span></span>
    <span class="response"><span>response response response response response response response response response response</span></span>
  </li>
  <li>
    <span class="challenge"><span>challenge</span></span>
    <span class="response"><span>response</span></span>
  </li>
</ul>

ul {
  margin: 0;
  display: flex;
  flex-direction: column;
  width: 400px;
  padding: 0.5em;
  /* For example only --> */ background-color: #ccf; overflow: scroll; resize: both;
}

li {
  /* For example only --> */ background-color: #cdd;
}
li + li { margin-top: 2em; }

li > span.challenge {
  width: 100%;
  display: inline-block;
  text-align: left;
  background: left bottom 0.25em / 4px 2px radial-gradient(circle, #f0f 0 0.5px, #f0f0 1px) repeat-x;
}
li > span.response {
  width: 100%;
  display: inline-block;
  text-align: right;
  background: left top 0.75em / 4px 2px radial-gradient(circle, #f0f 0 0.5px, #f0f0 1px) repeat-x;
}

li > span.challenge > span { background-color: #fff; padding-right: 5px; }
li > span.response > span { background-color: #fff; padding-left: 5px; }
<ul>
  <li>
    <span class="challenge"><span>challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge</span></span>
    <span class="response"><span>response response response response response response response</span></span>
  </li>
  <li>
    <span class="challenge"><span>challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge challenge</span></span>
    <span class="response"><span>response response</span></span>
  </li>
  <li>
    <span class="challenge"><span>challenge challenge </span></span>
    <span class="response"><span>response response response response response response response response response response</span></span>
  </li>
  <li>
    <span class="challenge"><span>challenge</span></span>
    <span class="response"><span>response</span></span>
  </li>
</ul>

→ Ссылка