Сворачиваемый список со столбцами?

#javascript #jquery #html #css #list

#javascript #jquery #HTML #css #Список

Вопрос:

Мне нужно иметь иерархический, сворачиваемый список, состоящий из 3 столбцов. У меня работают первые две части, но, похоже, я не могу правильно настроить CSS для третьей. На рисунке показан текущий код:

введите описание изображения здесь (Слегка дублированный текст слева от col3 — это визуальная ошибка со скрипкой.)

Цель состоит в том, чтобы иметь псевдотаблицу с тремя столбцами внутри сворачиваемого списка, так что col1 имеет стандартный отступ списка, а col2 центрируется для всех уровней, а col3 находится справа для всех уровней. Это должно выглядеть так:

введите описание изображения здесь

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

Я пробовал различные другие комбинации margin s и padding s и float: left s, но безуспешно.

Вот почти рабочая скрипка.

HTML:

 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

<body>
  <div id="listContainer">
    <div class="listControl">
      <a id="expandList"><button>Expand All</button></a>
      <a id="collapseList"><button>Collapse All</button></a>
    </div>
    <ul id="expList">
      <li>
        <div class="col1">Non-parent</div>
        <div class="col2">Col2</div>
        <div class="col3">Col3</div>
      </li>
      <li>
        <div class="col1">Parent</div>
        <div class="col2">Col2</div>
        <div class="col3">Col3</div>
        <ul>
          <li>
            <div class="col1">Child</div>
            <div class="col2">Col2</div>
            <div class="col3">Col3</div>
          </li>
        </ul>
      </li>
      <li>
        <div class="col1">Grandparent</div>
        <div class="col2">Col2</div>
        <div class="col3">Col3</div>
        <ul>
          <li>
            <div class="col1">Parent</div>
            <div class="col2">Col2</div>
            <div class="col3">Col3</div>
            <ul>
              <li>
                <div class="col1">Child</div>
                <div class="col2">Col2</div>
                <div class="col3">Col3</div>
              </li>
            </ul>
          </li>
          <li>
            <div class="col1">Parent</div>
            <div class="col2">Col2</div>
            <div class="col3">Col3</div>
            <ul>
              <li>
                <div class="col1">Child</div>
                <div class="col2">Col2</div>
                <div class="col3">Col3</div>
              </li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </div>

</body>
  

CSS:

 /********************/


/* EXPANDABLE LIST  */


/********************/

#listContainer {
  margin-top: 15px;
}

#expList ul,
#expList li {
  list-style: none;
  margin: 0;
  padding: 0;
  cursor: pointer;
}

#expList p {
  margin: 0;
  display: block;
}

#expList p:hover {
  background-color: #121212;
}

#expList li {
  line-height: 140%;
  text-indent: 0px;
  background-position: 1px 8px;
  padding-left: 20px;
  background-repeat: no-repeat;
}


/*This works in Firefox following W3C standards, but not in other browsers!*/


/*https://drafts.csswg.org/css-lists/#marker-content*/


/* Collapsed state for list element */

#expList .collapsed {
  /*    list-style-type: " ";*/
  list-style: none;
  /*padding: 0px;*/
}


/* Expanded state for list element
/* NOTE: This class must be located UNDER the collapsed one */

#expList .expanded {
  /*list-style-type: "-";*/
  list-style: none;
  /*padding: 0px;*/
}


/*code that works for non-Firefox*/

#expList .collapsed:before {
  content: " ";
  width: 1em !important;
  margin-left: -1.2em;
  display: inline-block;
}

#expList .expanded:before {
  content: "-";
  width: 1em !important;
  margin-left: -1.2em;
  display: inline-block;
}

#expList {
  clear: both;
}

.col1 {
  display: inline;
  /*padding-right: 100px;*/
}

.col2 {
  display: inline;
  float: right;
}

.col3 {
  display: inline;
  float: right;
}
  

JS:

 /**************************************************************/
/* Prepares the cv to be dynamically expandable/collapsible   */
/**************************************************************/
function prepareList() {
  $('#expList').find('li:has(ul)')
    .click(function(event) {
      if (this == event.target) {
        $(this).toggleClass('expanded');
        $(this).children('ul').toggle('medium');
      }
      return false;
    })
    .addClass('collapsed')
    .children('ul').hide();

  //Hack to add links inside the cv
  $('#expList a').unbind('click').click(function() {
    window.location($(this).attr('href'));
    return false;
  });

  //Create the button funtionality
  $('#expandList')
    .unbind('click')
    .click(function() {
      $('.collapsed').addClass('expanded');
      $('.collapsed').children('ul').show('medium');
    })
  $('#collapseList')
    .unbind('click')
    .click(function() {
      $('.collapsed').removeClass('expanded');
      $('.collapsed').children('ul').hide('medium');
    })

};

/**************************************************************/
/* Functions to execute on loading the document               */
/**************************************************************/
$(document).ready(function() {
  prepareList()
});
  

Комментарии:

1. Итак, в чем именно проблема?

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

3. «Цель состоит в том, чтобы иметь псевдотаблицу с тремя столбцами внутри сворачиваемого списка, так что col1 имеет стандартный отступ списка, а col2 центрируется для всех уровней, а col3 находится справа для всех уровней». Это то, что я хочу. Мне кажется понятным. Я добавил рисунок.

4. @Deleet Это то, что (jsfiddle) вы хотели.?

5. Я не вижу большой разницы. Похоже, вы только что добавили ширину? Посмотрите на рисунок выше. У вас также есть столбцы в неправильном порядке (как и моя попытка).

Ответ №1:

Решение этой проблемы состояло в том, чтобы понять, что float: right , по-видимому, также выравнивает блоки по правому краю, чтобы они отображались в обратном порядке. Имея это в виду, можно просто изменить порядок блоков, чтобы вернуть нормальный порядок.

Например.:

 <div class="col1">Non-parent</div>
<div class="col4">Col4</div>
<div class="col3">Col3</div>
<div class="col2">Col2</div>
  

Рабочая скрипка.