Подтвердить что ты не робот

Как определить событие Flex flex wrap

У меня есть гибкий контейнер с элементами внутри. Как определить событие flex wrap? Я хочу применить некоторые новые css к элементам, которые были wrapperd. Я полагаю, что невозможно обнаружить событие wrap чистым css. Но это будет очень мощная функция! Я могу попытаться "поймать" это событие точки прерывания медиа-запросом, когда элемент обернется в новую строку/строку. Но это ужасный подход. Я могу попытаться обнаружить его с помощью script, но это тоже не очень хорошо.

Look at the picture

Я очень удивлен, но просто $( "# element" ). resize() не работает для определения изменений высоты или ширины контейнера flex для применения соответствующих css к дочерним элементам. LOL.

Я обнаружил, что работает только этот пример кода jquery jquery событие прослушивание в позиции изменено

Но все еще ужасно.

4b9b3361

Ответ 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;
   });
}