BrickCols.js

Инструмент, который позволит Вам без всяких проблем отсортировать и выложить в виде кирпичной кладки элементы блока.

Нужно лишь подключить скрипт к странице и указать, где и что нужно расположить упорядоченной колонной.

Абсолютно все стили прописываются в CSS и не требуется указание каких-либо свойств в JS.

Как использовать:

  1. Как обычно, чтобы использовать скрипт, его необходимо сначала скачать.
    Сделать это можно как с данной страницы, так и из репозитория проекта на ГитХаб-е.
  2. После того, как Вы завладели исходниками, нужно подключить их к вашему проекту.
    Для этого Вам нужно прописать на всех страницах путь к скаченному js-файлу, делать это нужно только для тех страниц, где вы собираетесь использовать скрипт.
    Например, перед закрывающимся тегом body, так:
    <script src="/js/brickcols.js"></script>
    </body>
    </html>
  3. После проделанных операций, на подключённых страницах будет доступен объект BrickCols, в котором будут 2 необходимые Вам функции: auto_prioritize() и layout_optimization(). В большенстве случаев, Вам нужна будет только 2-ая из них.
    Если ввести в консоль браузера:
    console.log(BrickCols);
    то будет выведен объект.
  4. Но, прежде чем задействовать скрипт, нужно разобраться с html разметкой… Структура проста и максимально гибка:
    <элемент_1 class="класс_обёртки">
    	<элемент_2 class="класс_колонны">
    		<элемент_3 class="класс_сортируемых_блоков" data-priority="приоритет_(число)">
    			любое содержимое
    		</элемент_3>
    		<элемент_3 class="класс_сортируемых_блоков" data-priority="1">
    			любое содержимое
    		</элемент_3>
    		<элемент_3 class="класс_сортируемых_блоков">
    			любое содержимое
    		</элемент_3><элемент_3 class="класс_сортируемых_блоков" data-priority="2">
    			любое содержимое
    		</элемент_3>
    	</элемент_2>
    </элемент1>
  5. Можно использовать id вместо class у элемента обёртки, вот так:
    <элемент_1 id="идентификатор_обёртки"></элемент1>
    Но мне не кажется хорошей данная идея, так как, для данного скрипта, class является более мощным инструментом.
  6. Вы могли заметить, что в структуре используется такой атрибут, как data-priority. Данный деталь отвечает за позицию, который займёт элемент относительно начала. Указание этого атрибута - необязательно, но эта штука очень пригодится, если Вам нужно будет поднять какой-нибудь элемент в начала, несмотря на то, что в html-разметке он будет находится где-нибудь внизу.
    Как это работает на практике, Вы сможете понять в соответствующем разделе.
  7. Стоит обратить внимание на то, что если элементам не заданы приоритеты по умолчанию, то скрипт это сделает за Вас. В таком случае, приоритеты будут расставлены в порядке нахождения элементов в DOM.
    Причём, элементы, которые уже имеют заданные Вами приоритеты, - тронуты не будут… Ваши приоритеты - в приоритете!
  8. Автоматическим образом назначаются только свободные, отсутствующие, приоритеты. То есть, если уже имеет элементы с 1-го по 7-приоритеты и с 9 по 13, то элемент, без заданного Вами приоритета, получит 8-ой, самый ближайший к началу.
  9. В основном скрипте страницы, нужно всего лишь использовать следующую конструкцию, чтобы задействовать скрипт:
    BrickCols.layout_optimization('.класс_обёртки', '.класс_колонны', '.класс_сортируемых_блоков');
  10. Также, на вход функция принимает ещё и 4-ый параметр, который является колбеком, вызываемый по окончанию процесса сортировки.
    Использование колбека будет удобным в случаях, например когда Вы хотите изменить состояние сортируемого блока до сортировки и после (до - сделать блок полу-прозначным и ограничить по высоте, а после - видимым и во всю высоту).
    Для этого нужно лишь задействовать class и манипулировать им. На данной странице, я использую следующую конструкцию:
    BrickCols.layout_optimization('.sorted_table', '.sorted_table__col', '.sorted_table__block', function(){
    	body = document.querySelector('body').classList.add('m--sorted'),
    });
    А уже в стилях прописываю следующее:
    .sorted_table{max-height: 25vh; // не позволяю блокам раскрываться более чем на четверть высоты экрана, до завершения сортировки
        opacity: 0.5;}
    body.m--sorted .sorted_table{ // после сортировки:max-height: 100%;
    	opacity: 1;}

Демонстрация:

В данном разделе, предлагаю Вам посмотреть на работу скрипта.
Лучше всего протестировать его получится, если Вы попробует поизменять размеры окна браузера и проследить за именениями.

