Как определить событие Flex flex wrap
У меня есть гибкий контейнер с элементами внутри. Как определить событие flex wrap? Я хочу применить некоторые новые css к элементам, которые были wrapperd. Я полагаю, что невозможно обнаружить событие wrap чистым css. Но это будет очень мощная функция! Я могу попытаться "поймать" это событие точки прерывания медиа-запросом, когда элемент обернется в новую строку/строку. Но это ужасный подход. Я могу попытаться обнаружить его с помощью script, но это тоже не очень хорошо.
![Look at the picture]()
Я очень удивлен, но просто $( "# element" ). resize() не работает для определения изменений высоты или ширины контейнера flex для применения соответствующих css к дочерним элементам. LOL.
Я обнаружил, что работает только этот пример кода jquery
jquery событие прослушивание в позиции изменено
Но все еще ужасно.
Ответы
Ответ 1
Здесь одно потенциальное решение. Могут быть другие дефекты, которые необходимо проверить.
Основная идея - прокрутить flex items
и проверить их позицию top
против предыдущего брата. Если значение top
больше (следовательно, далее вниз по странице), то элемент завернут.
Функция detectWrap
возвращает массив элементов DOM, которые были обернуты, и может использоваться для стилирования по желанию.
Эта функция может использоваться с window.resize
для обнаружения обертывания при изменении размера окна. Поскольку окно кода StackOverflow не изменяет размер, это не будет работать здесь.
Здесь CodePen, который работает с изменением размера экрана.
var detectWrap = function(className) {
var wrappedItems = [];
var prevItem = {};
var currItem = {};
var items = document.getElementsByClassName(className);
for (var i = 0; i < items.length; i++) {
currItem = items[i].getBoundingClientRect();
if (prevItem && prevItem.top < currItem.top) {
wrappedItems.push(items[i]);
}
prevItem = currItem;
};
return wrappedItems;
}
window.onload = function(event){
var wrappedItems = detectWrap('item');
for (var k = 0; k < wrappedItems.length; k++) {
wrappedItems[k].className = "wrapped";
}
};
div {
display: flex;
flex-wrap: wrap;
}
div > div {
flex-grow: 1;
flex-shrink: 1;
justify-content: center;
background-color: #222222;
padding: 20px 0px;
color: #FFFFFF;
font-family: Arial;
min-width: 300px;
}
div > div.wrapped {
background-color: red;
}
<div>
<div class="item">A</div>
<div class="item">B</div>
<div class="item">C</div>
</div>
Ответ 2
Я использую подобный подход при определении того, был ли <li>
завершен в <ul>
, на котором он установлен на flex
.
ul = document.querySelectorAll('.list');
function wrapped(ul) {
// loops over all found lists on the page - HTML Collection
for (var i=0; i<ul.length; i++) {
//Children gets all the list items as another HTML Collection
li = ul[i].children;
for (var j=0; j<li.length; j++) {
// offsetTop will get the vertical distance of the li from the ul.
// if > 0 it has been wrapped.
loc = li[j].offsetTop;
if (loc > 0) {
li[j].className = 'wrapped';
} else {
li[j].className = 'unwrapped';
}
}
}
}
Ответ 3
Немного улучшенный фрагмент на jQuery для этой цели.
wrapped();
$(window).resize(function() {
wrapped();
});
function wrapped() {
var offset_top_prev;
$('.flex-item').each(function() {
var offset_top = $(this).offset().top;
if (offset_top > offset_top_prev) {
$(this).addClass('wrapped');
} else if (offset_top == offset_top_prev) {
$(this).removeClass('wrapped');
}
offset_top_prev = offset_top;
});
}