2013-08-15 2 views
7

Нынешний подход наш сайт использует разбить один список в несколько колонок является использование нескольких ul S:Как я могу разбить один список на несколько столбцов семантически?

<ul> 
    <li>one</li> 
    <li>two</li> 
</ul> 
<ul> 
    <li>three</li> 
    <li>four</li> 
</ul> 

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

  1. использует следующую структуру разметки

    <ul> 
        <li>one</li> 
        <li>two</li> 
        <li>three</li> 
        <li>four</li> 
    </ul> 
    
  2. Организует так:

    one three 
    two four 
    

    Не так:

    one two 
    three four 
    
  3. Работы без изменений, если изменения длины списка, или если элементы переносят несколько строк.

  4. Использует действительный семантический HTML.
  5. Работает до IE8.

Идеальное решение - только CSS, но я открыт для использования jQuery UI или легкого Javascript.

(. PS, here's my CSS attempt, с заметными проблемами)

Edit: Этот вопрос относится только к семантических списков. Другой, предположительно «дублирующий» вопрос касается <div> элементов, который является другим мячом, потому что допускается дополнительная разметка. Никакая дополнительная разметка не допускается между <ul> и <li>. Этот вопрос сфокусирован на семантике, что означает, что акцент делается на использовании HTML, чтобы указать с максимально подробными сведениями о содержании.

+0

CSS только было бы сложно, так как вам нужно будет знать, какие из них будут плавать влево, а какие - плавать вправо, однако с помощью js вам нужно будет добавить один класс в первую половину из них, а другой класс во вторую половину, один плавающий оставил другое плавающее право. –

+0

вы можете использовать n-й дочерний селектор, как нечетный и четный, но он не будет работать в IE8 –

+0

@BrianGlaz нечетно/даже приведет к «одной двух» в строке 1 и «три четверых» на второй строке, а не в предполагаемой «одной» три 'и' two four' –

ответ

2

К сожалению ответить на мой собственный вопрос, но я думаю, что я получил только CSS-решение.

Here it is on jsFiddle.

В основном, я использую общий селектор (это символ: ~, работает in IE7 тоже!), Чтобы выделить все элементы после точки останова и переместить их вверх и вверх. Пока вы устанавливаете высоту линии, кажется, что перекрестный браузер работает до IE7.

HTML:

<ul> 
    <li>one</li> 
    <li>two</li> 
    <li class="newline">three</li> 
    <li>four</li> 
</ul> 

CSS:

.newrow, 
.newrow ~ li { 
    margin-left: 120px; 
    margin-top: -100px; 
    margin-bottom: 100px; 
} 

я упускаю что-то очевидное здесь?

+0

Привет, спасибо, что поделились этим, это крутая идея. Вопрос - как сделать три столбца? – Drewdavid

+0

Просто выполните 'class = col2' и' class = col3', где вы хотите начать разрывы столбцов. Затем сделайте CSS таким же, как у меня, но для 'col3' это' margin-left: 240px'. – brentonstrine

+1

[Вот JSfiddle] (http://jsfiddle.net/hH53F/20/), чтобы лучше объяснить. В основном '.col2, .col2 ~ li {margin-left: 270px; Запас-топ: -220px; margin-bottom: 220px;} ' – brentonstrine

2

CSS Columns - лучшее решение, но не работает для старых браузеров. Вы можете использовать nth-child, чтобы сделать что-то близко, но вы не получите список разделов (вам также понадобится полиполк, чтобы использовать его в старых браузерах). Самое простое решение, вероятно, было бы javascript - оно разделило бы списки, но также оставило бы ваш код чистым. Вот функция для преобразования списков в любое количество столбцов.

http://jsfiddle.net/UrH69/

SCRIPT

$.fn.extend({ 
    list2Columns: function(numCols) { 
     var listItems = $(this).find('li'); /* get the list data */ 
     var listHeader = $(this); 
     var numListItems = listItems.length; 
     var numItemsPerCol = Math.ceil(numListItems/numCols); /* divide by the number of columns requires */ 
     var currentColNum = 1, currentItemNumber = 1, returnHtml = '', i = 0; 

     /* append the columns */ 
     for (i=1;i<=numCols;i++) { 
      $(this).parent().append('<ul class="column list-column-' + i + '"></ul>'); 
     } 

     /* append the items to the columns */ 
     $.each(listItems, function (i, v) 
     {  
      if (currentItemNumber <= numItemsPerCol){ 
       currentItemNumber ++; 
      } else { 
       currentItemNumber = 1; 
       currentColNum ++; 
      } 
      $('.list-column-'+currentColNum).append(v); 
     }); 
     $(this).remove(); 
    } 
}); 

ПРИМЕНЕНИЕ

$('ul').list2Columns(2); // Change this number to change num of columns 

HTML

<ul> 
    <li>one</li> 
    <li>two</li> 
    <li>three</li> 
    <li>four</li> 
    <li>five</li> 
    <li>six</li> 
</ul> 

CSS

.column { float:left; } 
+0

У вас хорошее начало, но оно еще не закончено. Этот код не будет работать, например, если у вас несколько списков на одной странице. – MightyPork

+0

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

5

Вы можете использовать столбцы для браузеров, которые поддерживают

DEMO http://jsfiddle.net/kevinPHPkevin/eaewX/33/

Ниже приведен пример JQuery для полной поддержки браузера

DEMO http://jsfiddle.net/kevinPHPkevin/MKL4g/131/

var postsArr = new Array(), 
    $postsList = $('ul.posts'); 

//Create array of all posts in lists 
$postsList.find('li').each(function(){ 
    postsArr.push($(this).html()); 
}) 

//Split the array at this point. The original array is altered. 
var firstList = postsArr.splice(0, Math.round(postsArr.length/2)), 
    secondList = postsArr, 
    ListHTML = ''; 

function createHTML(list){ 
    ListHTML = ''; 
    for (var i = 0; i < list.length; i++) { 
     ListHTML += '<li>' + list[i] + '</li>' 
    }; 
} 

//Generate HTML for first list 
createHTML(firstList); 
$postsList.html(ListHTML); 

//Generate HTML for second list 
createHTML(secondList); 
//Create new list after original one 
$postsList.after('<ul class="posts"></ul>').next().html(ListHTML); 
+0

отличный подход jQuery. Вместо того, чтобы пытаться понять, что нужно разделить, JavaScript делает это за вас. плюс все возвращается к одному списку, если JavaScript отключен, и он складывается, если окно тонкое. - Спасибо, что поделился! – blackhawk

+0

Hi Vector, я буду использовать ваш код и модифицировать его для достижения аналогичной задачи. Благодарю вас за публикацию. Я неясен в отношении законностей, и поэтому я также свяжусь с этим ответом в своем коде. Пожалуйста, дайте мне знать, если у вас возникнут какие-либо возражения. –

3

"Правильный" способ сделать это было бы использовать CSS3 столбцы:

Но это будет только вам IE10.

Я бы порекомендовал идти по этому маршруту, а затем с помощью прокладок IE и javascript o обрабатывал IE9 и IE8. Я забыл, но modernizr может обеспечить прокладку для помощи вам.

+1

Где код? Если эти ссылки опускаются, этот ответ будет бесполезен для будущих пользователей. – cimmanon

0

вы можете использовать CSS-столбец счетчик для что это демо работает только в хроме, но вы можете сделать это кросс-браузер

http://jsfiddle.net/UuwKC/

ul {-webkit-column-count:2} 
Смежные вопросы