Как мне заставить выпадающие списки работать без JS?

#javascript #html #css

#javascript #HTML #css

Вопрос:

Я создал выпадающие кнопки, используя javascript для школьного проекта, но задача требует, чтобы все, что связано с javascript, также работало без javascript. Что я могу сделать, чтобы эти кнопки работали как с javascript, так и без него. Я бы предпочел, чтобы они были открыты все время, когда JS отсутствует

РЕДАКТИРОВАТЬ: забыл добавить ContainerReward в css.

Вот код:

HTML:

 <div class="ContainerReward">
    <div class="dropdown">10km/week</div>
    <div class="panel">
        <p>K</p>
    </div>
    <div class="dropdown">20km/week</div>
    <div class="panel">
        <p>K</p>
    </div>
    <div class="dropdown">30km/week</div>
    <div class="panel">
        <p>K</p>
    </div>
    <div class="dropdown">40km/week</div>
    <div class="panel">
        <p>K</p>
    </div>
    <div class="dropdown">50km/week</div>
    <div class="panel">
        <p>K</p>
    </div>
</div>
  

CSS:

 .ContainerReward {
grid-column-start: 3;
grid-column-end: 4;
grid-row-start: 2;
grid-row-end: 6;
margin: 10px;
border-radius: 5px;

background-color: transparent;
}

.dropdown {
margin: 2px;
border-radius: 5px;
background-color: #BCEBCB;
color: #000000;
cursor: pointer;
padding:  18px;
text-align: center;
border: none;
outline: none;
transition: 0.4s;
}

.active, .dropdown:hover {
background-color: #93B48B;
}

.panel {
margin: 2px;
border-radius: 5px;
padding: 0 18px;
background-color: #F7FFF6;
display: none;
overflow: hidden;
}
  

JS:

 var acc = document.getElementsByClassName("dropdown");
        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.display === "block") {
                    panel.style.display = "none";
                } else {
                    panel.style.display = "block";
                }
            });
        }
  

https://codepen.io/michalpajestka/pen/GRqeVWV

Ответ №1:

Попробуйте этот подход с флажками. Вам нужно изменить свой html примерно таким образом.

 <div class="ContainerReward">
    <label for="tenkm" class="dropdown">10km/week</label>
    <input class="dropdown_input" type="checkbox" id="tenkm" />
    <div class="panel">
        <p>K</p>
    </div>
    <label for="twentykm" class="dropdown">20km/week</label>
    <input class="dropdown_input" type="checkbox" id="twentykm" />
    <div class="panel">
        <p>K</p>
    </div>
    <label for="thirtykm" class="dropdown">30km/week</label>
    <input class="dropdown_input" type="checkbox" id="thirtykm" />
    <div class="panel">
        <p>K</p>
    </div>
    <label for="fortykm" class="dropdown">40km/week</label>
    <input class="dropdown_input" type="checkbox" id="fortykm" />
    <div class="panel">
        <p>K</p>
    </div>
    <label for="fiftykm" class="dropdown">50km/week</label>
    <input class="dropdown_input" type="checkbox" id="fiftykm" />
    <div class="panel">
        <p>K</p>
    </div>
</div>
  

и CSS, подобный этому.

 .ContainerReward {
display: grid;
grid-column-start: 3;
grid-column-end: 4;
grid-row-start: 2;
grid-row-end: 6;
margin: 10px;
border-radius: 5px;
background-color: transparent;
}
.dropdown {
margin: 2px;
border-radius: 5px;
background-color: #BCEBCB;
color: #000000;
cursor: pointer;
padding:  18px;
text-align: center;
border: none;
outline: none;
transition: 0.4s;
}

.active, .dropdown:hover {
    background-color: #93B48B;
}
.dropdown_input {
  display: none;
}
.dropdown_input:not(:checked)   .panel {
    margin: 2px;
    border-radius: 5px;
    padding: 0 18px;
    background-color: #F7FFF6;
    display: none;
    overflow: hidden;
}
  

Это должно сработать для вашего варианта использования.

Вот ручка к этому примеру

https://codepen.io/mudassirzr/pen/bGeZXQB

Комментарии:

1. Большое вам спасибо! Но у меня есть небольшая проблема. Когда я использовал этот код и запустил веб-сайт в Chrome, флажки начали появляться под каждой кнопкой после того, как я нажал на них, хотя они не появлялись в codepen.

2. Это должно работать во всех браузерах, пожалуйста, попробуйте обновить вашу вкладку. Если это помогло, пожалуйста, примите ответ.

3. Теперь это сработало. Я сделал что-то не так с кодом на моей стороне. Однако, я забыл упомянуть, что поля панели, которые появляются после нажатия на кнопку, прозрачны, а не белые. Я забыл добавить часть кода в CSS, поэтому я собираюсь обновить этот пост прямо сейчас.

4. Я обновил ответ и перо. Вам нужно добавить display: grid; в . Класс ContainerReward в противном случае все остальные свойства сетки не будут работать с ними.

5. К сожалению, панели по-прежнему прозрачны, хотя я использовал сетку отображения…

Ответ №2:

Не полный ответ, но тот, который укажет вам правильное направление (и, надеюсь, узнает больше по пути)

Вам нужно что-то, что может переключаться между двумя «состояниями» для представления «открытого» и «закрытого» поведения выпадающего списка, что-то, что работает изначально без javascript, похоже, флажок может быть полезен? Вы можете выбрать между «проверено» и «снято», существует псевдокласс css «:checked», который вы могли бы использовать для управления открытыми и закрытыми стилями.

Комментарии:

1. Спасибо за ответ! Я уже пробовал что-то подобное раньше с флажками. Это было на панели навигации с выпадающим списком в мобильном режиме. Проблема в том, что мне нужно было создать меню гамбургера с помощью CSS для кнопки флажка. Я хочу, чтобы вся кнопка выпадающего списка была интерактивной.

2. Это может быть достигнуто с помощью подхода с флажками. Вы можете сделать так, чтобы флажок заполнял его родительский контейнер. Таким образом, весь контейнер будет доступен для просмотра, тем самым активируя флажок.

Ответ №3:

Вы также можете использовать собственные <select> <option> элементы и, которые предназначены именно для этого. Он даже доступен автоматически. JavaScript не требуется.

А, понятно, видимо, я не умею читать. Вы ищете аккордеон, а не выпадающий список. Тогда я предлагаю использовать <details> and <summary> . Они также работают изначально в большинстве современных браузеров.