7

I want to "paint" the tree on screen using CSS and HTML and not represent it in any way or data structure ...

1

2 Answers 2

31

Unlimited binary and unilevel tree with CSS:

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

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

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

.tree li div {
  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;
}

.tree li div:hover,
.tree li div:hover+ul li div {
  background: #c8e4f8;
  color: #000;
  border: 1px solid #94a0b4;
}

.tree li div:hover+ul li::after,
.tree li div:hover+ul li::before,
.tree li div:hover+ul::before,
.tree li div:hover+ul ul::before {
  border-color: #94a0b4;
}
<div class="tree">
  <ul>
    <li>
      <div><input type="checkbox"> Main <br/> <button> Test Btn </button></div>
      <ul>
        <li>
          <div><input type="checkbox"> Sub-1</div>
        </li>
        <li>
          <div><input type="checkbox"> Sub-2</div>
          <ul>
            <li>
              <div><input type="checkbox"> Sub-2-1</div>
            </li>
            <li>
              <div><input type="checkbox"> Sub-2-2</div>
            </li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>
</div>

Also available on this jsfiddle

Sign up to request clarification or add additional context in comments.

2 Comments

This is a really nice snippet. Ty
Amazing pure CSS solution!
2

A very simple way of creating a tree-like structure with HTML and CSS is nesting <div>s
Each div represents a node, and can have multiple nodes inside:

<div> //root
    <div> //child 1
        <div> //child 1.1
            <div></div> //child 1.1.1
            <div></div> //child 1.1.2
            <div></div> //child 1.1.3
        </div>
        <div></div> //child 1.2
    </div>
    <div></div> //child 2
</div>

Then you can add a margin-top to all divs, so that they appear under its parent div.

A JSFiddle: http://jsfiddle.net/VxRmc/

I've added percentage widths to each div. You can calculate widths if you know how many childs a node has. Or you can use fixed widths...

Yeah, it's not a beautiful tree, but it can't be simpler.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.