简体   繁体   English

如何为可扩展的手风琴编辑JavaScript

[英]How can I edit JavaScript for Accordion expandable

I'm just a beginner in the field of JavaScript , so I need some expert to guide me how I can edit the JavaScript code to make it expand only one row at a time. 我只是JavaScript领域的初学者,所以我需要一些专家指导我如何编辑JavaScript代码以使其一次只能扩展一行。

(Would like to make it automatic close a previous row when click another row, Right now it can expandable all row at a time) (想要使它在单击另一行时自动关闭上一行,现在它可以一次扩展所有行)

And this is the code https://jsfiddle.net/4L4e88w6/11/ 这是代码https://jsfiddle.net/4L4e88w6/11/

 //uses classList, setAttribute, and querySelectorAll //if you want this to work in IE8/9 youll need to polyfill these (function() { var d = document, accordionToggles = d.querySelectorAll('.js-accordionTrigger'), setAria, setAccordionAria, switchAccordion, touchSupported = ('ontouchstart' in window), pointerSupported = ('pointerdown' in window); skipClickDelay = function(e) { e.preventDefault(); e.target.click(); } setAriaAttr = function(el, ariaType, newProperty) { el.setAttribute(ariaType, newProperty); }; setAccordionAria = function(el1, el2, expanded) { switch (expanded) { case "true": setAriaAttr(el1, 'aria-expanded', 'true'); setAriaAttr(el2, 'aria-hidden', 'false'); break; case "false": setAriaAttr(el1, 'aria-expanded', 'false'); setAriaAttr(el2, 'aria-hidden', 'true'); break; default: break; } }; //function switchAccordion = function(e) { console.log("triggered"); e.preventDefault(); var thisAnswer = e.target.parentNode.nextElementSibling; var thisQuestion = e.target; if (thisAnswer.classList.contains('is-collapsed')) { setAccordionAria(thisQuestion, thisAnswer, 'true'); } else { setAccordionAria(thisQuestion, thisAnswer, 'false'); } thisQuestion.classList.toggle('is-collapsed'); thisQuestion.classList.toggle('is-expanded'); thisAnswer.classList.toggle('is-collapsed'); thisAnswer.classList.toggle('is-expanded'); thisAnswer.classList.toggle('animateIn'); }; for (var i = 0, len = accordionToggles.length; i < len; i++) { if (touchSupported) { accordionToggles[i].addEventListener('touchstart', skipClickDelay, false); } if (pointerSupported) { accordionToggles[i].addEventListener('pointerdown', skipClickDelay, false); } accordionToggles[i].addEventListener('click', switchAccordion, false); } })(); 
 * { box-sizing: border-box; } .heading-primary { padding: 3em 0em 0.5em 0em; text-align: left; } .accordion dl, .accordion-list { border: 1px solid #ddd; } .accordion dl:after, .accordion-list:after { content: ""; display: block; height: 0.5em; width: 100%; background-color: #5c5c5c; } .accordion dd, .accordion__panel { background-color: #E3F2FD; font-size: 1em; line-height: 1.5em; } .accordion p { padding: 1em 2em 1em 2em; } .accordion { position: relative; background-color: #eee; } .accordionTitle, .accordion__Heading { text-align: left; font-weight: 500; padding: 1em; display: block; text-decoration: none; color: #424242; /* -webkit-transition: background-color 0.2s ease-in-out; transition: background-color 0.2s ease-in-out; */ border-bottom: 1px solid #2a54a2; } .accordionTitle:before, .accordion__Heading:before { content: "?"; font-size: 1.5em; font-weight: bold; line-height: 0.5em; float: right; -webkit-transition: -webkit-transform 0.3s ease-in-out; transition: -webkit-transform 0.3s ease-in-out; transition: transform 0.3s ease-in-out; transition: transform 0.3s ease-in-out, -webkit-transform 0.3s ease-in-out; } .accordionTitle:hover, .accordion__Heading:hover { background-color: #01579B; color: white; } .accordionTitleActive, .accordionTitle.is-expanded { background-color: #01579B; color: white; } .accordionTitleActive:before, .accordionTitle.is-expanded:before { content: "+"; -webkit-transform: rotate(-225deg); -ms-transform: rotate(-225deg); transform: rotate(-225deg); font-size: 2.5em; font-weight: 100; } .accordionItem { height: auto; overflow: hidden; max-height: 50em; -webkit-transition: max-height 1s; transition: max-height 1s; } @media screen and (min-width: 48em) { .accordionItem { /*max-height: 15em;*/ -webkit-transition: max-height 0.25s; transition: max-height 0.25s; } } .accordionItem.is-collapsed { max-height: 0; } .no-js .accordionItem.is-collapsed { max-height: auto; } .animateIn { -webkit-animation: accordionIn 0.45s normal ease-in-out both 1; animation: accordionIn 0.45s normal ease-in-out both 1; } .animateOut { -webkit-animation: accordionOut 0.45s alternate ease-in-out both 1; animation: accordionOut 0.45s alternate ease-in-out both 1; } @-webkit-keyframes accordionIn { 0% { opacity: 0; -webkit-transform: translateY(38px); transform: translateY(38px); } 100% { opacity: 1; -webkit-transform: scale(1); transform: scale(1); } } @keyframes accordionIn { 0% { opacity: 0; -webkit-transform: translateY(38px); transform: translateY(38px); -webkit-transform-origin: 50% 0; transform-origin: 50% 0; /* -webkit-transform: scale(0.9) rotateX(-60deg); transform: scale(0.9) rotateX(-60deg); -webkit-transform-origin: 50% 0; transform-origin: 50% 0; */ } 100% { opacity: 1; -webkit-transform: scale(1); transform: scale(1); } } @-webkit-keyframes accordionOut { 0% { opacity: 1; -webkit-transform: scale(1); transform: scale(1); } 100% { opacity: 0; -webkit-transform: scale(0.9) rotateX(-60deg); transform: scale(0.9) rotateX(-60deg); } } @keyframes accordionOut { 0% { opacity: 1; -webkit-transform: scale(1); transform: scale(1); } 100% { opacity: 0; -webkit-transform: scale(0.9) rotateX(-60deg); transform: scale(0.9) rotateX(-60deg); } } 
 <div class="container"> <h3 class="heading-primary">Q&A</h3> <div class="accordion"> <dl> <dt> <a href="#accordion1" aria-expanded="false" aria-controls="accordion1" class="accordion-title accordionTitle js-accordionTrigger">First Accordion heading</a> </dt> <dd class="accordion-content accordionItem is-collapsed" id="accordion1" aria-hidden="true"> <p>Lorem ipsum dolor sit amet, consectetur <a href="http://www.google.com">Test</a>adipiscing elit. Morbi eu interdum diam. Donec interdum porttitor risus non bibendum. Maecejusto dui, sodales quis luctus a, iaculis eget mauris. </p> <p>Aliquam dapibus, ante quis fringilla feugiat, mauris risus condimentum massa, at elementum r. Quisque blandit adipiscing erat vitae dapibus. Nulla aliquam magna nec elementum tincidunt.</p> <p>Aliquam dapibus, ante quis fringilla </p> </dd> <dt> <a href="#accordion1" aria-expanded="false" aria-controls="accordion1" class="accordion-title accordionTitle js-accordionTrigger">Second Accordion heading</a> </dt> <dd class="accordion-content accordionItem is-collapsed" id="accordion1" aria-hidden="true"> <p>Lorem ipsum dolor sit amet, consectetur <a href="http://www.google.com">Test</a>adipiscing elit. Morbi eu interdum diam. Donec interdum porttitor risus non bibendum. Maecenas sollicitudin eros in quam imperdiet placerat. Cras justo purus, rhoncus nec lobortis ut, iaculis vel ipsum. Donec dignissim arcu nec elit faucibus condimentum. Donec facilisis consectetur enim sit amet varius. Pellentesque justo dui, sodales quis luctus a, iaculis eget mauris. </p> <p>Aliquam dapibus, ante quis fringilla feugiat, mauris risus condimentum massa, at elementum libero quam ac ligula. Pellentesque at rhoncus dolor. Duis porttitor nibh ut lobortis aliquam. Nullam eu dolor venenatis mauris placerat tristique eget id dolor. Quisque blandit adipiscing erat vitae dapibus. Nulla aliquam magna nec elementum tincidunt.</p> </dd> <dt> <a href="#accordion1" aria-expanded="false" aria-controls="accordion1" class="accordion-title accordionTitle js-accordionTrigger">Third Accordion heading</a> </dt> <dd class="accordion-content accordionItem is-collapsed" id="accordion1" aria-hidden="true"> <p>Lorem ipsum dolor sit amet, consectetur <a href="http://www.google.com">Test</a>adipiscing elit. Morbi eu interdum diam. Donec interdum porttitor risus non bibendum. Maecenas sollicitudin eros in quam imperdiet placerat. Cras justo purus, rhoncus nec lobortis ut, iaculis vel ipsum. Donec dignissim arcu nec elit faucibus condimentum. Donec facilisis consectetur enim sit amet varius. Pellentesque justo dui, sodales quis luctus a, iaculis eget mauris. </p> <p>Aliquam dapibus, ante quis fringilla feugiat, mauris risus condimentum massa, at elementum libero quam ac ligula. Pellentesque at rhoncus dolor. Duis porttitor nibh ut lobortis aliquam. Nullam eu dolor venenatis mauris placerat tristique eget id dolor. Quisque blandit adipiscing erat vitae dapibus. Nulla aliquam magna nec elementum tincidunt.</p> </dd> </dl> </div> </div> 

I agree with @DanielBeck that your code can be simplified further and the typical approach is to collapse all the items and then expand the currently clicked item. 我同意@DanielBeck的观点,可以进一步简化您的代码,典型的方法是折叠所有项目,然后展开当前单击的项目。

However here is another approach: You can keep a reference to expanded element and collapse it before expanding a new one. 但是,这是另一种方法:您可以保留对扩展元素的引用,并在扩展新元素之前将其折叠。 Like this: 像这样:

 //uses classList, setAttribute, and querySelectorAll //if you want this to work in IE8/9 youll need to polyfill these (function() { var d = document, accordionToggles = d.querySelectorAll('.js-accordionTrigger'), setAria, setAccordionAria, switchAccordion, touchSupported = ('ontouchstart' in window), pointerSupported = ('pointerdown' in window); skipClickDelay = function(e) { e.preventDefault(); e.target.click(); } setAriaAttr = function(el, ariaType, newProperty) { el.setAttribute(ariaType, newProperty); }; setAccordionAria = function(el1, el2, expanded) { switch (expanded) { case "true": setAriaAttr(el1, 'aria-expanded', 'true'); setAriaAttr(el2, 'aria-hidden', 'false'); break; case "false": setAriaAttr(el1, 'aria-expanded', 'false'); setAriaAttr(el2, 'aria-hidden', 'true'); break; default: break; } }; //function var expanded; switchAccordion = function(e) { console.log("triggered"); e.preventDefault(); var thisAnswer = e.target.parentNode.nextElementSibling; var thisQuestion = e.target; if(expanded) { setAccordionAria(expanded, thisAnswer, 'false'); expanded.classList.toggle('is-collapsed'); expanded.classList.toggle('is-expanded'); var expandedAns = expanded.parentNode.nextElementSibling; expandedAns.classList.toggle('is-collapsed'); expandedAns.classList.toggle('is-expanded'); expandedAns.classList.toggle('animateIn'); if(expanded == thisQuestion){ expanded = undefined; return; } } if(thisAnswer.classList.contains('is-collapsed')) { setAccordionAria(thisQuestion, thisAnswer, 'true'); expanded = thisQuestion; } else { setAccordionAria(thisQuestion, thisAnswer, 'false'); } thisQuestion.classList.toggle('is-collapsed'); thisQuestion.classList.toggle('is-expanded'); thisAnswer.classList.toggle('is-collapsed'); thisAnswer.classList.toggle('is-expanded'); thisAnswer.classList.toggle('animateIn'); }; for (var i = 0, len = accordionToggles.length; i < len; i++) { if (touchSupported) { accordionToggles[i].addEventListener('touchstart', skipClickDelay, false); } if (pointerSupported) { accordionToggles[i].addEventListener('pointerdown', skipClickDelay, false); } accordionToggles[i].addEventListener('click', switchAccordion, false); } })(); 
 * { box-sizing: border-box; } .heading-primary { padding: 3em 0em 0.5em 0em; text-align: left; } .accordion dl, .accordion-list { border: 1px solid #ddd; } .accordion dl:after, .accordion-list:after { content: ""; display: block; height: 0.5em; width: 100%; background-color: #5c5c5c; } .accordion dd, .accordion__panel { background-color: #E3F2FD; font-size: 1em; line-height: 1.5em; } .accordion p { padding: 1em 2em 1em 2em; } .accordion { position: relative; background-color: #eee; } .accordionTitle, .accordion__Heading { text-align: left; font-weight: 500; padding: 1em; display: block; text-decoration: none; color: #424242; /* -webkit-transition: background-color 0.2s ease-in-out; transition: background-color 0.2s ease-in-out; */ border-bottom: 1px solid #2a54a2; } .accordionTitle:before, .accordion__Heading:before { content: "?"; font-size: 1.5em; font-weight: bold; line-height: 0.5em; float: right; -webkit-transition: -webkit-transform 0.3s ease-in-out; transition: -webkit-transform 0.3s ease-in-out; transition: transform 0.3s ease-in-out; transition: transform 0.3s ease-in-out, -webkit-transform 0.3s ease-in-out; } .accordionTitle:hover, .accordion__Heading:hover { background-color: #01579B; color: white; } .accordionTitleActive, .accordionTitle.is-expanded { background-color: #01579B; color: white; } .accordionTitleActive:before, .accordionTitle.is-expanded:before { content: "+"; -webkit-transform: rotate(-225deg); -ms-transform: rotate(-225deg); transform: rotate(-225deg); font-size: 2.5em; font-weight: 100; } .accordionItem { height: auto; overflow: hidden; max-height: 50em; -webkit-transition: max-height 1s; transition: max-height 1s; } @media screen and (min-width: 48em) { .accordionItem { /*max-height: 15em;*/ -webkit-transition: max-height 0.25s; transition: max-height 0.25s; } } .accordionItem.is-collapsed { max-height: 0; } .no-js .accordionItem.is-collapsed { max-height: auto; } .animateIn { -webkit-animation: accordionIn 0.45s normal ease-in-out both 1; animation: accordionIn 0.45s normal ease-in-out both 1; } .animateOut { -webkit-animation: accordionOut 0.45s alternate ease-in-out both 1; animation: accordionOut 0.45s alternate ease-in-out both 1; } @-webkit-keyframes accordionIn { 0% { opacity: 0; -webkit-transform: translateY(38px); transform: translateY(38px); } 100% { opacity: 1; -webkit-transform: scale(1); transform: scale(1); } } @keyframes accordionIn { 0% { opacity: 0; -webkit-transform: translateY(38px); transform: translateY(38px); -webkit-transform-origin: 50% 0; transform-origin: 50% 0; /* -webkit-transform: scale(0.9) rotateX(-60deg); transform: scale(0.9) rotateX(-60deg); -webkit-transform-origin: 50% 0; transform-origin: 50% 0; */ } 100% { opacity: 1; -webkit-transform: scale(1); transform: scale(1); } } @-webkit-keyframes accordionOut { 0% { opacity: 1; -webkit-transform: scale(1); transform: scale(1); } 100% { opacity: 0; -webkit-transform: scale(0.9) rotateX(-60deg); transform: scale(0.9) rotateX(-60deg); } } @keyframes accordionOut { 0% { opacity: 1; -webkit-transform: scale(1); transform: scale(1); } 100% { opacity: 0; -webkit-transform: scale(0.9) rotateX(-60deg); transform: scale(0.9) rotateX(-60deg); } } 
 <div class="container"> <h3 class="heading-primary">Q&A</h3> <div class="accordion"> <dl> <dt> <a href="#accordion1" aria-expanded="false" aria-controls="accordion1" class="accordion-title accordionTitle js-accordionTrigger">First Accordion heading</a> </dt> <dd class="accordion-content accordionItem is-collapsed" id="accordion1" aria-hidden="true"> <p>Lorem ipsum dolor sit amet, consectetur <a href="http://www.google.com">Test</a>adipiscing elit. Morbi eu interdum diam. Donec interdum porttitor risus non bibendum. Maecejusto dui, sodales quis luctus a, iaculis eget mauris. </p> <p>Aliquam dapibus, ante quis fringilla feugiat, mauris risus condimentum massa, at elementum r. Quisque blandit adipiscing erat vitae dapibus. Nulla aliquam magna nec elementum tincidunt.</p> <p>Aliquam dapibus, ante quis fringilla </p> </dd> <dt> <a href="#accordion1" aria-expanded="false" aria-controls="accordion1" class="accordion-title accordionTitle js-accordionTrigger">Second Accordion heading</a> </dt> <dd class="accordion-content accordionItem is-collapsed" id="accordion1" aria-hidden="true"> <p>Lorem ipsum dolor sit amet, consectetur <a href="http://www.google.com">Test</a>adipiscing elit. Morbi eu interdum diam. Donec interdum porttitor risus non bibendum. Maecenas sollicitudin eros in quam imperdiet placerat. Cras justo purus, rhoncus nec lobortis ut, iaculis vel ipsum. Donec dignissim arcu nec elit faucibus condimentum. Donec facilisis consectetur enim sit amet varius. Pellentesque justo dui, sodales quis luctus a, iaculis eget mauris. </p> <p>Aliquam dapibus, ante quis fringilla feugiat, mauris risus condimentum massa, at elementum libero quam ac ligula. Pellentesque at rhoncus dolor. Duis porttitor nibh ut lobortis aliquam. Nullam eu dolor venenatis mauris placerat tristique eget id dolor. Quisque blandit adipiscing erat vitae dapibus. Nulla aliquam magna nec elementum tincidunt.</p> </dd> <dt> <a href="#accordion1" aria-expanded="false" aria-controls="accordion1" class="accordion-title accordionTitle js-accordionTrigger">Third Accordion heading</a> </dt> <dd class="accordion-content accordionItem is-collapsed" id="accordion1" aria-hidden="true"> <p>Lorem ipsum dolor sit amet, consectetur <a href="http://www.google.com">Test</a>adipiscing elit. Morbi eu interdum diam. Donec interdum porttitor risus non bibendum. Maecenas sollicitudin eros in quam imperdiet placerat. Cras justo purus, rhoncus nec lobortis ut, iaculis vel ipsum. Donec dignissim arcu nec elit faucibus condimentum. Donec facilisis consectetur enim sit amet varius. Pellentesque justo dui, sodales quis luctus a, iaculis eget mauris. </p> <p>Aliquam dapibus, ante quis fringilla feugiat, mauris risus condimentum massa, at elementum libero quam ac ligula. Pellentesque at rhoncus dolor. Duis porttitor nibh ut lobortis aliquam. Nullam eu dolor venenatis mauris placerat tristique eget id dolor. Quisque blandit adipiscing erat vitae dapibus. Nulla aliquam magna nec elementum tincidunt.</p> </dd> </dl> </div> </div> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM