2016-12-08 4 views
0

Ну, я использую это как пример what i want to do, но когда у меня много элементов на одном уровне, последние ветви опускаются, и я хочу, чтобы мой div расширялся, когда он переполнялся, ve попытался с overflow-x: auto; переполнение: авто; но это не сработает. Я извлекаю свои «листья» из списка, поэтому я не знаю, сколько элементов будет там.Проблема с Organigram CSS

/*Now the CSS*/ 
 
* {margin: 0; padding: 0;} 
 

 
.tree ul { 
 
    padding-top: 20px; position: relative; 
 
    
 
    transition: all 0.5s; 
 
    -webkit-transition: all 0.5s; 
 
    -moz-transition: all 0.5s; 
 
} 
 

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

 
/*We will use ::before and ::after to draw the connectors*/ 
 

 
.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; 
 
} 
 

 
/*We need to remove left-right connectors from elements without 
 
any siblings*/ 
 
.tree li:only-child::after, .tree li:only-child::before { 
 
    display: none; 
 
} 
 

 
/*Remove space from the top of single children*/ 
 
.tree li:only-child{ padding-top: 0;} 
 

 
/*Remove left connector from first child and 
 
right connector from last child*/ 
 
.tree li:first-child::before, .tree li:last-child::after{ 
 
    border: 0 none; 
 
} 
 
/*Adding back the vertical connector to the last nodes*/ 
 
.tree li:last-child::before{ 
 
    border-right: 1px solid #ccc; 
 
    border-radius: 0 5px 0 0; 
 
    -webkit-border-radius: 0 5px 0 0; 
 
    -moz-border-radius: 0 5px 0 0; 
 
} 
 
.tree li:first-child::after{ 
 
    border-radius: 5px 0 0 0; 
 
    -webkit-border-radius: 5px 0 0 0; 
 
    -moz-border-radius: 5px 0 0 0; 
 
} 
 

 
/*Time to add downward connectors from parents*/ 
 
.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; 
 
    padding: 5px 10px; 
 
    text-decoration: none; 
 
    color: #666; 
 
    font-family: arial, verdana, tahoma; 
 
    font-size: 11px; 
 
    display: inline-block; 
 
    
 
    border-radius: 5px; 
 
    -webkit-border-radius: 5px; 
 
    -moz-border-radius: 5px; 
 
    
 
    transition: all 0.5s; 
 
    -webkit-transition: all 0.5s; 
 
    -moz-transition: all 0.5s; 
 
} 
 

 
/*Time for some hover effects*/ 
 
/*We will apply the hover effect the the lineage of the element also*/ 
 
.tree li a:hover, .tree li a:hover+ul li a { 
 
    background: #c8e4f8; color: #000; border: 1px solid #94a0b4; 
 
} 
 
/*Connector styles on hover*/ 
 
.tree li a:hover+ul li::after, 
 
.tree li a:hover+ul li::before, 
 
.tree li a:hover+ul::before, 
 
.tree li a:hover+ul ul::before{ 
 
    border-color: #94a0b4; 
 
}
<div class="tree"> 
 
    <ul> 
 
    <li> 
 
     <a href="#">Parent</a> 
 
     <ul> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li><a href="#">Grand Child</a></li> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
       <ul> 
 
       <li> 
 
        <a href="#">Great Grand Child</a> 
 
       </li> 
 
       <li> 
 
        <a href="#">Great Grand Child</a> 
 
       </li> 
 
       <li> 
 
        <a href="#">Great Grand Child</a> 
 
       </li> 
 
       </ul> 
 
      </li> 
 
      <li><a href="#">Grand Child</a></li> 
 
      </ul> 
 
     </li> 
 
     </ul> 
 
    </li> 
 
    </ul> 
 
</div> 
 

 
</div>

+0

Самая большая проблема в том, что вы пытаетесь сделать родитель расширить, чтобы соответствовать все его дочерние элементы, которые позиционированы абсолютно, что не может быть сделано в чистом CSS , Существует несколько хаков, которые вы можете использовать, используя элементы «призрак» и промежутки, которые подходят, но не хороши. Вы против использования JS? Было бы довольно легко решить этот путь. – Rockster160

+0

@ Rockster160 Нет, я не против использования JS, если это можно исправить, если бы вы могли мне помочь, я буду очень рад –

+0

Добавлено ответ - и могу ли я добавить: молодец! Очень круто, видя такие диаграммы без использования Canvas или SVG. – Rockster160

ответ

1

CSS может иметь помощь тоже:

  • display:table; это позволяет емкость сжать/расширяется, чтобы соответствовать размеру содержимого. если width указано, он все еще может расширяться, если table-layout не установлен fixed

  • white-space:nowrap; будет держать любой встроенный (или инлайн-боксов) на одной линии.

  • display:inline-block; вместо float. используется с white-space, он не будет обертывать/ломаться в новые строки.

  • font-size, один из способов иметь дело с white-space с отступом кода, который показывает, где теги ведут себя/устанавливаются как встроенные.

