Блоки с разными классами с новой строки

79
27 апреля 2021, 14:40

Нужно чтобы один класс был в одной строке, второй класс во второй и т д. Причем классы могут быть разные, и их может быть много. Возможно, это можно сделать с помощью js, но пока ничего не приходит на ум.

ul li { 
  list-style: none; 
  float: left; 
  padding-right: 10px; 
}
<ul> 
  <li class="first">Один класс</li> 
  <li class="first">Один класс</li> 
  <li class="first">Один класс</li> 
  <li class="second">Второй класс</li> 
  <li class="second">Второй класс</li> 
  <li class="third">Третий класс<li> 
</ul>

Answer 1

Может сделать это через CSS float + clear?

.first + .second, 
.second + .third { 
  clear: left; 
} 
 
ul li { 
  float: left; 
  display: inline-block; 
  margin: 2px; 
  border: solid; 
  width: 100px; 
  text-align: center; 
}
<ul> 
	<li class="first">Один класс</li> 
	<li class="first">Один класс</li> 
	<li class="first">Один класс</li> 
	<li class="second">Второй класс</li> 
	<li class="second">Второй класс</li> 
	<li class="third">Третий класс</li> 
</ul>

А вот и вариант в котором css составлен автоматически:

document.write(`<style>${[...document.querySelectorAll('ul li')].reduce((acc, el) => { 
  return acc[acc.length-1] !== el.className && acc.push(el.className), acc 
}, []).map((e,i,a) => `.${e} + .${a[i+1]}`).join(',')} {clear: left;}</style>`);
ul li { 
  float: left; 
  display: inline-block; 
  margin: 2px; 
  border: solid; 
  width: 100px; 
  text-align: center; 
}
<ul> 
	<li class="first">Один класс</li> 
	<li class="first">Один класс</li> 
	<li class="first">Один класс</li> 
	<li class="second">Второй класс</li> 
	<li class="second">Второй класс</li> 
	<li class="third">Третий класс</li> 
</ul>

Answer 2

Решение, уверен, что костыльное, но может за счёт него напишут вариант лучше.

let arrClass = $('ul > li').map(function(){return $(this).attr('class')}).get(); // собираем в массив все существующие классы li 
 
arrClass = unique(arrClass); // перебираем классы, оставляя только "уникальные" 
 
arrClass.forEach((e)=>{ // проходим циклом по всем "уникальным" классам 
  $('.'+e).wrapAll('<ul class="wrap_'+e+'">'); // оборачиваем эти классы 
}); 
 
// функция для поиска "уникальных" классов 
function unique(arr){ 
  let obj = {}; 
  for(let i = 0; i < arr.length; i++) { 
    let str = arr[i]; 
    obj[str] = true; 
  } 
  return Object.keys(obj); 
}
ul { 
  list-style: none; 
  margin: 0; 
  padding: 0; 
} 
ul > ul::after { 
  content: ''; 
  display: block; 
  clear: both; 
} 
ul > ul { 
  border-bottom: 1px solid #333; 
  padding-bottom: 5px; 
  margin-bottom: 5px; 
} 
ul > ul li { 
  float: left; 
  padding-right: 10px; 
} 
.wrap_first {color: blue;} 
.wrap_second {color: red;} 
.wrap_third {color: green;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<ul> 
  <li class="first">Один класс</li> 
  <li class="third">Третий класс</li> 
  <li class="first">Один класс</li> 
  <li class="first">Один класс</li> 
  <li class="second">Второй класс</li> 
  <li class="second">Второй класс</li> 
  <li class="third">Третий класс</li> 
  <li class="second">Второй класс</li> 
  <li class="third">Третий класс</li> 
  <li class="second">Второй класс</li> 
  <li class="first">Один класс</li> 
  <li class="first">Один класс</li> 
</ul>

Answer 3

Просто убери свойство float в стилях:

ul li { 
  list-style: none; 
  /*float:left;*/ 
  padding-right: 10px; 
}
<ul> 
  <li class="first">Один класс</li> 
  <li class="first">Один класс</li> 
  <li class="first">Один класс</li> 
  <li class="second">Второй класс</li> 
  <li class="second">Второй класс</li> 
  <li class="third">Третий класс 
    <li> 
</ul>

READ ALSO
Массив в JS является псевдоложью? [дубликат]

Массив в JS является псевдоложью? [дубликат]

Задаю данный вопрос, так как пишут, что [] -не является псевдоложью,но ведь:

98
JS - показывать div в зависимости от содержания другого div

JS - показывать div в зависимости от содержания другого div

Как с помощью js сделать чтобы блок с классом item отображался только если в блоке с классом title было слово "Слово"? (по умолчанию стоит dispay:none,...

135