Открыть складной раздел по ссылке

#javascript #html #css #anchor #expand

#javascript #HTML #css #привязка #Развернуть

Вопрос:

Я создал страницу с расширяемыми / сворачиваемыми разделами, но я не могу понять, как заставить их открываться по ссылке навигации. Расширяемые / сворачиваемые разделы расширяются так, как я хочу, когда на них нажимают, и мои навигационные ссылки приводят меня к нужному разделу, однако я также хотел бы, чтобы навигационные ссылки расширяли соответствующий раздел в дополнение к переходу к этой части страницы. Я немного новичок, поэтому любая помощь будет оценена.

Вот мой HTML, CSS и jQuery:

 var coll = document.getElementsByClassName("collapsible");
var i;

for (i = 0; i < coll.length; i  ) {
  coll[i].addEventListener("click", function() {
    this.classList.toggle("active");
    var content = this.nextElementSibling;
    if (content.style.display === "block") {
      content.style.display = "none";
    } else {
      content.style.display = "block";
    }
  });
}  
 .collapsible {
  background-color: #eee;
  font: 15px/30px "raleway-heavy", sans-serif;
  text-shadow: 0 1px 4px rgba(0, 0, 0, 0.6);
  text-transform: uppercase;
  letter-spacing: 2.5px;
  margin-bottom: 30px;
  margin-top: 18px;
  left: 3px;
  color: #4c4c4c;
  cursor: pointer;
  padding: 18px;
  width: 100%;
  border: none;
  text-align: left;
  outline: none;
  font-size: 15px;
}

.active, .collapsible:hover {
  background-color: #fdc501;
  color: #ffffff;
}

.collapsed-content {
  padding: 0 18px;
  display: none;
  overflow: hidden;
  margin-bottom:30px;
}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<nav id="nav-wrap">
  <ul id="nav" class="nav">
    <li><a class="smoothscroll" href="#link1">Link 1</a></li>
    <li><a class="smoothscroll" href="#link2">Link 2</a></li>
  </ul> <!-- end #nav -->
</nav> <!-- end #nav-wrap -->
    
<!-- link1 -->
<section id="link1">
  <button type="button" class="collapsible">Link 1 Title<span style="color:#e4b101;">.</span></button>
  <div class="collapsed-content">
    <hr />
    <p>Link 1 content.</p>
  </div>
</section>
<!-- end link1 -->
    
<!-- link2 -->
<section id="link2">
  <button type="button" class="collapsible">Link 2 Title<span style="color:#e4b101;">.</span></button>
  <div class="collapsed-content">
    <hr />
    <p>Link 2 content.</p>
  </div>
</section>
<!-- end link2 -->
    
<br /><br /><br /><br /><br /><br />  

Вот jsfiddle моего кода:

https://jsfiddle.net/AceCrusher/4dporn7a/2/

Ответ №1:

Рассмотрите возможность использования атрибутов data-* для ссылок

 <li><a class="smoothscroll" href="#link1" data-target="#link1">Link 1</a></li>
<li><a class="smoothscroll" href="#link2" data-target="#link2">Link 2</a></li>
  

Затем вы можете добавить прослушиватели событий щелчка ко всем ссылкам и когда пользователь нажимает
по ссылке разверните содержимое. Вы можете использовать что-то вроде этого:

 const links = document.querySelectorAll('.smoothscroll')

links.forEach(link => {
    link.addEventListener('click', () => {
        const section = document.querySelector(link.dataset.target)
        const content = section.querySelector('.collapsed-content')
        if (content.style.display === "block") {
          content.style.display = "none";
        } else {
          content.style.display = "block";
        }
    })
})
  

Ответ №2:

Поехали! Я добавил элемент data-link к вашим ссылкам, а затем отправил фильтрацию, чтобы получить хорошие элементы.

 var coll = document.getElementsByClassName("collapsible");
var navLink = document.getElementsByClassName("smoothscroll");
var i;

for (i = 0; i < coll.length; i  ) {
  coll[i].addEventListener("click", function() {
    this.classList.toggle("active");
    var content = this.nextElementSibling;
    if (content.style.display === "block") {
      content.style.display = "none";
    } else {
      content.style.display = "block";
    }
  });
}

for (i = 0; i < navLink.length; i  ) {
  navLink[i].addEventListener("click", function() {
    var link = this.dataset.link;
    var sectionId = document.getElementById(link);

    var divToOpen = sectionId.querySelector(".collapsible");
    
    divToOpen.classList.toggle("active");
    var content = divToOpen.nextElementSibling;
    if (content.style.display === "block") {
      content.style.display = "none";
    } else {
      content.style.display = "block";
    }
  });
}  
 .collapsible {
  background-color: #eee;
  font: 15px/30px "raleway-heavy", sans-serif;
  text-shadow: 0 1px 4px rgba(0, 0, 0, 0.6);
  text-transform: uppercase;
  letter-spacing: 2.5px;
  margin-bottom: 30px;
  margin-top: 18px;
  left: 3px;
  color: #4c4c4c;
  cursor: pointer;
  padding: 18px;
  width: 100%;
  border: none;
  text-align: leftcollapsible
  outline: none;
  font-size: 15px;
}

.active, .collapsible:hover {
  background-color: #fdc501;
  color: #ffffff;
}

.collapsed-content {
  padding: 0 18px;
  display: none;
  overflow: hidden;
  margin-bottom:30px;
}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<nav id="nav-wrap">
  <ul id="nav" class="nav">
    <li><a class="smoothscroll" data-link="link1" href="#link1">Link 1</a></li>
    <li><a class="smoothscroll" data-link="link2" href="#link2">Link 2</a></li>
  </ul> <!-- end #nav -->
</nav> <!-- end #nav-wrap -->
    
<!-- link1 -->
<section id="link1">
  <button type="button" class="collapsible">Link 1 Title<span style="color:#e4b101;">.</span></button>
  <div class="collapsed-content">
    <hr />
    <p>Link 1 content.</p>
  </div>
</section>
<!-- end link1 -->
    
<!-- link2 -->
<section id="link2">
  <button type="button" class="collapsible">Link 2 Title<span style="color:#e4b101;">.</span></button>
  <div class="collapsed-content">
    <hr />
    <p>Link 2 content.</p>
  </div>
</section>
<!-- end link2 -->
    
<br /><br /><br /><br /><br /><br />  

Ответ №3:

Одним из вариантов является добавление события onClick к ссылке навигации, которая запускает код для расширения соответствующего раздела.

Ваш текущий прослушиватель событий обрабатывает это относительно «складного» элемента, к которому прикреплен обработчик. Если вы хотите повторно использовать его как для нажатия кнопки, так и для щелчка по ссылке, вам придется переработать его, чтобы принять конкретный collapsible в качестве аргумента.