/*Now the CSS*/ 
 
* {margin: 0; padding: 0;} 
 
.tree { 
 
    display:table;/* added let me grow as much as needed*/ 
 
    } 
 
.tree ul { 
 
    padding-top: 20px; position: relative; 
 
    white-space:nowrap;/* added */ 
 
    transition: all 0.5s; 
 
    -webkit-transition: all 0.5s; 
 
    -moz-transition: all 0.5s; 
 
    display:table;/* added idem as for parent*/ 
 
    font-size:0;/* added because of white-space, remove it to see what it does */ 
 
} 
 

 
.tree li { 
 
    display:inline-block;/* added instead float*/ 
 
    font-size:1rem;/* added */ 
 
    text-align: center; 
 
    list-style-type: none; 
 
    position: relative; 
 
    padding: 20px 5px 0 5px; 
 
    
 
    transition: all 0.5s; 
 
    -webkit-transition: all 0.5s; 
 
    -moz-transition: all 0.5s; 
 
} 
 

 
/*We will use ::before and ::after to draw the connectors*/ 
 

 
.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; 
 
} 
 

 
/*We need to remove left-right connectors from elements without 
 
any siblings*/ 
 
.tree li:only-child::after, .tree li:only-child::before { 
 
    display: none; 
 
} 
 

 
/*Remove space from the top of single children*/ 
 
.tree li:only-child{ padding-top: 0;} 
 

 
/*Remove left connector from first child and 
 
right connector from last child*/ 
 
.tree li:first-child::before, .tree li:last-child::after{ 
 
    border: 0 none; 
 
} 
 
/*Adding back the vertical connector to the last nodes*/ 
 
.tree li:last-child::before{ 
 
    border-right: 1px solid #ccc; 
 
    border-radius: 0 5px 0 0; 
 
    -webkit-border-radius: 0 5px 0 0; 
 
    -moz-border-radius: 0 5px 0 0; 
 
} 
 
.tree li:first-child::after{ 
 
    border-radius: 5px 0 0 0; 
 
    -webkit-border-radius: 5px 0 0 0; 
 
    -moz-border-radius: 5px 0 0 0; 
 
} 
 

 
/*Time to add downward connectors from parents*/ 
 
.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; 
 
    padding: 5px 10px; 
 
    text-decoration: none; 
 
    color: #666; 
 
    font-family: arial, verdana, tahoma; 
 
    font-size: 11px; 
 
    display: inline-block; 
 
    
 
    border-radius: 5px; 
 
    -webkit-border-radius: 5px; 
 
    -moz-border-radius: 5px; 
 
    
 
    transition: all 0.5s; 
 
    -webkit-transition: all 0.5s; 
 
    -moz-transition: all 0.5s; 
 
} 
 

 
/*Time for some hover effects*/ 
 
/*We will apply the hover effect the the lineage of the element also*/ 
 
.tree li a:hover, .tree li a:hover+ul li a { 
 
    background: #c8e4f8; color: #000; border: 1px solid #94a0b4; 
 
} 
 
/*Connector styles on hover*/ 
 
.tree li a:hover+ul li::after, 
 
.tree li a:hover+ul li::before, 
 
.tree li a:hover+ul::before, 
 
.tree li a:hover+ul ul::before{ 
 
    border-color: #94a0b4; 
 
}
<div class="tree"> 
 
    <ul> 
 
    <li> 
 
     <a href="#">Parent</a> 
 
     <ul> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 
     <li> 
 
      <a href="#">Child</a> 
 
      <ul> 
 
      <li><a href="#">Grand Child</a></li> 
 
      <li> 
 
       <a href="#">Grand Child</a> 
 
       <ul> 
 
       <li> 
 
        <a href="#">Great Grand Child</a> 
 
       </li> 
 
       <li> 
 
        <a href="#">Great Grand Child</a> 
 
       </li> 
 
       <li> 
 
        <a href="#">Great Grand Child</a> 
 
       </li> 
 
       </ul> 
 
      </li> 
 
      <li><a href="#">Grand Child</a></li> 
 
      </ul> 
 
     </li> 
 
     </ul> 
 
    </li> 
 
    </ul> 
 
</div>

0

- ИСПОЛЬЗУЕТ Jquery -

Это не самый красивый, но это похоже на работу:

total = 0 
$('li:not(:has(ul))').each(function() {total += $(this).outerWidth() + 10}) 
$('.tree').width(total) 

Что он делает это найти каждый 'ребенок' у которого нет детей. Итак, самый низкий уровень каждой цепи. $('li:not(:has(ul))')

Затем суммирует outerWidth каждого из них, плюс немного отступов для учета полей.

И, наконец, задает ширину контейнера .tree по размеру, который мы только что вычислили.

+0

Большое вам спасибо !!!! Он работал отлично, спасибо товарищу !!!! –

+0

Вы ставите. :) Рад был помочь! – Rockster160