Здесь представленны различные блоки с сортированными элементами. Стоит обращать внимание на заголовки элементов, особенно не те, которые содержат в себе ">>", у данных элементов стоит почитать и их содержимое.

Для сортировки всех представленных демонстрационных "таблиц", использовалась всего одна строчка в JS:

BrickCols.layout_optimization('.sorted_table', '.sorted_table__col', '.sorted_table__block');

Другими словами, абсолютно не важно, на сколько схожи сортируемые "таблицы", как сильно отличаются их CSS свойства. Нет разницы вообще, ведь скрипт работает с каждым блоком-таблицей по отдельности.
По этой причине предлагаю использовать class, а не id, чтобы просто указывать один класс для всех сортируемых блоков и всего один раз прописать действие в JS-коде.

Блок элементов, с заранее заданными приоритетами:

Приоритет 1

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Velit molestias, ratione deleniti cupiditate ad perspiciatis fugiat explicabo officiis consequatur quasi ducimus alias omnis eum rerum fugit deserunt! Iusto, alias, recusandae.Dolores recusandae expedita perspiciatis nemo eligendi aliquid, odio quasi libero facere modi pariatur assumenda minima dolorem at harum ullam impedit praesentium quidem molestias fugit hic nesciunt. Ut, illum quibusdam dolorum.Repellendus cum dicta nemo quos alias. Nulla eligendi ipsa unde praesentium, velit adipisci corporis veritatis cum, odio quas labore, fuga magnam vel iure delectus similique ipsum. Velit, saepe itaque dignissimos.

>> Без приоритета (2)

У этого блока не задан приоритет по умолчанию. Скрипт умён, чтобы решить эту проблему… Он находит свободный номер и присваивает его элементу. В данном случае, самым близким оказался 2-ой приоритет. Кстати, в структуре html-кода, элемент также рассположен на 2-ой позиции.

Приоритет 4

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ullam quibusdam tempora repellat maxime dolores harum beatae quidem non earum accusantium animi fugiat, consectetur voluptatem iste nobis perferendis. Suscipit, laudantium, ipsam?Porro ipsa pariatur, eius veritatis cum sapiente similique deserunt, harum corrupti aspernatur ullam laboriosam consequuntur deleniti nulla ratione labore iste excepturi laudantium voluptas odio dolorem quos. Odio voluptates cum quidem.

Приоритет 5

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sunt error repellat quibusdam accusantium earum fugiat culpa eius nulla ipsum illum quaerat alias blanditiis, nesciunt quae aliquam minus, voluptate non maxime.

Приоритет 13

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Qui sapiente libero necessitatibus numquam quos harum aliquid eius quam eos doloremque, nostrum est illum rem? Tempora dolorum necessitatibus praesentium culpa, magnam?Ea perspiciatis possimus rerum officiis, id! Itaque maxime amet voluptatem, commodi vel beatae repellendus illo, dolores tempore dolorum, architecto quam. In a veniam quaerat praesentium officia omnis, facilis molestias delectus.Amet quibusdam rerum incidunt nesciunt fugiat quia molestiae sequi totam sit voluptates illo sunt non, dolore vitae dolorem quod esse a sint. Aut ipsum, facere porro iusto voluptas excepturi, quae.Repellat voluptate iusto aliquam, ipsum eum eius quasi ducimus repudiandae quisquam, vitae illo voluptates commodi veniam! Ea voluptatibus, delectus quo voluptas minus quae suscipit qui, excepturi totam temporibus, repellendus quisquam?

Приоритет 7

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rerum minus repudiandae magni temporibus qui. Vel minus ab rem ad facere, vero suscipit dolores quam, sunt excepturi amet nesciunt quia commodi.Sapiente dolores officia expedita porro perspiciatis provident, aut quidem, autem nisi voluptates quaerat, sed, ex nobis voluptatibus deserunt dignissimos magnam perferendis laborum obcaecati tenetur tempore fugiat cupiditate! Ea, consequatur, blanditiis.

Приоритет 23

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Optio, molestiae repellat totam adipisci asperiores molestias dolores quo laudantium libero neque quisquam nobis non illo ratione similique perferendis ut, itaque error.

>> Приоритет 3

Данный блок отличается тем, что он рассположен (в html-структуре) под элементом с 23 приоритетом. Но, так как блок имеет более высокий приоритет, то скрипт его поднимает наверх, как это и должно быть.

Приоритет 27

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Mollitia placeat cum, ex nostrum sunt magni deserunt voluptates maiores vel ipsum porro neque, hic, numquam nulla animi aliquam? Veritatis, accusamus, corporis.

