Центрировать корень многостороннего дерева в HTML/CSS

Я новичок в HTML/CSS и хотел бы центрировать корень между узлами 2 и 4. Я думал о фиксированном расстоянии между узлами 2, 3 и 4, а затем центрировать корень по отношению ко всей графике.

Если возможно, я хотел бы повернуть весь рисунок влево на 90°.

Любая помощь приветствуется!

* {
  margin: 0;
  padding: 0;
}

.tree ul {
  padding-top: 20px;
  position: relative;
}

.tree li {
  float: left;
  text-align: center;
  list-style-type: none;
  position: relative;
  padding: 20px 5px 0 5px;
}

.tree li::before,
.tree li::after {
  content: '';
  position: absolute;
  top: 0;
  right: 50%;
  border-top: 1px solid #ccc;
  width: 50%;
  height: 20px;
}

.tree li::after {
  right: auto;
  left: 50%;
  border-left: 1px solid #ccc;
}

.tree li:only-child::after,
.tree li:only-child::before {
  display: none;
}

.tree li:only-child {
  padding-top: 0;
}

.tree li:first-child::before,
.tree li:last-child::after {
  border: 0 none;
}

.tree li:last-child::before {
  border-right: 1px solid #ccc;
  border-radius: 0 5px 0 0;
}

.tree li:first-child::after {
  border-radius: 5px 0 0 0;
}

.tree ul ul::before {
  content: '';
  position: absolute;
  top: 0;
  left: 50%;
  border-left: 1px solid #ccc;
  width: 0;
  height: 20px;
}

.tree li a {
  border: 1px solid #ccc;
  border-radius: 25px 25px 25px 25px;
  padding: 5px 10px;
  text-decoration: none;
  color: #666;
  font-family: arial, verdana, tahoma;
  font-size: 11px;
  display: inline-block;
}
<div class = "tree">
  <ul>
    <li>
      <a href = "#">1</a>
      <ul>
        <li>
          <a href = "#">2</a>
          <ul>
            <li>
              <a href = "#">2.1</a>
            </li>
            <li>
              <a href = "#">2.2</a>
            </li>
          </ul>
        </li>
        <li>
          <a href = "#">3</a>
          <ul>
            <li>
              <a href = "#">3.1</a>
            </li>
            <li>
              <a href = "#">3.2</a>
            </li>
          </ul>
        </li>
        <li>
          <a href = "#">4</a>
          <ul>
            <li>
              <a href = "#">4.1</a>
            </li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>
</div>
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
190
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

чтобы повернуть всю графику влево на 90°, я предлагаю использовать преобразования CSS. Поскольку у вашего блока нет заданной ширины и высоты, я бы установил его на display: inline-block, чтобы ограничить его ширину и иметь возможность вращать его так, как мы хотим.

Чтобы центрировать верхний элемент и/или иметь заданную ширину для каждого узла, либо используйте минимальную ширину для другого элемента (я присвоил ему класс .special), либо дайте ему дочерние узлы и установите их непрозрачность или видимость на 0. потом. Если вы используете решение с минимальной шириной, вам нужно установить его <li> дочерние элементы в float: none, чтобы они были отцентрированы.

* {
  margin: 0;
  padding: 0;
}

.tree ul {
  padding-top: 20px;
  position: relative;
}

/* Using display: inline-block to limit its width */

.tree > ul {
  display: inline-block;
  transform: rotate(90deg);
}

/* Clearing floats (so <ul> has a defined height) */

.tree ul:after {
  content: "";
  display: table;
  clear: both;
}

.tree li {
  float: left;
  text-align: center;
  list-style-type: none;
  position: relative;
  padding: 20px 5px 0 5px;
}

.tree li::before,
.tree li::after {
  content: '';
  position: absolute;
  top: 0;
  right: 50%;
  border-top: 1px solid #ccc;
  width: 50%;
  height: 20px;
}

.tree li::after {
  right: auto;
  left: 50%;
  border-left: 1px solid #ccc;
}

.tree li:only-child::after,
.tree li:only-child::before {
  display: none;
}

.tree li:only-child {
  padding-top: 0;
}

.tree li:first-child::before,
.tree li:last-child::after {
  border: 0 none;
}

.tree li:last-child::before {
  border-right: 1px solid #ccc;
  border-radius: 0 5px 0 0;
}

.tree li:first-child::after {
  border-radius: 5px 0 0 0;
}

.tree ul ul::before {
  content: '';
  position: absolute;
  top: 0;
  left: 50%;
  border-left: 1px solid #ccc;
  width: 0;
  height: 20px;
}

.tree li a {
  border: 1px solid #ccc;
  border-radius: 25px 25px 25px 25px;
  padding: 5px 10px;
  text-decoration: none;
  color: #666;
  font-family: arial, verdana, tahoma;
  font-size: 11px;
  display: inline-block;
}

.tree .special {
  min-width: 94.594px;
}

.tree .special > ul > li {
  float: none;
}
<div class = "tree">
  <ul>
    <li>
      <a href = "#">1</a>
      <ul>
        <li>
          <a href = "#">2</a>
          <ul>
            <li>
              <a href = "#">2.1</a>
            </li>
            <li>
              <a href = "#">2.2</a>
            </li>
          </ul>
        </li>
        <li>
          <a href = "#">3</a>
          <ul>
            <li>
              <a href = "#">3.1</a>
            </li>
            <li>
              <a href = "#">3.2</a>
            </li>
          </ul>
        </li>
        <li class = "special">
          <a href = "#">4</a>
          <ul>
            <li>
              <a href = "#">4.1</a>
            </li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>
</div>

Идеально! Большое спасибо. Не могли бы вы отредактировать свой пример, чтобы повернуть текст узла горизонтально?

PascalS 08.04.2019 13:03

Просто снова используйте transform: rotate на нужных элементах. Если вы хотите повернуть только текст, вам придется обернуть его <span> элементами.

Jake 08.04.2019 13:06

Хорошо, я попробую. Но я упомянул, что рисунок перекрывает верхний край.

PascalS 08.04.2019 13:36

Используйте transform-origin: bottom или значения пикселей (x и y), чтобы настроить его так, как вы хотите. Вы также можете добавить минимальную высоту на <div class = "tree">, эквивалентную высоте вашего узла дерева, чтобы она не нарушала ваш макет. И если вы хотите повернуть графику и текст, это означает, что все это должно было быть горизонтальным и, следовательно, не закодировано таким образом.

Jake 08.04.2019 13:42

Другие вопросы по теме