Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带WAI-ARIA的可折叠截面:附加;隐藏“;按钮_Javascript_Html_Wai Aria - Fatal编程技术网

Javascript 带WAI-ARIA的可折叠截面:附加;隐藏“;按钮

Javascript 带WAI-ARIA的可折叠截面:附加;隐藏“;按钮,javascript,html,wai-aria,Javascript,Html,Wai Aria,我正在使用(解释)创建一个使用WAI-ARIA的可折叠部分。我的可折叠文本非常长,因此我想在文本底部添加一个额外的“隐藏”按钮,这样读者就不必向上滚动来单击原始按钮来折叠部分。我不太明白如何让这样一个按钮工作。我非常感谢你的帮助 HTML: JavaScript: (function() { // Get all the <h2> headings const headings = document.querySelectorAll('main h2') Arra

我正在使用(解释)创建一个使用WAI-ARIA的可折叠部分。我的可折叠文本非常长,因此我想在文本底部添加一个额外的“隐藏”按钮,这样读者就不必向上滚动来单击原始按钮来折叠部分。我不太明白如何让这样一个按钮工作。我非常感谢你的帮助

HTML:

JavaScript:

 (function() {
  // Get all the <h2> headings
  const headings = document.querySelectorAll('main h2')
  
  Array.prototype.forEach.call(headings, heading => {
    // Give each <h2> a toggle button child
    // with the SVG plus/minus icon
    heading.innerHTML = `
      <button aria-expanded="false">
        ${heading.textContent}
        <svg aria-hidden="true" focusable="false" viewBox="0 0 10 10">
          <rect class="vert" height="8" width="2" y="1" x="4"/>
          <rect height="2" width="8" y="4" x="1"/>
        </svg>
      </button>
    `
    
    // Function to create a node list 
    // of the content between this <h2> and the next
    const getContent = (elem) => {
      let elems = []
      while (elem.nextElementSibling && elem.nextElementSibling.tagName !== 'H2') {
        elems.push(elem.nextElementSibling)
        elem = elem.nextElementSibling
      }
      
      // Delete the old versions of the content nodes
      elems.forEach((node) => {
        node.parentNode.removeChild(node)
      })

      return elems
    }
    
    // Assign the contents to be expanded/collapsed (array)
    let contents = getContent(heading)
    
    // Create a wrapper element for `contents` and hide it
    let wrapper = document.createElement('div')
    wrapper.hidden = true
    
    // Add each element of `contents` to `wrapper`
    contents.forEach(node => {
      wrapper.appendChild(node)
    })
    
    // Add the wrapped content back into the DOM 
    // after the heading
    heading.parentNode.insertBefore(wrapper, heading.nextElementSibling)
    
    // Assign the button
    let btn = heading.querySelector('button')
    
    btn.onclick = () => {
      // Cast the state as a boolean
      let expanded = btn.getAttribute('aria-expanded') === 'true' || false
      
      // Switch the state
      btn.setAttribute('aria-expanded', !expanded)
      // Switch the content's visibility
      wrapper.hidden = expanded    
    }
  })
})()
(函数(){
//获取所有标题
const headers=document.queryselectoral('main h2')
Array.prototype.forEach.call(标题,标题=>{
//给每个孩子一个切换按钮
//使用SVG加号/减号图标
heading.innerHTML=`
${heading.textContent}
`
//函数创建节点列表
//这和下一个之间的内容
常量getContent=(元素)=>{
设elems=[]
while(elem.nextElementSibling&&elem.nextElementSibling.tagName!=='H2'){
元素推送(元素下一个成员同级)
elem=elem.nextElementSibling
}
//删除内容节点的旧版本
元素forEach((节点)=>{
node.parentNode.removeChild(节点)
})
返回元素
}
//分配要展开/折叠的内容(数组)
let contents=getContent(标题)
//为“contents”创建包装器元素并将其隐藏
让包装器=document.createElement('div')
wrapper.hidden=true
//将'contents'的每个元素添加到'wrapper'中`
contents.forEach(节点=>{
appendChild(节点)
})
//将包装好的内容添加回DOM
//标题后
heading.parentNode.insertBefore(包装器,heading.nextElementSibling)
//分配按钮
设btn=heading.querySelector('按钮')
btn.onclick=()=>{
//将状态强制转换为布尔值
让expanded=btn.getAttribute('aria-expanded')=='true'| | false
//切换状态
btn.setAttribute('aria-expanded',!expanded)
//切换内容的可见性
wrapper.hidden=已展开
}
})
})()

如何将它们粘在顶部,以便随时可以折叠

这是一个例子

这就是代码

<html>
<body>
 

<main>
    <h2>Section 1</h2>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula.</p> 
    <p>Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero. Nullam tortor metus, tincidunt ut urna id, posuere placerat orci. Ut quis risus dictum risus facilisis imperdiet quis sed eros.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>

    <h2>Section 2</h2>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>

</main>  </body>
</html>
<style>  
 body {
  max-width: 40rem;
  margin: 0 auto;
  padding: 1em;
}

main {
  border-width: 2px 0;
  border-style: solid;
}

main h2 {
    top: 0;
    position: sticky;
    background: #fff;
  margin: 0;
}

main > div + h2 {
  border-top: 2px solid;
}

h2 button {
  all: inherit;
  border: 0;
  display: flex;
  justify-content: space-between;
  width: 100%;
  padding: 0.5em 0;
}



h2 button:focus svg {
  outline: 2px solid;
}

button svg {
  height: 1em;
  margin-left: 0.5em;
}

[aria-expanded="true"] .vert {
  display: none;
}

[aria-expanded] rect {
  fill: currentColor;
}

/* page styles */

html {
  font-family: Arial, sans-serif;
}

* {
  box-sizing: border-box;
}
</style>
<script>  
    (function() {
   // Get all the <h2> headings
   const headings = document.querySelectorAll('main h2')
   
   Array.prototype.forEach.call(headings, heading => {
     // Give each <h2> a toggle button child
     // with the SVG plus/minus icon
     heading.innerHTML = `
       <button aria-expanded="false">
         ${heading.textContent}
         <svg aria-hidden="true" focusable="false" viewBox="0 0 10 10">
           <rect class="vert" height="8" width="2" y="1" x="4"/>
           <rect height="2" width="8" y="4" x="1"/>
         </svg>
       </button>
     `
     
     // Function to create a node list 
     // of the content between this <h2> and the next
     const getContent = (elem) => {
       let elems = []
       while (elem.nextElementSibling && elem.nextElementSibling.tagName !== 'H2') {
         elems.push(elem.nextElementSibling)
         elem = elem.nextElementSibling
       }
       
       // Delete the old versions of the content nodes
       elems.forEach((node) => {
         node.parentNode.removeChild(node)
       })
 
       return elems
     }
     
     // Assign the contents to be expanded/collapsed (array)
     let contents = getContent(heading)
     
     // Create a wrapper element for `contents` and hide it
     let wrapper = document.createElement('div')
     wrapper.hidden = true
     
     // Add each element of `contents` to `wrapper`
     contents.forEach(node => {
       wrapper.appendChild(node)
     })
     
     // Add the wrapped content back into the DOM 
     // after the heading
     heading.parentNode.insertBefore(wrapper, heading.nextElementSibling)
     
     // Assign the button
     let btn = heading.querySelector('button')
     
     btn.onclick = () => {
       // Cast the state as a boolean
       let expanded = btn.getAttribute('aria-expanded') === 'true' || false
       
       // Switch the state
       btn.setAttribute('aria-expanded', !expanded)
       // Switch the content's visibility
       wrapper.hidden = expanded    
     }
   })
 })()
      </script>

第一节
Lorem ipsum dolor sit amet,是一位杰出的献身者。我们的共同利益是我们的共同利益。Aliquam Aliquam arcu eget aliquet权杖。佩伦茨克苏打水turpis vitae venenatis Venicula.

Ut id porta velit。但欧盟贵宾酒后驾车,是孕妇。威尼斯人莫里斯,一个比本杜姆人。奥古斯·利伯罗的总统选举。不允许侵权,不允许侵权,不允许侵权。但这是一句名言,这是一种对爱欲的压制

无托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托 但这是一句名言,这是一种对爱欲的压制。Lorem ipsum dolor sit amet,是一位杰出的献身者。

我们的共同利益是我们的共同利益。Aliquam Aliquam arcu eget aliquet权杖。佩伦特斯苏打水turpis vitae venenatis Venicula。Ut id porta velit。但欧盟贵宾酒后驾车,是孕妇。威尼斯人莫里斯,一个比本杜姆人。奥古斯·利伯罗的总统选举

无托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔 但这是一句名言,这是一种对爱欲的压制。Lorem ipsum dolor sit amet,是一位杰出的献身者。

我们的共同利益是我们的共同利益。Aliquam Aliquam arcu eget aliquet权杖。佩伦特斯苏打水turpis vitae venenatis Venicula。Ut id porta velit。但欧盟贵宾酒后驾车,是孕妇。威尼斯人莫里斯,一个比本杜姆人。奥古斯·利伯罗的总统选举

无托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托 但这是一句名言,这是一种对爱欲的压制。Lorem ipsum dolor sit amet,是一位杰出的献身者。

我们的共同利益是我们的共同利益。Aliquam Aliquam arcu eget aliquet权杖。佩伦特斯苏打水turpis vitae venenatis Venicula。Ut id porta velit。但欧盟贵宾酒后驾车,是孕妇。威尼斯人莫里斯,一个比本杜姆人。奥古斯·利伯罗的总统选举

无托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔 但这是一句名言,这是一种对爱欲的压制。Lorem ipsum dolor sit amet,是一位杰出的献身者。

我们的共同利益是我们的共同利益。Aliquam Aliquam arcu eget aliquet权杖。佩伦特斯苏打水turpis vitae venenatis Venicula。Ut id porta velit。但欧盟贵宾酒后驾车,是孕妇。威尼斯人莫里斯,一个比本杜姆人。奥古斯·利伯罗的总统选举

无托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托 但这是一句名言,这是一种对爱欲的压制。Lorem ipsum dolor sit amet,是一位杰出的献身者。

我们的共同利益是我们的共同利益。Aliquam Aliquam arcu eget aliquet权杖。佩伦特斯苏打水turpis vitae venenatis Venicula。Ut id porta velit。但欧盟贵宾酒后驾车,是孕妇。威尼斯人莫里斯,一个比本杜姆人。奥古斯·利伯罗的总统选举

无托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托尔托 但这是一句名言,这是一种对爱欲的压制。Lorem ipsum dolor sit amet,是一位杰出的献身者。

我们的共同利益是我们的共同利益。Aliquam Aliquam arcu eget aliquet权杖。佩伦特斯苏打水turpis vitae venenatis Venicula。Ut id porta velit。但欧盟贵宾酒后驾车,是孕妇。威尼斯人莫里斯,一个比本杜姆人。奥古斯·利伯罗的总统选举

不可更改,不可更改id,不可更改p
 (function() {
  // Get all the <h2> headings
  const headings = document.querySelectorAll('main h2')
  
  Array.prototype.forEach.call(headings, heading => {
    // Give each <h2> a toggle button child
    // with the SVG plus/minus icon
    heading.innerHTML = `
      <button aria-expanded="false">
        ${heading.textContent}
        <svg aria-hidden="true" focusable="false" viewBox="0 0 10 10">
          <rect class="vert" height="8" width="2" y="1" x="4"/>
          <rect height="2" width="8" y="4" x="1"/>
        </svg>
      </button>
    `
    
    // Function to create a node list 
    // of the content between this <h2> and the next
    const getContent = (elem) => {
      let elems = []
      while (elem.nextElementSibling && elem.nextElementSibling.tagName !== 'H2') {
        elems.push(elem.nextElementSibling)
        elem = elem.nextElementSibling
      }
      
      // Delete the old versions of the content nodes
      elems.forEach((node) => {
        node.parentNode.removeChild(node)
      })

      return elems
    }
    
    // Assign the contents to be expanded/collapsed (array)
    let contents = getContent(heading)
    
    // Create a wrapper element for `contents` and hide it
    let wrapper = document.createElement('div')
    wrapper.hidden = true
    
    // Add each element of `contents` to `wrapper`
    contents.forEach(node => {
      wrapper.appendChild(node)
    })
    
    // Add the wrapped content back into the DOM 
    // after the heading
    heading.parentNode.insertBefore(wrapper, heading.nextElementSibling)
    
    // Assign the button
    let btn = heading.querySelector('button')
    
    btn.onclick = () => {
      // Cast the state as a boolean
      let expanded = btn.getAttribute('aria-expanded') === 'true' || false
      
      // Switch the state
      btn.setAttribute('aria-expanded', !expanded)
      // Switch the content's visibility
      wrapper.hidden = expanded    
    }
  })
})()
<html>
<body>
 

<main>
    <h2>Section 1</h2>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula.</p> 
    <p>Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero. Nullam tortor metus, tincidunt ut urna id, posuere placerat orci. Ut quis risus dictum risus facilisis imperdiet quis sed eros.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>

    <h2>Section 2</h2>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>
    <p>Nullam tortor metus, tincidunt ut urna id, posuere placerat orci.</p> 
    <p>Ut quis risus dictum risus facilisis imperdiet quis sed eros. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> 
    <p>Quisque commodo purus quis mi cursus hendrerit eu eu metus. Aliquam aliquam arcu eget aliquet scelerisque. Pellentesque sodales turpis vitae venenatis vehicula. Ut id porta velit. Ut eu dignissim dui, quis gravida est. Cras quis venenatis mauris, a bibendum enim. Sed at augue libero.</p>

</main>  </body>
</html>
<style>  
 body {
  max-width: 40rem;
  margin: 0 auto;
  padding: 1em;
}

main {
  border-width: 2px 0;
  border-style: solid;
}

main h2 {
    top: 0;
    position: sticky;
    background: #fff;
  margin: 0;
}

main > div + h2 {
  border-top: 2px solid;
}

h2 button {
  all: inherit;
  border: 0;
  display: flex;
  justify-content: space-between;
  width: 100%;
  padding: 0.5em 0;
}



h2 button:focus svg {
  outline: 2px solid;
}

button svg {
  height: 1em;
  margin-left: 0.5em;
}

[aria-expanded="true"] .vert {
  display: none;
}

[aria-expanded] rect {
  fill: currentColor;
}

/* page styles */

html {
  font-family: Arial, sans-serif;
}

* {
  box-sizing: border-box;
}
</style>
<script>  
    (function() {
   // Get all the <h2> headings
   const headings = document.querySelectorAll('main h2')
   
   Array.prototype.forEach.call(headings, heading => {
     // Give each <h2> a toggle button child
     // with the SVG plus/minus icon
     heading.innerHTML = `
       <button aria-expanded="false">
         ${heading.textContent}
         <svg aria-hidden="true" focusable="false" viewBox="0 0 10 10">
           <rect class="vert" height="8" width="2" y="1" x="4"/>
           <rect height="2" width="8" y="4" x="1"/>
         </svg>
       </button>
     `
     
     // Function to create a node list 
     // of the content between this <h2> and the next
     const getContent = (elem) => {
       let elems = []
       while (elem.nextElementSibling && elem.nextElementSibling.tagName !== 'H2') {
         elems.push(elem.nextElementSibling)
         elem = elem.nextElementSibling
       }
       
       // Delete the old versions of the content nodes
       elems.forEach((node) => {
         node.parentNode.removeChild(node)
       })
 
       return elems
     }
     
     // Assign the contents to be expanded/collapsed (array)
     let contents = getContent(heading)
     
     // Create a wrapper element for `contents` and hide it
     let wrapper = document.createElement('div')
     wrapper.hidden = true
     
     // Add each element of `contents` to `wrapper`
     contents.forEach(node => {
       wrapper.appendChild(node)
     })
     
     // Add the wrapped content back into the DOM 
     // after the heading
     heading.parentNode.insertBefore(wrapper, heading.nextElementSibling)
     
     // Assign the button
     let btn = heading.querySelector('button')
     
     btn.onclick = () => {
       // Cast the state as a boolean
       let expanded = btn.getAttribute('aria-expanded') === 'true' || false
       
       // Switch the state
       btn.setAttribute('aria-expanded', !expanded)
       // Switch the content's visibility
       wrapper.hidden = expanded    
     }
   })
 })()
      </script>