>> Без приоритета (6)

Данный блок в структуре html рассположен в самом конце. Иначе говоря, до работы скрипта, по отношению к этому элементу был актуален CSS-псевдо-селектор :last-child. Также, у данного элемента изначально отстутствует приоритет. Несмотря на это, скрипт нашёл ему дом - 6 позиция, свободная.

Добавить новый элемент

Заголовок:

Содержимое:

Приоритет (макс. разница между значениями = 200):

Для того, чтобы добавить новый элемент, можно использовать встроенную функцию add_new()

BrickCols.add_new('селектор_обёртки', 'селектор_колоннки', [['ключ_1', 'действие', 'содержимое, которое будет всталяться'],], приоритет-число);

Разметка выглядит следующим образом:

<элемент_1 class="класс_обёртки">
	<элемент_2 class="класс_колонны">
		<элемент_3 class="класс_сортируемых_блоков brickcols-template">
			<элемент_4 data-bc-t="ключ_1"></элемент_4>
			<элемент_4 data-bc-t="ключ_2"></элемент_4></элемент_3><элемент_3 class="класс_сортируемых_блоков">
			любое содержимое
		</элемент_3>
	</элемент_2>
</элемент1>

Название ключам можно задавать любое, кроме 'this', так как оно закреплено для действий с блоком шаблона (которому и присвоен class="brickcols-template")

В качестве действий, доступны значения: html, class, href, src. html - вставит требуемое содиржимое во внутрь. class - задаст класс, равный содержимому. href - содержимое будет выведено в одноимённый атрибут. src - аналогично href, но уже для src. Содержимое, это 2-ой элемент массива в массиве, если начинать счёт с 0 (нуля). (см.пример кода)

Четвёртый параметр функции - приоритет, если необходимо его задать точно. Если же не задавать приоритета, то он будет автоматически добавлен в самую короткую колоннку. При заданном вручную приоритете, нужно снова вызвать функцию сортировки, чтобы блок задял своё положение.

…
	BrickCols.add_new();
	BrickCols.layout_optimization();

Если Вас устраивает, как работают демки на данной странице, то Вы всегда можете просмотреть исходный код js-файла, которой реализует это на ней. Файлик находится там -> здесь.

Без заданных заранее приоритетов:

>> Без приоритета (2)

А это блок неудачник… Я его напечатал самым первым при написании разметки, но он всё равно уступил свою позицию. Теперь он второй. Эх!

>> Приоритет 7

Вы не поверите, но в списке элементов данной таблицы, это блок был вторым. Однако, ему не повезло, он родился с 7-ым приоритетом и, как следствие, был опущен скриптом на свою позицию.

Без приоритета (3)

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ullam quibusdam tempora repellat maxime dolores harum beatae quidem non earum accusantium animi fugiat, consectetur voluptatem iste nobis perferendis. Suscipit, laudantium, ipsam?Porro ipsa pariatur, eius veritatis cum sapiente similique deserunt, harum corrupti aspernatur ullam laboriosam consequuntur deleniti nulla ratione labore iste excepturi laudantium voluptas odio dolorem quos. Odio voluptates cum quidem.

Без приоритета (4)

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sunt error repellat quibusdam accusantium earum fugiat culpa eius nulla ipsum illum quaerat alias blanditiis, nesciunt quae aliquam minus, voluptate non maxime.

Без приоритета (5)

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Qui sapiente libero necessitatibus numquam quos harum aliquid eius quam eos doloremque, nostrum est illum rem? Tempora dolorum necessitatibus praesentium culpa, magnam?Ea perspiciatis possimus rerum officiis, id! Itaque maxime amet voluptatem, commodi vel beatae repellendus illo, dolores tempore dolorum, architecto quam. In a veniam quaerat praesentium officia omnis, facilis molestias delectus.Amet quibusdam rerum incidunt nesciunt fugiat quia molestiae sequi totam sit voluptates illo sunt non, dolore vitae dolorem quod esse a sint. Aut ipsum, facere porro iusto voluptas excepturi, quae.Repellat voluptate iusto aliquam, ipsum eum eius quasi ducimus repudiandae quisquam, vitae illo voluptates commodi veniam! Ea voluptatibus, delectus quo voluptas minus quae suscipit qui, excepturi totam temporibus, repellendus quisquam?

Без приоритета (6)

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rerum minus repudiandae magni temporibus qui. Vel minus ab rem ad facere, vero suscipit dolores quam, sunt excepturi amet nesciunt quia commodi.Sapiente dolores officia expedita porro perspiciatis provident, aut quidem, autem nisi voluptates quaerat, sed, ex nobis voluptatibus deserunt dignissimos magnam perferendis laborum obcaecati tenetur tempore fugiat cupiditate! Ea, consequatur, blanditiis.

