2013-05-23 21 views
11

Mam div o stałej szerokości, która zawiera "znaczniki", takie jak stackoverflow-tags.Chmura tagów sortowania i pozycjonowania w div o stałej szerokości

Tag Container - unwanted

Teraz, co do mnie niepokojące jest to, że Hallo Tag znajduje się w ostatnim wierszu, ale byłoby zmieścić się w pierwszej linii. Tak:

Tag Container - wanted

Kolejność elementów jest nieistotna. Tak więc zmiana kolejności byłaby opcją.

Pytanie: Jak mogę to osiągnąć? Obecnie używam konstruktu <ul><li></li></ul>.

Najprzyjemniejszym sposobem byłby CSS-Way, ale myślę, że to JS musi rozwiązać ten problem. Wszelkie pomysły będą mile widziane :)

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

+0

Jeżeli HTML jest tworzony po stronie serwera, to chyba najlepiej zamówić znaczniki po stronie serwera zbyt. W przeciwnym razie, skąd pochodzą dane? –

+2

Czy możesz podać skrzypce swojego kodu? – Nitesh

+0

zrobi. powiesić na – Stefan

Odpowiedz

5

Got it: The jsFiddle jest here

$(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

+0

Nie tylko dlatego, że ja też mam odpowiedź, ale to jest szalone rozwiązanie! Problem polega na tym, że zmienia kolejność elementów, nawet jeśli tak naprawdę nie musi i działa tylko dla 2 list kolumn. – Bizniztime

+0

@Bizniztime: który jest DOKŁADNIE tym, o co prosił OP: stała szerokość i nie ma nic przeciwko zmianie kolejności. Masz rację, że jeśli tagi mają tylko 1 lub 2 znaki, to wyglądałoby to dziwnie, ale nie o to zwykle chodzi w tagach. – frenchie

+0

@frencie Tak ustalona szerokość. Ale jaka jest szerokość? Czy zawsze będzie pasował tylko do 2 elementów listy na maksimum w jednym wierszu? – Bizniztime

1

Zakładając, że pojemnik na znacznikach jest zbiorem szerokości, a same znaczniki nie są (tj one dziedziczyć ich szerokość z ich treści, a nie z możliwości nadania im ustawionej szerokości), nie ma ogromnej ilości, którą można zrobić z perspektywy CSS bez łamania i ponownego zamawiania przepływu znaczników.

Jeśli znacznik jest generowany po stronie serwera, jestem pewien, że można obliczyć szerokość i zmienić kolejność przed przeniesieniem znaczników do widoku. Jeśli nie, jesteś trochę utknął bez JavaScript.

Biorąc pod uwagę, że wymóg zamówienia wydaje się być oparty wyłącznie na wyglądzie (tzn. Nie działa), nie ma nic złego w ulepszaniu standardowego widoku float, który został wyświetlony na zrzucie ekranu przy użyciu JavaScript. Oznacza to, że użytkownicy korzystający z JS otrzymają "ulepszony" widok (z ładnie zamówionymi elementami), podczas gdy użytkownicy spoza JS nadal będą mieli w pełni funkcjonalną chmurę znaczników, choć w nieco mniej zorganizowany sposób.

jQuery Masonry lub Isotope prawdopodobnie zrobiłby dokładnie to, czego potrzebujesz.

+0

Nie jestem pewien, czy masoneria rozwiąże problem - myślę, że działa tylko na układach podobnych do siatki. Tym, co OP chce, jest algorytm wypełniacza, który określa wolne miejsce na wszystkich liniach i wstawia elementy dopasowania z innych źródeł. –

+0

Nie jestem pewien, czy zgadzam się z tobą tam Niels, ale dodałem Isotope do mojej odpowiedzi jako alternatywy. Masonry i Isotope działają dokładnie w taki sposób, w jaki opisujesz: algorytm, który chwyta elementy o odpowiedniej szerokości, aby umieścić je w pustych polach w rodzicu. Rozumiem, że masonry i izotop są najczęściej używane w układach grid (i zawierają obliczenia wysokości i szerokości, które nie są potrzebne w tym przypadku), ale ich zachowanie jest dokładnie tym, o co proszą w tym przypadku . – johnkavanagh

+0

Nie ma się z czym nie zgodzić - mówiłem "nie jestem pewien" na podstawie skanu połączonej strony :) Prawdopodobnie jest to jak kręcenie gumową łodzią z armatą, ale w przypadku przetasowań opartych na przepływie są prawdopodobnie mniejsze wtyczki (Nie znam ich jednak) lub nie jest to zbyt skomplikowane w implementacji. –

1

To jest wyłączone z rozwiązania półkowego. I trochę oszukiwania z Masonerią (zauważ kolumnę Width: 1).

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

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

Chyba można znaleźć bardziej odpowiednie dla tej biblioteki lub lepszej formie html dla murowane aby schrupać.

Powiązane problemy