CSS-переходы у меня не работают, когда я пытаюсь выполнить их через JavaScript.
let isSearchBarOpen = false;
function toggleSearchBar() {
if (isSearchBarOpen) {
searchBar.style.display = "none";
} else {
searchBar.style.display = "flex";
searchBar.classList.add("search-bar-open")
}
isSearchBarOpen = !isSearchBarOpen;
toggleSearchIcon();
}.search-bar {
display: none;
background-color: #000;
color: #fff;
position: absolute;
top: 0;
left: 0;
right: 0;
padding: 10px 5px;
z-index: 1000;
margin: 0 auto;
transition: top 2s ease-in;
}
.search-bar-open {
top: 90px;
}<div class = "search-icon">
<i class = "fas fa-search search-icon-header"></i>
<img src = "images/close-icon.svg" alt = "close-icon-search" class = "close-icon-search">
</div>
<div class = "search-bar" id = "search-bar">
<div class = "search-container">
<form class = "search-form">
<input type = "text" placeholder = "Search...">
<button type = "submit"><i class = "fas fa-search search-icon-action"></i></button>
</form>
</div>
</div>При нажатии кнопки поиска происходят следующие вещи (или должны произойти, если я не ошибаюсь):
isSearchBarOpentrue или false.true — то есть если панель поиска открыта — добавляется встроенный стиль (display:none), скрывающий панель.false, то есть если панель поиска закрыта, добавляется встроенный стиль (display:flex), чтобы он отображался. И, кроме того, добавлен класс (.search-bar-open).Отсюда, если мы посмотрим на CSS…
Панель поиска при открытии (когда она появляется) загружает класс .search-bar-open и встроенный стиль display:flex. С одной стороны, указанный встроенный стиль переопределяет свойство CSS display:none, применяемое через класс .search-bar, по своей специфике.
И, кроме того, добавлен класс .search-bar-open.
Теперь я предполагаю, что при применении класса .search-bar-open должен произойти переход, предусмотренный внутри .search-bar, то есть:
а. Я в top:0;…
б. И за 2 секунды с легкостью…
в. Я настроен top:90px;.
Я что-то неправильно понял, потому что это не работает :-(



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы используете JS, чтобы сделать элемент видимым И добавить класс для запуска перехода, это не сработает, потому что JS выполняет оба этих действия одновременно. Переход сработает, если свойство элемента будет изменено, но в этом случае свойство top никогда не изменяется, оно уже было там, когда элемент стал видимым.
Вы можете добавить действие JS между ними, чтобы вызвать перекомпоновку браузера. Таким образом, браузер сначала делает элемент видимым, рисует его на странице, а затем добавляет класс для запуска перехода.
searchBar.style.display = "flex";
searchBar.offsetWidth;
searchBar.classList.add("search-bar-open")
Дорогой Рене, Все получилось отлично. Следуя вашему совету, я даже исправил кое-что еще. Большое спасибо!
проблема в том, что переходы не работают для свойств display: none,
вместо того, чтобы использовать display none для гибкости, просто сделайте что-нибудь, чтобы скрыть панель поиска, не делая display: none;
одно из возможных решений — задать отрицательное верхнее значение для удаления из видимого окна.
например top: -50px (или вы можете указать точное значение, соответствующее высоте панели поиска)
let isSearchBarOpen = false;
function toggleSearchBar() {
if (isSearchBarOpen) {
searchBar.style.top= "-50px"; //here used top instead of display
} else {
searchBar.classList.add("search-bar-open")
}
isSearchBarOpen = !isSearchBarOpen;
toggleSearchIcon();
}
.search-bar {
display: flex; //here let it to be flex
background-color: #000;
color: #fff;
position: absolute;
top: 0;
left: 0;
right: 0;
padding: 10px 5px;
z-index: 1000;
margin: 0 auto;
transition: top 2s ease-in;
}
.search-bar-open {
top:90px;
}
Дорогой Джунаид, я не пробовал ваше решение (честно говоря), как сразу сработал Рене. Однако большое спасибо. Ваше здоровье!
Переход не работает для display:none. Итак, вместо перехода используйте анимацию.
пример кода:
CSS:
.search-bar {
display: none;
background-color: #000;
color: #fff;
position: absolute;
top: 0;
left: 0;
right: 0;
padding: 10px 5px;
z-index: 1000;
margin: 0 auto;
animation: toggleOnAnimation 2s ease-in;
}
.search-bar-open {
top: 90px;
}
@keyframes toggleOnAnimation {
0% {
top: 0
}
100% {
top: 90px
}
}
Javascript:
let isSearchBarOpen = false;
let searchBar = document.getElementById("search-bar");
function toggleSearchBar() {
if (isSearchBarOpen) {
searchBar.style.display = "none";
} else {
searchBar.style.display = "flex";
searchBar.classList.add("search-bar-open")
}
isSearchBarOpen = !isSearchBarOpen;
}
HTML:
<div class = "search-icon">
<i class = "fas fa-search search-icon-header"></i>
<!-- <img src = "images/close-icon.svg" alt = "close-icon-search" class = "close-icon-search"> -->
<button onclick = "toggleSearchBar()">Click</button>
</div>
<div class = "search-bar" id = "search-bar">
<div class = "search-container">
<form class = "search-form">
<input type = "text" placeholder = "Search...">
<button type = "submit">
Submit
</button>
</form>
</div>
</div>
Здесь я использовал анимацию вместо перехода. Надеюсь, вы поняли :)
Дорогой Свалих, я не пробовал ваше решение (честно говоря), как сразу сработал Рене. Однако большое спасибо. Ваше здоровье!