我在获取这个简单的CSS菜单时遇到了问题,我把它放在一起工作。
我正在使用JSON对象并将其转换为列表。
Here is the jsFiddle for all of it
以下是代码:
function buildTable(table) {
this.iterateChildren = function(p_ul, table) {
var li;
for (var key in table) {
li = document.createElement('li');
li.className = "li-li";
p_ul.appendChild(li);
li.collapser = document.createElement('div');
li.collapser.className = 'collapser li-group';
li.collapser.addEventListener('click', CollapserClick, true);
li.appendChild(li.collapser);
li.name_area = document.createElement('div');
li.name_area.className = 'name-area li-group';
li.name_area.innerHTML = key;
li.appendChild(li.name_area);
if (typeof table[key] === 'object') {
li.ul = document.createElement('ul');
li.ul.className = 'inner-ul collapsed';
li.appendChild(li.ul);
li.collapser.innerHTML = '+)';
li.collapser.ul_ref = li.ul;
this.iterateChildren(li.ul, table[key]);
} else {
li.value_area = document.createElement('div');
li.value_area.className = 'value-area li-group';
li.name_area.innerHTML += ": ";
if (table[key].toString().length) {
li.value_area.innerHTML = table[key];
} else {
li.name_area.className += " unav";
li.value_area.className += " unav";
li.value_area.innerHTML = "N/A";
}
li.appendChild(li.value_area);
}
}
}.bind(this);
var inr_ul = document.getElementById('innerUL');
this.iterateChildren(inr_ul, table);
}
function CollapserClick(evt) {
var elem = evt.srcElement || evt.currentTarget;
if (elem.ul_ref) {
if (elem.ul_ref.className.indexOf('collapsed') > -1) {
elem.ul_ref.className = 'inner-ul expanded';
elem.innerHTML = "-)";
} else {
elem.ul_ref.className = 'inner-ul collapsed';
elem.innerHTML = "+)";
}
}
}
var test_table = {
"one": {
"One": 1,
"Two": 2,
"Three": 3
},
"Two": {
"One": "One",
"Two": "Two",
"Three": "Three"
},
"Four": "Four",
"Five": {
"Five": 5,
"Six": 6,
"Seven": 7
},
"Six": {
"Six": 6,
"Seven": 7,
"Eight": 8,
"Nine": 9,
"Ten": {
"One": 1,
"Two": 2,
"Three": 3,
"Four": 4,
"Five": 5,
"Six": 6,
"Seven": 7,
"Eight": 8,
"Nine": 9,
"Ten": 10
}
}
};
buildTable(test_table);

#outerdiv {
width: 100%;
max-width: 400px;
height: 80%;
max-height: 750px;
margin-left: auto;
margin-right: auto;
vertical-align: middle;
overflow: hidden;
border: 1px solid grey;
border-radius: 8px;
background-color: #cccccc;
}
#innerdiv {
width: 90%;
max-width: 380px;
height: 70%;
max-height: 700px;
margin-left: auto;
margin-right: auto;
margin-top: 5%;
margin-bottom: 5%;
vertical-align: middle;
overflow: auto;
border: 1px solid grey;
border-radius: 5px;
background-color: white;
}
.li-li {
white-space: nowrap;
list-style: none;
margin: 3px 3px 3px 3px;
}
.li-group {
display: inline-block;
}
.collapsed {
display: none !important;
}
.expanded {
display: inline-block !important;
}
.collapser {
margin-right: 3px;
padding: none;
}
.name-area {} .inner-ul {
margin: 8px 8px 8px 0px;
}
.value-area {} .unav {
color: grey;
}
* {
font-family: "Open Sans", Vegur, sans-serif !important;
letter-spacing: 0.01 em;
}

