Сортировка и позиционирование облачных меток в div с фиксированной шириной

У меня есть div с фиксированной шириной, который содержит теги, такие как теги stackoverflow.

Tag Container - unwanted

Теперь меня беспокоит, что тег Hallo находится в последней строке, но он будет вписываться в первую строку. Вот так:

Tag Container - wanted

Порядок элементов не имеет значения. Таким образом, переупорядочение будет вариантом.

Вопрос: Как я могу это достичь? В настоящее время я использую конструкцию <ul><li></li></ul>.

Самый лучший способ - это CSS-путь, но я догадываюсь, что это касается JS, чтобы решить эту проблему. Любые идеи будут оценены:)

UPDATE JSFiddle: http://jsfiddle.net/CLj2q/

Ответ 1

Получил: jsFiddle - здесь

$(function() {
    $('.as-close').click(function(e) { $(this).parent().remove(); });
    DoTagSort();
});

function DoTagSort() {

    var TheItems = [], TheHTML = '';
    var TheLinks = $('.as-selections').find('li').each(function () {
        TheItems.push($(this).text().slice(1));        
    });

    TheItems.sort(function(a, b) { return b.length - a.length; });

    var TheTag = '<li class="as-selection-item"><a class="as-close">×</a>';

    while(TheItems.length > 1) {

        TheHTML = TheHTML + TheTag + TheItems[0] + '</li>';
        TheHTML = TheHTML + TheTag + TheItems[TheItems.length - 1] + '</li>';

        TheItems.splice(0, 1);
        TheItems.splice(TheItems.length - 1, 1);
    }

    if (TheItems.length) {
        TheHTML = TheHTML + TheTag + TheItems[0] + '</li>';
    }

    $('.as-selections').html(TheHTML);
}

enter image description here

Ответ 2

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

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

Учитывая, что требование порядка кажется чисто внешним (т.е. не функциональным), нет никакого вреда в улучшении стандартного представления с плавающей точкой, которое вы отображали на скриншоте с помощью JavaScript. Это означает, что посетители с поддержкой JS получат "расширенный" вид (с упорядоченными элементами), в то время как пользователи, не являющиеся JS, будут обладать полностью функциональным облаком тегов, хотя и немного менее организованным.

jQuery Masonry или Isotope, вероятно, сделает будет делать именно то, что вам нужно.

Ответ 3

Это не работает. И немного обмана с масонством (обратите внимание на columnWidth: 1).

   $('.as-selections').masonry({
      itemSelector: '.as-selection-item'
      , columnWidth: 1 });

http://jsfiddle.net/D5ud7/1/

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