Я новичок в 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>
чтобы повернуть всю графику влево на 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>
Просто снова используйте transform: rotate
на нужных элементах. Если вы хотите повернуть только текст, вам придется обернуть его <span>
элементами.
Хорошо, я попробую. Но я упомянул, что рисунок перекрывает верхний край.
Используйте transform-origin: bottom
или значения пикселей (x и y), чтобы настроить его так, как вы хотите. Вы также можете добавить минимальную высоту на <div class = "tree">
, эквивалентную высоте вашего узла дерева, чтобы она не нарушала ваш макет. И если вы хотите повернуть графику и текст, это означает, что все это должно было быть горизонтальным и, следовательно, не закодировано таким образом.
Идеально! Большое спасибо. Не могли бы вы отредактировать свой пример, чтобы повернуть текст узла горизонтально?