Как бы вы заказывали плитки на приборной панели?

Этот вопрос может быть немного длинным, и изображения делают его довольно большим, но со мной:)

Мне поручено создать интерфейс панели инструментов в нашем веб-приложении ASP.NET MVC 3. Сначала я расскажу о функциях, которые необходимы для этого проекта, и я приложу все усилия, чтобы проиллюстрировать, что я намерен создать, чтобы разместить все эти функции.

Обязательные функции

  • Личный кабинет будет содержать виджеты (или фрагменты), которые будут перетаскиваться в интерфейсе панели управления.

  • При перетаскивании виджетов окружающие виджеты будут соответствующим образом переупорядочивать себя.

  • Виджеты не являются повторно значимыми или разборчивыми, но они будут съемными. Пользователь добавит виджеты обратно через меню, если они пожелают.

  • Виджеты должны размещать окна браузера переменной ширины. Вертикальное пространство практически неограничено.

  • Высота и ширина виджета будут составлять до 300 пикселей, максимальная высота которых составит 900 пикселей. Другими словами, виджет может быть: 300 x 300, 600 x 300, 300 x 900, 900 x 900 и т.д.

Что я планирую построить

Вот несколько иллюстраций того, что я надеюсь построить.

hJbCx.jpg m

Размеры не идеальны, но это показывает панель управления с 9 виджетами на ней. Все виджеты аккуратно и делают все возможное, чтобы элегантно заполнить ширину экрана. Однако виджеты не должны формировать идеальный квадрат или прямоугольник. Danglers в порядке, как показано ниже.

PGUQMl.jpg

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

Мой вопрос

У меня есть концепция, но мне трудно понять, с чего начать. Я не так разбираюсь в математике, как мне бы хотелось, и мне нужна помощь, которую нужно указать в правильном направлении. Люди на SO всегда кажутся удивительными при решении такого рода проблем.

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

Как мне получить:

pZo8Jl.jpg

Для этого:

PGUQM.jpg

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

TgSrq.png


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

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

Я знаю, что это высокий порядок, но любая помощь приветствуется. Я не ожидаю полномасштабных решений или реализаций. Мне просто нужно толчок в правильном направлении, я думаю. Возможно, простое описание мозгового штурма логики для прокрутки виджета и того, что нужно вычислить, чтобы достичь наилучшей конфигурации.

Спасибо, что прочитал мой очень длинный вопрос!

Ответ 1

После исследования jQuery Masonry, изотопа jQuery и даже пользовательского алгоритма заполнения блоков я наткнулся на другой плагин jQuery, известный как jQuery Gridster, который делает именно то, что я хочу. Есть несколько причуд с плагином, и он не очень отполирован, но с несколькими настройками я смог эффективно использовать его.

Примечание. Один из этих причуд - это API-интерфейс плагина. Когда вы пытаетесь динамически удалять элементы из сетки, используя параметр remove в API-интерфейсе плагина, он генерирует целую кучу ошибок. Это своего рода состояние гонки, потому что это происходит спорадически. Вероятно, ошибка была пропущена, потому что, когда вы используете API только для удаления одного элемента одновременно, он работает 99% времени. Если вы удаляете несколько экземпляров с быстрой последовательностью (путем циклического перебора и вызова API несколько раз или путем передачи функции удаления завернутый набор с более чем одним элементом), вы получите кучу ошибок консоли.

Мне нужно было удалить все плитки из сетки и перезагрузить новый набор плиток. Было проще просто использовать jQuery для удаления элемента, на который был вызван Gridster, а затем вызвать плагин с самого начала, передав ему новый набор фрагментов.

Ответ 2

Вы можете попробовать что-то вроде jQuery Masonry. Похоже, он может, по крайней мере, решить некоторые проблемы, которые вы хотите решить. Кроме того, для некоторого вдохновения и некоторого кода для просмотра, посмотрите, как StackExchange перечисляет свои сайты QA: http://stackexchange.com/sites?view=grid