在页面加载时打开手风琴/但在移动视图中保持关闭
Open accordion on page load / But leave it close on mobile view
我试图在桌面视图中打开此手风琴(在页面加载时),但在移动视图中关闭。我还希望这个手风琴对点击事件做出反应,它已经做得很好了。
所以我无法在默认情况下在桌面视图中打开它,而不是在移动视图中。是否可以仅通过改进我在此处拥有的 js 文件或同时更改 css 来完成这项工作?
欢迎为此任务提供任何帮助,我对 css 没问题,但对 js 知之甚少。
var acc = document.getElementsByClassName("accordion");
var i;
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
var panel = this.nextElementSibling;
if (panel.style.maxHeight){
panel.style.maxHeight = null;
} else {
panel.style.maxHeight = panel.scrollHeight + "px";
}
});
}
.accordion {
background-color: #eee;
color: #444;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 15px;
transition: 0.4s;
}
.active, .accordion:hover {
background-color: #ccc;
}
.accordion:after {
content: '[=11=]2B';
color: #777;
font-weight: bold;
float: right;
margin-left: 5px;
}
.active:after {
content: "12";
}
.panel {
padding: 0 18px;
background-color: white;
max-height: 0;
overflow: hidden;
transition: max-height 0.2s ease-out;
}
<button class="accordion">Section 1</button>
<div class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
<button class="accordion">Section 2</button>
<div class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
您可以考虑使用媒体查询为大型设备设置 max-height
以便手风琴打开,然后调整您的 JS 代码,如下所示:
var acc = document.getElementsByClassName("accordion");
var i;
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
var panel = this.nextElementSibling;
if (window.getComputedStyle(panel,null).getPropertyValue("max-height") !== "0px"){
panel.style.maxHeight = "0px";
} else {
panel.style.maxHeight = panel.scrollHeight + "px";
}
});
}
.accordion {
background-color: #eee;
color: #444;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 15px;
transition: 0.4s;
}
.active, .accordion:hover {
background-color: #ccc;
}
.accordion:after {
content: '[=11=]2B';
color: #777;
font-weight: bold;
float: right;
margin-left: 5px;
}
.active:after {
content: "12";
}
.panel {
padding: 0 18px;
background-color: white;
max-height: 0px;
overflow: hidden;
transition: max-height 0.2s ease-out;
}
@media (min-width:600px) {
.panel {
max-height:500px;
}
.accordion:after {
content: '12';
}
.active:after {
content: "[=11=]2B";
}
}
<button class="accordion">Section 1</button>
<div class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
<button class="accordion">Section 2</button>
<div class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
This solution using Javascript.
If(window.innerWidth <= 768){
this.classList.add("active");
}
and this if you want to use JQuery
// Returns width of browser viewport
if($( window ).width() > 768){
//If you want to add dynamically a class or remove one
$('.selector').addClass(); // or removeClass()
}
I hope this could help you
如果你想通过JS实现,你可以使用Window.matchMedia
:)
window.onload = ()=>{
var acc = document.getElementsByClassName("accordion");
var i;
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
var panel = this.nextElementSibling;
if (panel.style.maxHeight){
panel.style.maxHeight = null;
} else {
panel.style.maxHeight = panel.scrollHeight + "px";
}
});
}
// our media query string
let mql = window.matchMedia("screen and (min-width: 1281px)");
mediaQueryResponse(mql); // call the event handler at run time
// listen for state changes
mql.addListener(mediaQueryResponse);
function mediaQueryResponse(mql){
for(let i = 0; i < acc.length; i++){
let pan = acc[i].nextElementSibling;
if(mql.matches){
acc[i].classList.toggle('active');
pan.style.maxHeight = pan.scrollHeight + "px";
}
else {
pan.style.maxHeight = null;
}
}
}
}
.accordion {
background-color: #eee;
color: #444;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 15px;
transition: 0.4s;
}
.active, .accordion:hover {
background-color: #ccc;
}
.accordion:after {
content: '[=11=]2B';
color: #777;
font-weight: bold;
float: right;
margin-left: 5px;
}
.active:after {
content: "12";
}
.panel {
padding: 0 18px;
background-color: white;
max-height: 0;
overflow: hidden;
transition: max-height 0.2s ease-out;
}
<button class="accordion">Section 1</button>
<div class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
<button class="accordion">Section 2</button>
<div class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
此外,这里有一个 working example :)
我试图在桌面视图中打开此手风琴(在页面加载时),但在移动视图中关闭。我还希望这个手风琴对点击事件做出反应,它已经做得很好了。
所以我无法在默认情况下在桌面视图中打开它,而不是在移动视图中。是否可以仅通过改进我在此处拥有的 js 文件或同时更改 css 来完成这项工作?
欢迎为此任务提供任何帮助,我对 css 没问题,但对 js 知之甚少。
var acc = document.getElementsByClassName("accordion");
var i;
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
var panel = this.nextElementSibling;
if (panel.style.maxHeight){
panel.style.maxHeight = null;
} else {
panel.style.maxHeight = panel.scrollHeight + "px";
}
});
}
.accordion {
background-color: #eee;
color: #444;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 15px;
transition: 0.4s;
}
.active, .accordion:hover {
background-color: #ccc;
}
.accordion:after {
content: '[=11=]2B';
color: #777;
font-weight: bold;
float: right;
margin-left: 5px;
}
.active:after {
content: "12";
}
.panel {
padding: 0 18px;
background-color: white;
max-height: 0;
overflow: hidden;
transition: max-height 0.2s ease-out;
}
<button class="accordion">Section 1</button>
<div class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
<button class="accordion">Section 2</button>
<div class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
您可以考虑使用媒体查询为大型设备设置 max-height
以便手风琴打开,然后调整您的 JS 代码,如下所示:
var acc = document.getElementsByClassName("accordion");
var i;
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
var panel = this.nextElementSibling;
if (window.getComputedStyle(panel,null).getPropertyValue("max-height") !== "0px"){
panel.style.maxHeight = "0px";
} else {
panel.style.maxHeight = panel.scrollHeight + "px";
}
});
}
.accordion {
background-color: #eee;
color: #444;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 15px;
transition: 0.4s;
}
.active, .accordion:hover {
background-color: #ccc;
}
.accordion:after {
content: '[=11=]2B';
color: #777;
font-weight: bold;
float: right;
margin-left: 5px;
}
.active:after {
content: "12";
}
.panel {
padding: 0 18px;
background-color: white;
max-height: 0px;
overflow: hidden;
transition: max-height 0.2s ease-out;
}
@media (min-width:600px) {
.panel {
max-height:500px;
}
.accordion:after {
content: '12';
}
.active:after {
content: "[=11=]2B";
}
}
<button class="accordion">Section 1</button>
<div class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
<button class="accordion">Section 2</button>
<div class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
This solution using Javascript.
If(window.innerWidth <= 768){
this.classList.add("active");
}
and this if you want to use JQuery
// Returns width of browser viewport
if($( window ).width() > 768){
//If you want to add dynamically a class or remove one
$('.selector').addClass(); // or removeClass()
}
I hope this could help you
如果你想通过JS实现,你可以使用Window.matchMedia
:)
window.onload = ()=>{
var acc = document.getElementsByClassName("accordion");
var i;
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
var panel = this.nextElementSibling;
if (panel.style.maxHeight){
panel.style.maxHeight = null;
} else {
panel.style.maxHeight = panel.scrollHeight + "px";
}
});
}
// our media query string
let mql = window.matchMedia("screen and (min-width: 1281px)");
mediaQueryResponse(mql); // call the event handler at run time
// listen for state changes
mql.addListener(mediaQueryResponse);
function mediaQueryResponse(mql){
for(let i = 0; i < acc.length; i++){
let pan = acc[i].nextElementSibling;
if(mql.matches){
acc[i].classList.toggle('active');
pan.style.maxHeight = pan.scrollHeight + "px";
}
else {
pan.style.maxHeight = null;
}
}
}
}
.accordion {
background-color: #eee;
color: #444;
cursor: pointer;
padding: 18px;
width: 100%;
border: none;
text-align: left;
outline: none;
font-size: 15px;
transition: 0.4s;
}
.active, .accordion:hover {
background-color: #ccc;
}
.accordion:after {
content: '[=11=]2B';
color: #777;
font-weight: bold;
float: right;
margin-left: 5px;
}
.active:after {
content: "12";
}
.panel {
padding: 0 18px;
background-color: white;
max-height: 0;
overflow: hidden;
transition: max-height 0.2s ease-out;
}
<button class="accordion">Section 1</button>
<div class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
<button class="accordion">Section 2</button>
<div class="panel">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
此外,这里有一个 working example :)