<div id="outerDiv">
<div id="innerDiv">
<ul id="innerUL">
</ul>
</div>
</div>
&#13;
我的问题是作为name div
的父级的collapser div
的子级li
和ul
被推到{{1}的底部1}} ul
展开时。有没有办法用纯CSS来解决这个问题?
答案 0 :(得分:1)
您可以添加
.li-group {
vertical-align: top;
}
function buildTable(table) {
this.iterateChildren = function(p_ul, table) {
var li;
for (var key in table) {
li = document.createElement('li');
li.className = "li-li";
p_ul.appendChild(li);
li.collapser = document.createElement('div');
li.collapser.className = 'collapser li-group';
li.collapser.addEventListener('click', CollapserClick, true);
li.appendChild(li.collapser);
li.name_area = document.createElement('div');
li.name_area.className = 'name-area li-group';
li.name_area.innerHTML = key;
li.appendChild(li.name_area);
if (typeof table[key] === 'object') {
li.ul = document.createElement('ul');
li.ul.className = 'inner-ul collapsed';
li.appendChild(li.ul);
li.collapser.innerHTML = '+)';
li.collapser.ul_ref = li.ul;
this.iterateChildren(li.ul, table[key]);
} else {
li.value_area = document.createElement('div');
li.value_area.className = 'value-area li-group';
li.name_area.innerHTML += ": ";
if (table[key].toString().length) {
li.value_area.innerHTML = table[key];
} else {
li.name_area.className += " unav";
li.value_area.className += " unav";
li.value_area.innerHTML = "N/A";
}
li.appendChild(li.value_area);
}
}
}.bind(this);
var inr_ul = document.getElementById('innerUL');
this.iterateChildren(inr_ul, table);
}
function CollapserClick(evt) {
var elem = evt.srcElement || evt.currentTarget;
if (elem.ul_ref) {
if (elem.ul_ref.className.indexOf('collapsed') > -1) {
elem.ul_ref.className = 'inner-ul expanded';
elem.innerHTML = "-)";
} else {
elem.ul_ref.className = 'inner-ul collapsed';
elem.innerHTML = "+)";
}
}
}
var test_table = {
"one": {
"One": 1,
"Two": 2,
"Three": 3
},
"Two": {
"One": "One",
"Two": "Two",
"Three": "Three"
},
"Four": "Four",
"Five": {
"Five": 5,
"Six": 6,
"Seven": 7
},
"Six": {
"Six": 6,
"Seven": 7,
"Eight": 8,
"Nine": 9,
"Ten": {
"One": 1,
"Two": 2,
"Three": 3,
"Four": 4,
"Five": 5,
"Six": 6,
"Seven": 7,
"Eight": 8,
"Nine": 9,
"Ten": 10
}
}
};
buildTable(test_table);
#outerdiv {
width: 100%;
max-width: 400px;
height: 80%;
max-height: 750px;
margin-left: auto;
margin-right: auto;
vertical-align: middle;
overflow: hidden;
border: 1px solid grey;
border-radius: 8px;
background-color: #cccccc;
}
#innerdiv {
width: 90%;
max-width: 380px;
height: 70%;
max-height: 700px;
margin-left: auto;
margin-right: auto;
margin-top: 5%;
margin-bottom: 5%;
vertical-align: middle;
overflow: auto;
border: 1px solid grey;
border-radius: 5px;
background-color: white;
}
.li-li {
white-space: nowrap;
list-style: none;
margin: 3px 3px 3px 3px;
}
.li-group {
display: inline-block;
vertical-align: top;
}
.collapsed {
display: none !important;
}
.expanded {
display: inline-block !important;
}
.collapser {
margin-right: 3px;
padding: none;
}
.name-area {} .inner-ul {
margin: 8px 8px 8px 0px;
}
.value-area {} .unav {
color: grey;
}
* {
font-family: "Open Sans", Vegur, sans-serif !important;
letter-spacing: 0.01 em;
}
<div id="outerDiv">
<div id="innerDiv">
<ul id="innerUL">
</ul>
</div>
</div>