[英]accordion button within <h2> fails to open or close
手風琴工作正常,直到我將<h2>
標簽移到按鈕之外,因為它沒有通過 html5 驗證。
我對 javascript 不太了解,在 w3schools 網站上找到了代碼。 當<h2>
標簽位於<button>
標簽內時,它工作得很好。
<h2><button class="accordion" id="uses">Lorem ipsum</button></h2>
<div class="panel">
<div class="accordioncontent">
<h3>Lorem ipsum...</h3>
</div>
</div>
<script type="text/javascript">
var acc = document.getElementsByClassName("accordion");
var i;
for (i = 0; i < acc.length; i++) {
acc[i].onclick = function() {
this.classList.toggle("active");
var panel = this.nextElementSibling;
if (panel.style.maxHeight){
panel.style.maxHeight = null;
} else {
panel.style.maxHeight = panel.scrollHeight + "px";
}
}
}
</script>
h2 button.accordion {
display: inline-block;
float: left;
width: 100%;
font-size: 43px;
font-family: 'Open Sans', sans-serif;
text-align: left;
}
button.accordion:after {
content: '\02795';
font-size: 25px;
float: right;
margin-top: 16px;
}
button.accordion.active:after {
content: "\2716";
}
div.panel {
width: 880px;
max-height: 0;
margin: 0 auto;
background-color: white;
overflow: hidden;
}
.accordioncontent {
padding: 18px 25px;
min-height: 250px;
}
檢查您的 CSS,您使用的是 h2 標簽。
h2 button.accordion {
display: inline-block;
float: left;
width: 100%;
font-size: 43px;
font-family: 'Open Sans', sans-serif;
text-align: left;
}
錯誤是由於這一行: this.nextElementSibling;
h2
位於按鈕內,元素按鈕的兄弟元素是具有 .panel 類的 div。 一旦將按鈕放在h2
, nextElementSibling
它就找不到同級元素,因為它是元素中唯一的子元素。
你應該把這一切想象成一棵樹
Document
+-H2
| +-Button
+-div.panel
檢查有關 DOM 樹的信息https://www.w3schools.com/js/js_htmldom.asp以及有關元素的 nextElementSibling https://www.w3schools.com/jsref/prop_element_nextelementsibling.asp屬性如何工作的信息
var acc = document.getElementsByClassName("accordion"); var i; for (i = 0; i < acc.length; i++) { acc[i].onclick = function() { this.classList.toggle("active"); console.dir(this); <!--No siblings for button inside h2 element--> console.dir(this.nextElementSibling); <!--Existing sibling for parent Node--> var panel = this.parentNode.nextElementSibling; if (panel.style.maxHeight){ panel.style.maxHeight = null; } else { panel.style.maxHeight = panel.scrollHeight + "px"; } } }
h2 button.accordion { display: inline-block; float: left; width: 100%; font-size: 43px; font-family: 'Open Sans', sans-serif; text-align: left; } button.accordion:after { content: '\\02795'; font-size: 25px; float: right; margin-top: 16px; } button.accordion.active:after { content: "\\2716"; } div.panel { width: 880px; max-height: 0; margin: 0 auto; background-color: white; overflow: hidden; } .accordioncontent { padding: 18px 25px; min-height: 250px; }
<h2><button class="accordion" id="uses">Lorem ipsum</button></h2> <div class="panel"> <div class="accordioncontent"> <h3>Lorem ipsum...</h3> </div> </div>
您必須更改此 js 行:
var panel = this.nextElementSibling;
為了這:
var panel = this.parentNode.nextElementSibling;
因為nextElementSibling函數嘗試在按鈕之后獲取下一個 html 對象。 如果您在按鈕標簽內有 h2 標簽,那么下一個標簽是帶有面板類的 div 標簽,但如果您將 Button 移動到 h2 標簽內,則 Button 是最后一個對象,並且nextElementSibling函數不返回任何內容。
在nextElementSibling函數之前調用parentNode函數將返回按鈕的父級之后的下一個對象。 在這種情況下,按鈕標簽的父對象是 h2 標簽,h2 標簽之后的下一個對象是帶有面板類的 div 標簽。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.