Расчет динамической ширины элементов списка

Мне нужно реализовать некоторые требования: Динамически нарисуйте список элементов li, который может состоять из текста разной длины. Все элементы, которые должны отображаться в одной строке слишком долго, необходимо заменить на .... Я добился этого с помощью следующего CSS:

  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;

Обычно эта хлебная крошка состоит из 1-5 элементов. Первый и последний элементы всегда должны отображать полный текст.

Как я могу рассчитать максимальную ширину элементов li, не включая ширину последнего элемента? Что-то вроде:

calc((100% - width-last-element)/<li-el-qty>-1

Я пробовал следующее:

body {
  font-family: Helvetica, Arial, sans-serif;
  margin: 0;
  padding: 1em;
  background-color: rgb(227, 227, 227);
  white-space: nowrap;
  overflow: hidden;
}


/* Regular breadcrumbs */

ul {
  list-style-type: none;
  margin: 0;
  padding: 2em;
  color: #333;
}

li {
  display: inline-block;
  position: relative;
  padding-right: 2em;
  margin: 0;
  text-decoration: none;
  display: inline-block;
  color: #333;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 8em;
}

li:after {
  content: '>';
  position: absolute;
  display: inline-block;
  right: 0;
  width: 2em;
  text-align: center;
}

li:nth-last-child(1) {
  text-decoration: underline;
  font-weight: bold;
  text-overflow: clip;
  overflow: visible;
}
<ul class = "bread">
  <li>MERSEDES</li>
  <!--
  -->
  <li>Main transmission section1</li>
  <!--
  -->
  <li>Second Transmissio Section</li>
  <!--
  -->
  <li>Another to view</li>
  <!--
  -->
  <li>Final link the hierarchy</li>
  <!--
-->
  <li>Current section viewAAAAA</li>
</ul>

https://codepen.io/nolik/pen/mKpWYm

Я также пробовал настроить динамическую ширину в зависимости от количества таких элементов:

/* three items */
li:first-child:nth-last-child(3),
li:first-child:nth-last-child(3) ~ li {
    max-width: 33.3333%;
}

/* four items */
li:first-child:nth-last-child(4),
li:first-child:nth-last-child(4) ~ li {
    max-width: 25%;
}

Но ни то, ни другое не помогло.

Вы ожидаете такого результата? codepen.io/anon/pen/KeZxMX

Hidden Hobbes 19.06.2018 10:18

@HiddenHobbes отлично, спасибо! только одно => не могли бы вы посоветовать, как заставить все элементы рухнуть в равной пропорции?

Nolik 19.06.2018 11:59

Пожалуйста, проверьте ручку еще раз, это то, что вам нужно? codepen.io/anon/pen/KeZxMX

Hidden Hobbes 19.06.2018 12:07

немного нет, первая версия ближе (просто с увеличением последнего элемента другие элементы схлопываются непропорционально, вы можете видеть: codepen.io/nolik/pen/mKpaGr (вы можете видеть, что максимальная ширина свернутого 1-го элемента отличается от 3d, логически 1-й элемент должен отображаться полностью) Но в любом случае вы мне очень помогли!

Nolik 19.06.2018 12:21

Что-то вроде этого? codepen.io/anon/pen/bKazox

Hidden Hobbes 19.06.2018 12:49

Был ли предыдущий пример тем, чем вы были после @Nolik? Если да, то я могу написать полный ответ с объяснением изменений.

Hidden Hobbes 19.06.2018 16:07

Спасибо, @HidenHobbes. Отправьте, пожалуйста, свой ответ, что я могу решить этот вопрос. на самом деле это большая помощь с гибкостью, теперь я пытаюсь настроить ваше решение для вырезания свободного пространства из элемента, который полностью отображается, и совместного использования этого пространства между другими элементами, которые мы переполняем.

Nolik 19.06.2018 20:45
Улучшение производительности загрузки с помощью 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
7
524
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я бы использовал display: flex для родительского элемента, а затем отключил бы min-width для последнего дочернего элемента. Быстрый пример:

body {
  margin: 0;
}

.parent {
  display: flex;
}

.parent>div {
  min-width: 0;
}

p {
  margin: 0;
  text-overflow: ellipsis;
  overflow: hidden;
  white-space: nowrap;
}

.parent>div:last-of-type {
  min-width: unset;
}
<div class = "parent">
  <div>
    <p>MERSEDES</p>
  </div>
  <div>
    <p>Final link the hierarchy</p>
  </div>
  <div>
    <p>Another to view to view</p>
  </div>
  <div>
    <p>Final link the hierarchy</p>
  </div>
  <div>
    <p>Another to view to view</p>
  </div>
  <div>
    <p>Final link the hierarchy</p>
  </div>
</div>

<div class = "parent">
  <div>
    <p>MERSEDES</p>
  </div>
  <div>
    <p>Final link the hierarchy</p>
  </div>
  <div>
    <p>Another to view to view</p>
  </div>
  <div>
    <p>Final link the hierarchy</p>
  </div>
  <div>
    <p>Another to view to view</p>
  </div>
  <div>
    <p>Final link the hierarchy</p>
  </div>
  <div>
    <p>Another to view to view</p>
  </div>
</div>

<div class = "parent">
  <div>
    <p>MERSEDES</p>
  </div>
  <div>
    <p>Final link the hierarchy</p>
  </div>
  <div>
    <p>Another to view to view</p>
  </div>
  <div>
    <p>Final link the hierarchy</p>
  </div>
  <div>
    <p>Another to view to view</p>
  </div>
  <div>
    <p>Final link the hierarchy</p>
  </div>
  <div>
    <p>Another to view to view</p>
  </div>
  <div>
    <p>Final link the hierarchy</p>
  </div>
</div>

извините @Vucko, я не понимаю, как это должно работать без максимальной ширины в классе span. (codepen.io/pen)

Nolik 19.06.2018 10:14

@Nolik, только последний диапазон дочерних элементов не имеет свойства max-width, поэтому он может использовать всю ширину своего родительского элемента.

Vucko 19.06.2018 10:27

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

Nolik 19.06.2018 10:34

@Nolik, теперь я получил то, что тебе нужно. Удаляю и перепубликую, если найду ответ.

Vucko 19.06.2018 10:54

извините, но похоже, что ваш пример работает по-другому: codepen.io/nolik/pen/qKpLOg, см. комментарий> Hidden Hobbes, это именно то, что мне нужно (только одна вещь, которую нужно достичь, это равная пропорция для всех свернутых элементов).

Nolik 19.06.2018 11:58
Ответ принят как подходящий

Вы можете достичь желаемого результата, используя flexbox и его свойства grow и shrink.

Потребуются следующие модификации:

  • Добавьте display: flex; в ul. Это сделает его контейнером flex.
  • Добавьте flex: 0 1 10%; в li. Это скажет lis не расти, а сжиматься с начальной длиной 10%.
  • Добавьте селектор li:first-child с правилом flex: 0 0 auto;. Это гарантирует, что первый li останется в исходном размере и не сжимается.
  • Добавьте селектор li:last-child с правилом flex: 1 0 auto;. Это гарантирует, что последний li вырастет, чтобы заполнить доступное пространство.

body {
  font-family: Helvetica, Arial, sans-serif;
  margin: 0;
  padding: 1em;
  background-color: rgb(227, 227, 227);
  white-space: nowrap;
  overflow: hidden;
}

ul {
  list-style-type: none;
  margin: 0;
  padding: 2em;
  color: #333;
  display: flex;
}

li {
  position: relative;
  padding-right: 2em;
  margin: 0;
  text-decoration: none;
  color: #333;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  flex: 0 1 10%;
}

li:after {
  content: '>';
  position: absolute;
  right: 0;
  width: 2em;
  text-align: center;
}

li:nth-last-child(1) {
  text-decoration: underline;
  font-weight: bold;
  text-overflow: clip;
  overflow: visible;
}

li:first-child {
  flex: 0 0 auto;
}

li:last-child {
  flex: 1 0 auto;
}
<ul class = "bread">
  <li>MERSEDES</li>
  <li>Main transmission section1</li>
  <li>Second Transmissio Section</li>
  <li>Another to view</li>
  <li>Final link the hierarchy</li>
  <li>Current section viewAAAAA</li>
</ul>

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