Без приоритета (8)

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Optio, molestiae repellat totam adipisci asperiores molestias dolores quo laudantium libero neque quisquam nobis non illo ratione similique perferendis ut, itaque error.

Без приоритета (9)

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Mollitia placeat cum, ex nostrum sunt magni deserunt voluptates maiores vel ipsum porro neque, hic, numquam nulla animi aliquam? Veritatis, accusamus, corporis.

Без приоритета (10)

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Mollitia placeat cum, ex nostrum sunt magni deserunt voluptates maiores vel ipsum porro neque, hic, numquam nulla animi aliquam? Veritatis, accusamus, corporis.

Без приоритета (11)

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rerum minus repudiandae magni temporibus qui. Vel minus ab rem ad facere, vero suscipit dolores quam, sunt excepturi amet nesciunt quia commodi.Sapiente dolores officia expedita porro perspiciatis provident, aut quidem, autem nisi voluptates quaerat, sed, ex nobis voluptatibus deserunt dignissimos magnam perferendis laborum obcaecati tenetur tempore fugiat cupiditate! Ea, consequatur, blanditiis.

Без приоритета (12)

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Optio, molestiae repellat totam adipisci asperiores molestias dolores quo laudantium libero neque quisquam nobis non illo ratione similique perferendis ut, itaque error.

Без приоритета (13)

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Mollitia placeat cum, ex nostrum sunt magni deserunt voluptates maiores vel ipsum porro neque, hic, numquam nulla animi aliquam? Veritatis, accusamus, corporis.

Без приоритета (14)

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nam soluta dignissimos aperiam ab eveniet, nisi repellat quasi, voluptatem, error dolorum veritatis perspiciatis praesentium saepe consequatur eligendi fugit ratione dolor ducimus.Nobis vero quo accusantium, ratione nam necessitatibus fugit dolorem, excepturi ipsa itaque nostrum impedit quis, voluptates beatae veniam quidem tempora explicabo quos fuga? Qui omnis soluta iusto fugit distinctio porro.Dolorem asperiores illum eaque blanditiis repellat repellendus sapiente dolorum neque, autem, aut! Iusto iure voluptatum distinctio quod alias explicabo suscipit fugit, earum accusamus illo porro neque, nam facere omnis iste!Culpa dignissimos consequatur aspernatur distinctio, est nulla at earum excepturi blanditiis laborum quis facilis quod non, tenetur itaque explicabo autem odit eos numquam. Saepe, voluptas unde ipsa. Ducimus, ad, debitis.

Без приоритета (15)

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rerum minus repudiandae magni temporibus qui. Vel minus ab rem ad facere, vero suscipit dolores quam, sunt excepturi amet nesciunt quia commodi.Sapiente dolores officia expedita porro perspiciatis provident, aut quidem, autem nisi voluptates quaerat, sed, ex nobis voluptatibus deserunt dignissimos magnam perferendis laborum obcaecati tenetur tempore fugiat cupiditate! Ea, consequatur, blanditiis.

Без приоритета (16)

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Optio, molestiae repellat totam adipisci asperiores molestias dolores quo laudantium libero neque quisquam nobis non illo ratione similique perferendis ut, itaque error.

Без приоритета (17)

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus inventore odit veritatis voluptate quis quas, sequi asperiores praesentium nam pariatur veniam iusto ea dolore debitis, doloribus deleniti voluptates amet nulla.Rerum nemo cum, in veritatis, optio libero sapiente dolor quas quam. Tenetur dicta, eum aut molestiae optio, tempore eligendi eveniet, vel aspernatur eos temporibus. Itaque expedita sed repellendus a libero!Quasi aperiam repudiandae animi delectus ipsam voluptatibus, ratione vero voluptas consequuntur ducimus, excepturi maxime consectetur reprehenderit eveniet enim fuga impedit alias nostrum error quaerat voluptatem aliquam. Dolorum omnis impedit nemo!

Без приоритета (18)

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Mollitia placeat cum, ex nostrum sunt magni deserunt voluptates maiores vel ipsum porro neque, hic, numquam nulla animi aliquam? Veritatis, accusamus, corporis.

>> Приоритет 1

Примечательно то, что этот блок находился в самом конце списка элементов таблицы. Ещё интересно, что этот блок - "белая ворона", ибо среди массы блоков без приоритетов, ему он был задан, естествено, равный 1-е. Кстати, в данной таблице есть брат этого блока, он тоже имеет приоритет, только с другим значением.