ToggleClass не работает с display:block

У меня есть 4 элемента div со свойством style="display: none", и когда я пытаюсь изменить свойство на display: block через toggleClass, это не работает. JS:

$(document).ready(function () {
    $("#add_client").click(function () {
        $("#inputs").toggleClass("shown");
    });

    $("#show_clients").click(function () {
        $("#show_information").toggleClass("shown");
    });

    $("#show_free_rooms").click(function () {
        $("#show-free-rooms").toggleClass("shown");
    });

    $("#search-by").click(function () {
        $("#find_room_by_name").toggleClass("shown");
    });
});

CSS:

.shown{
    display: block;
}

Может ли кто-нибудь объяснить мне, что не так с моим кодом?

Специфика developer.mozilla.org/en-US/docs/Web/CSS/Specificity не используйте встроенный стиль....

epascarello 18.04.2023 19:57

«изменить свойство через toggleClass» — toggleClass изменяет свойство class, а не свойство style.

freedomn-m 18.04.2023 20:01

Исправление состоит в том, чтобы по умолчанию скрыть их в css, в базовом формате это будет означать удаление вашего style= в HTML, а затем добавление div { display:hidden } - очевидно, это повлияет на все элементы div, поэтому вы можете захотеть дать переключаемым элементам определенного класса и применить к нему.

freedomn-m 18.04.2023 20:03

Если вы действительно хотите сделать это таким образом, вы можете добавить !important в CSS. Тогда он переопределит встроенный стиль.

Barmar 18.04.2023 20:35
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема с вашим образцом заключается в том, что объявление отображения в CSS не перезаписывает атрибут, установленный с помощью встроенного стиля, поскольку последний имеет более высокий приоритет. Вы также можете определить состояние display: none в CSS с таким же уровнем специфичности.

См. ниже работающий пример, обратите внимание, что я намеренно сделал второй элемент неудачным, объявив стиль атрибута в свойстве HTML, как вы сделали изначально, чтобы можно было заметить разницу с остальными элементами:

$(document).ready(function () {
  $("#add_client").click(function () {
    $("#inputs").toggleClass("shown");
  });

  $("#show_clients").click(function () {
    $("#show_information").toggleClass("shown");
  });

  $("#show_free_rooms").click(function () {
    $("#show-free-rooms").toggleClass("shown");
  });

  $("#search-by").click(function () {
    $("#find_room_by_name").toggleClass("shown");
  });
});
.myitems div {
  display: none;
}

.myitems div.shown {
  display: block;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<button id = "add_client">add client</button> |
<button id = "show_clients">show client (not working)</button> |
<button id = "show_free_rooms">show_free_rooms</button> |
<button id = "search-by">search-by</button>

<div class = "myitems">
<div id = "inputs">
  inputs div content
</div>

<div id = "show_information" style = "display: none">
  show_information div content (not working)
</div>

<div id = "show-free-rooms">
  show-free-rooms div content
</div>

<div id = "find_room_by_name">
  find_room_by_name div content
</div>
</div>

Встроенные стили, добавленные к элементу (например, style="font-weight: bold;"), всегда перезаписывают любые обычные стили в таблицах стилей автора, и поэтому их можно рассматривать как имеющие наивысшую специфичность.

Возможным решением вашей проблемы было бы удаление встроенного стиля и вместо этого класса, скажем, hidden для этих элементов. И в вашей таблице стилей

.hidden {
    display: none;
}

.shown{
    display: block;
}

Всегда? № jsfiddle.net/rvq1329k

freedomn-m 19.04.2023 07:00

Другие вопросы по теме