Я бы использовал комбинацию overflow, overflow-wrap и white-space для правильного разбиения текста.
Тогда я бы использовал псевдоэлемент для визуализации количества элементов после контейнера.Ставя его абсолютным, мы можем выровнять элемент относительно контейнера, независимо от того, сколько дополнительных узлов мы добавляем в контейнер.
Поскольку мы используем псевдоэлемент, мы можем легко использовать content
cssПравило связывать атрибут data-items контейнера HTML как содержимое нашего маленького счетчика.
Большое преимущество в том, что, позиционируя счетчик абсолютно, мы можем продолжать использовать относительные единицы для позиционирования всего остального, и мы можемразместите счетчик в любом месте, в котором мы захотим, в том числе снова поместив переполнение на скрытый, и сделайте так, чтобы счетчик перекрывал границу.
const cities = [
"amsterdam",
"belize",
"calcutta",
"dortmund",
"egmond aan zee",
"frankfurt",
"gotenburg"
];
const render_list = list => content => {
const items = content.map( text => `<li>${ text }</li>` ).join( '' );
list.innerHTML = items;
return list;
};
const add_city = list => event => {
const item = event.target;
if ( event.target.nodeName === 'LI' ) {
list.appendChild( item.cloneNode(true));
list.setAttribute( 'data-items', list.childElementCount );
}
};
const options = document.querySelector( '#options' );
const selections = document.querySelector( '#selections' );
options.addEventListener( 'click', add_city( selections ));
render_list( options )( cities );
#selections {
background-color: steelblue;
border: 1px solid grey;
list-style: none;
margin: 4px;
max-width: 50%;
min-height: 1.1em;
overflow-wrap: break-word;
position: relative;
width: 50%;
}
#selections:after {
background-color: white;
border: 1px solid grey;
content: '+' attr(data-items);
position: absolute;
left: 100%;
top: -1px;
}
#selections > li {
display: inline;
margin-left: 2px;
}
#options {
border: 1px solid grey;
margin-top: 20px;
}
<ul data-items="0" id="selections"></ul>
<ul id="options"></ul>