JavaScript 点击时显示不可见的 div

JavaScript Show invisible divs on click

我 运行 遇到一个问题,当我单击按钮时,它只是翻转图标,但仅在第二次单击时使不可见的字段可见。有什么想法吗? (这是一个 gif 来显示我的问题:https://ibb.co/cvz7pWC) 这也是我的代码:

function moreSoc() {
    
    var moresoc = document.getElementById("moresoc");
    var btnText = document.getElementById("mbtn");

    if (moresoc.style.display === "none" ) {
        moresoc.style.display = "block";
        mbtn.innerHTML = "More ▲";
    } else {
        moresoc.style.display = "none";
        mbtn.innerHTML = "More ▼"
    }

}
.morebutton {
    border: none;
    background: #fff;
    color: #111;
    font-size: 32px;
}

#moresoc {
    display: none;
}
<div class="wrapper more">
            <button class="morebutton" id="mbtn" onclick="moreSoc()">More ▲</button>
        </div>
        <section class="social-links" id="moresoc">
            <div class="wrapper">
                <h2>Others</h2>
                    <div class="social-link facebook">
                        <p>Facebook</p>
                    </div>
                    <div class="social-link instagram">
                        <p>Instagram</p>
                    </div>
                    <div class="social-link twitter">
                        <p>Twitter</p>
                    </div>
                    <div class="social-link youtube">
                        <p>Youtube</p>
                    </div>
            </div>
        </section>

这可能是因为您第一次没有将 element.style.display 读成 none。这是因为它尚未被 JavaScript 设置,而只是被 css 设置。我建议更改您的 if 语句以检查 not "block".

function moreSoc() {
    
    var moresoc = document.getElementById("moresoc");
    var btnText = document.getElementById("mbtn");

    if (moresoc.style.display != "block" ) {
        moresoc.style.display = "block";
        mbtn.innerHTML = "More ▲";
    } else {
        moresoc.style.display = "none";
        mbtn.innerHTML = "More ▼"
    }

}
.morebutton {
    border: none;
    background: #fff;
    color: #111;
    font-size: 32px;
}

#moresoc {
    display: none;
}
<div class="wrapper more">
            <button class="morebutton" id="mbtn" onclick="moreSoc()">More ▼</button>
        </div>
        <section class="social-links" id="moresoc">
            <div class="wrapper">
                <h2>Others</h2>
                    <div class="social-link facebook">
                        <p>Facebook</p>
                    </div>
                    <div class="social-link instagram">
                        <p>Instagram</p>
                    </div>
                    <div class="social-link twitter">
                        <p>Twitter</p>
                    </div>
                    <div class="social-link youtube">
                        <p>Youtube</p>
                    </div>
            </div>
        </section>

ElementCSSInlineStyle.style 仅 returns(或设置)元素上的内联样式。在您第一次点击时,没有内联显示 属性 可供阅读,因此您的条件将其设置为 none。第二次单击时,您的条件找到 none 并将其设置为 block.

寻找 !block 的答案解决了这个紧迫的问题,但它仍然将您的样式与您的 js 联系在一起,而不是将其保留在您的 CSS 中。这意味着如果 div 的默认显示 属性 需要更改布局(内联块、flex 等),则需要在 js 和 [=37] 中更改它=].

出于这个原因,我建议根本不要使用内联样式,而是使用 Element.classList 来管理来自 CSS 的应用样式——在这种情况下,只是 adding/removing .hidden class 将显示设置为 none 而无需知道适当的可见显示默认值是什么。

此外,由于您无论如何都要在代码中查询按钮元素,因此最好也从您的 js 中应用点击侦听器而不是内联。

function moreSoc() {
  const moresoc = document.getElementById("moresoc");
  
  if (moresoc.classList.contains('hidden')) {
    moresoc.classList.remove('hidden');
    mbtn.innerHTML = "More ▲";
  } else {
    moresoc.classList.add('hidden');
    mbtn.innerHTML = "More ▼"
  }
}

const mbtn = document.getElementById("mbtn");
mbtn.addEventListener('click', moreSoc);
.morebutton {
    border: none;
    background: #fff;
    color: #111;
    font-size: 32px;
}

#moresoc {
    
}

.hidden {
  display: none;
}
<div class="wrapper more">
  <button class="morebutton" id="mbtn">More ▲</button>
</div>
<section class="social-links hidden" id="moresoc">
  <div class="wrapper">
    <h2>Others</h2>
    <div class="social-link facebook">
      <p>Facebook</p>
    </div>
    <div class="social-link instagram">
      <p>Instagram</p>
    </div>
    <div class="social-link twitter">
      <p>Twitter</p>
    </div>
    <div class="social-link youtube">
      <p>Youtube</p>
    </div>
  </div>
</section>