Изотоп - попытка сортировки предметов по первоначальному порядку

Я новичок в публикации на stackoverflow, а также использую Codepen; так что, пожалуйста, будьте нежны со мной!

Найдя чудесную работу Дэвида ДеСандро «Масонство», я нашел удивительный «Изотоп». Я пытался выполнить то, что (я считаю) должно быть очень простой задачей сохранения исходного порядка элементов. После того, как я рвал на себе волосы в течение нескольких дней (а также пробовал Masonry Ordered Вита «тасуки» Бруннера), у меня явно что-то не так с моим синтаксисом, и я был бы признателен за любую помощь, пожалуйста.

По сути, у меня есть несколько страниц, каждая из которых содержит (разное) количество «коробок». Каждая коробка будет иметь одинаковую ширину, но разную высоту. Ячейки должны быть в своем первоначальном порядке, а также сохранять этот порядок при изменении размера окна.

ПРИМЕР CODEPEN: Isotope — попытка отсортировать элементы в исходном порядке

Коробки НЕ будут пронумерованы - они пронумерованы в моей Ручке только для иллюстрации.

HTML:

<div id="container">

    <div class="prod one"><h1>One</h1></div>
    <div class="prod two"><h1>Two</h1></div>
    <div class="prod three"><h1>Three</h1></div>    
    <div class="prod four"><h1>Four</h1></div>
    <div class="prod five"><h1>Five</h1></div>  
    <div class="prod six"><h1>Six</h1></div>
    <div class="prod seven"><h1>Seven</h1></div>    
    <div class="prod eight"><h1>Eight</h1></div>    
    <div class="prod nine"><h1>Nine</h1></div>
    <div class="prod ten"><h1>Ten</h1></div>
    <div class="prod eleven"><h1>Eleven</h1></div>
    <div class="prod twelve"><h1>Twelve</h1></div>
    <div class="prod thirteen"><h1>Thirteen</h1></div>
    <div class="prod fourteen"><h1>Fourteen</h1></div>
    <div class="prod fifteen"><h1>Fifteen</h1></div>
    <div class="prod sixteen"><h1>Sixteen</h1></div>
    <div class="prod seventeen"><h1>Seventeen</h1></div>        

</div>  <!-- /end container -->

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

JS:

var $container = $('#container');
    // init
    $container.isotope({
    // options
    itemSelector: '.prod',
    layoutMode: 'masonry'
    });

JS ниже "работает", но делает блоки одинакового размера и удаленными друг от друга:

        $('.prod').isotope({
    getSortData: {
    sortBy: 'original-order'
    }
    });

Я также пытался использовать Masonry Ordered, но получил те же результаты. Я попытался воспроизвести код из демонстрации фотогалереи Vit 'tasuki' Brunner и тоже пытался сделать Pen для этого, но, похоже, не может заставить его работать.

Я также пытался инициализировать Isotope в HTML и думаю, что мой синтаксис в порядке, используя действительный JSON, но снова безуспешно:

<div id="container" class="js-isotope" data-isotope-options='{ "itemSelector": ".prod", "layoutMode": "masonry", "sortBy": "original-order" }'>

Во всяком случае, я уже слишком долго болтал. Я был бы очень обязан, если бы кто-то мог указать мне на очевидное!

Спасибо Веббо


person webbo    schedule 14.03.2015    source источник


Ответы (1)


К сожалению, это распространенное заблуждение при использовании Isotope. Настройка порядка просто указывает, в каком порядке вставляются ваши элементы. Исходный порядок означает, что элемент 1 помещается первым в DOM, элемент 2 вторым и так далее. После каждой вставки алгоритм пытается найти наиболее подходящее место.

Isotope использует жадный алгоритм первого подбора, который размещает элементы слева направо и сверху вниз. Что происходит, так это то, что после первой строки элементов (алгоритм достиг конца правой части) он проверяет, есть ли свободное место в следующей строке. Как только он находит строку со свободным пространством, он помещает туда следующий (указанный первоначальным порядком) элемент.

Это приводит к тому, что вы воспринимаете неправильный порядок, который является правильным в смысле изотопов.

Пример:

a  +---+  +---+  +---+
b  | 1 |  | 2 |  | 3 |
c  |   |  |   |  |   |
d  |   |  +---+  |   |
e  |   |  +---+  +---+
f  +---+  | 4 |  +---+
g  +---+  |   |  | 5 |
h  | 6 |  +---+  |   |
   |   |         |   |
   +---+         +---+
  1. Первые три элемента прямолинейны, а строка a исчерпана.
  2. Элемент 4 вставляется в DOM, и Isotope ищет место для его размещения. Строки b, c и d не осталось места.
  3. Алгоритм проверяет строку e, находит свободное место и помещает туда элемент 4.
  4. Строка e исчерпана, поэтому элемент 5 помещается на следующую строку.
  5. Наконец, элемент 6 помещается в первую строку (g), в которой есть свободное место. Это место остается за элементами 4 и 5, что может выглядеть так, как будто порядок перетасован.

Точно так же можно воспринимать и все алгоритмы, максимально заполняющие пространство. Причина этого в том, что упаковка контейнеров (проблема минимизации пространства) и упорядочение по своей природе совершенно ортогональны.

Если вы хотите и того, и другого, вам придется пойти на компромисс. К счастью, Isotope реализует такие компромиссы. Например, режим компоновки fitRows сохраняет порядок, но при этом минимизирует горизонтальное пространство.

person Bengt    schedule 16.03.2015
comment
Спасибо @Bengt - я ценю время, которое вы потратили, чтобы подробно объяснить и привести пример. Теперь у меня есть более четкое понимание. Я пробовал «fitRows», но он оставляет слишком много места для моих нужд. Я снова вернулся к просмотру Masonry Ordered и думаю, что, возможно, нашел там запутанное решение ... - person webbo; 19.03.2015
comment
Я поиграл с демо-версией каменной кладки, которую вы связали. Я думаю, что это не решает вашу проблему, потому что ведет себя очень похоже на то, что делает стандартная кладка. Кажется, что он делает то, что уменьшает вероятность возникновения аномалии порядка (только что придумал этот термин), иногда добавляя дополнительное пространство. Тем не менее, порядок иногда по-прежнему неправильный и нестабильный, когда дело доходит до изменения размера окна браузера. Это может быть подходящим решением, если у вас фиксированная ширина и высота вашего контейнера, но это действительно особый случай. - person Bengt; 19.03.2015
comment
Возможно, вы можете использовать контейнер фиксированного размера без возможности его изменения. Тогда у вас есть шанс гарантировать заказ. - person Bengt; 19.03.2015
comment
Еще раз спасибо @Bengt. Да, я обнаружил нестабильность при изменении размера окна браузера с помощью Masonry Ordered. Интересно, если бы я вернулся к Isotope и на самом деле ПРОнумеровал ящики (но скрыл отображение числа), сохранил бы ли метод Isotope sortBy: 'number' первоначальный порядок - в примере Дэвида ДеСандро с периодической таблицей все «ящики» имеют одинаковый размер ? - person webbo; 20.03.2015
comment
Свойство sortBy также указывает лишь порядок вставки элементов в контейнер (согласно алгоритму). Хитрость для получения гарантированного порядка при использовании макета masonry заключается в том, чтобы иметь одинаковую высоту для всех элементов. - person Bengt; 20.03.2015
comment
@Bengt Можно ли получить заказ в режиме mansory? (оригинальный заказ с разной высотой) - person Jose; 27.11.2020