Как анимировать открытие и закрытие боковой панели CSS в CSS?

У меня есть боковая панель, созданная с помощью css display: flex;, и кнопка, которая устанавливает отображение боковой панели на display: none;. В настоящее время боковая панель закрывается и открывается мгновенно, без анимации. Я бы хотел, чтобы боковая панель выдвигалась слева с помощью transition: 2.2s cubic-bezier(.36,-0.01,0,.77);. Боковая панель скрывает и показывает, я просто хочу, чтобы она анимировалась.

Я попытался просто добавить transition: 2.2s cubic-bezier(.36,-0.01,0,.77); в CSS боковой панели, но это не сработало. Вот код для боковой панели контента и js.

function toggleSidebar() {
  var sidebar = document.querySelector('sidebar');
  var display = sidebar.style.display;
  if (display == 'none') {
    sidebar.style.display = 'flex';
  } else {
    sidebar.style.display = 'none';
  }
}
body {
  display: flex;
  flex-direction: row;
  background-image: url("https://4kwallpapers.com/images/wallpapers/macos-13-macos-ventura-macos-2022-stock-light-5k-retina-2048x1536-8135.jpg");
  background-size: cover !important;
  margin: 0px;
  height: 100%;
}

sidebar {
  flex: 0 0 200px;
  flex-direction: column;
  backdrop-filter: blur(30px) saturate(2);
  -webkit-backdrop-filter: blur(30px) saturate(2);
  padding-inline: 0;
  padding-block: 13px;
  overflow-y: auto;
  overflow-x: hidden;
  transition: 2.2s cubic-bezier(.36,-0.01,0,.77);
  height: 100%;
}

.main {
  flex: 1 1 auto;
  flex-wrap: wrap;
  flex-direction: column;
  overflow: auto;
}
<body>
  <sidebar>
    <li><a href = "#">Demo</a></li>
  </sidebar>
  <div class = "main">
    <button onclick = "toggleSidebar()">SIDEBAR</button>
  </div>
</body>

Кажется, js не относится к боковой панели.

Shuo 30.03.2023 02:50

Моя плохая, неправильная функция. Спасибо @Shou.

Gabriel Toy 30.03.2023 02:55
Поведение ключевого слова "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
2
212
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Оберните боковую панель и основной контент гибким блоком.

Измените flex боковой и основной панели, чтобы показать/скрыть боковую панель.

Кстати, в html нет тега боковой панели, вместо него можно использовать <aside>.

const container = document.querySelector('.container')
const toggleSidebar = () => container.classList.toggle('active')
.container {
  display: flex;
}

aside {
  flex: 0;
  flex-direction: column;
  backdrop-filter: blur(30px) saturate(2);
  -webkit-backdrop-filter: blur(30px) saturate(2);
  padding-inline: 0;
  padding-block: 13px;
  overflow-y: auto;
  overflow-x: hidden;
  height: 100dvh;
  background: gray;
  transition: 2.2s cubic-bezier(.36, -0.01, 0, .77);
}

.main {
  flex: 1;
  flex-wrap: wrap;
  flex-direction: column;
  overflow: auto;
  transition: 2.2s cubic-bezier(.36, -0.01, 0, .77);
}

.container.active aside {
  flex: 0.4;
}

.container.active .main {
  flex: 0.6;
}
<div class = "container">
  <aside>
    <li><a href = "#">Demo</a></li>
  </aside>
  <div class = "main">
    <button onclick = "toggleSidebar()">sidebar</button>
  </div>
</div>

Это оставляет большой пробел там, где раньше была боковая панель. Основной размер не меняется.

Gabriel Toy 30.03.2023 03:12

Будет ли боковая панель закрывать основной контент, когда она активна?

Shuo 30.03.2023 03:13

нет, он оттолкнет основной в сторону

Gabriel Toy 30.03.2023 03:45

Это будет немного по-другому, я отредактировал свой ответ.

Shuo 30.03.2023 04:30
Ответ принят как подходящий

В зависимости от того, хотите ли вы, чтобы боковая панель скользила или увеличивалась, я вижу два варианта.

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

Я также заменил тег <sidebar> на обычный div, так как это технически недействительный HTML. Подробнее см. здесь: Почему CSS работает с поддельными элементами?


Сдвиньте влево/вправо.

Установите margin-left на отрицательную ширину.

Имейте в виду, что могут быть некоторые непредвиденные последствия, так как он будет переполнять flexbox.

function toggleSidebar() {
  document.querySelector('.sidebar')
    .classList.toggle('closed');
}
body {
  display: flex;
  flex-direction: row;
  background-image: url("https://4kwallpapers.com/images/wallpapers/macos-13-macos-ventura-macos-2022-stock-light-5k-retina-2048x1536-8135.jpg");
  background-size: cover !important;
  margin: 0px;
  height: 100%;
}

.sidebar {
  flex: 0 0 200px;
  flex-direction: column;
  backdrop-filter: blur(30px) saturate(2);
  -webkit-backdrop-filter: blur(30px) saturate(2);
  padding-inline: 0;
  padding-block: 13px;
  overflow-y: auto;
  overflow-x: hidden;
  transition: 2.2s cubic-bezier(.36,-0.01,0,.77);
  height: 100%;
}

.sidebar.closed {
  margin-left: -200px;
}

.main {
  flex: 1 1 auto;
  flex-wrap: wrap;
  flex-direction: column;
  overflow: auto;
}
<body>
  <div class = "sidebar">
    <li><a href = "#">Demo</a></li>
  </div>
  <div class = "main">
    <button onclick = "toggleSidebar()">SIDEBAR</button>
  </div>
</body>

Расти / Уменьшиться

Установите flex-basis на 0.

Изначально вы устанавливаете flex-basis в 200px с помощью сокращенного свойства flex. Это то, что определяет ширину боковой панели.

Я также добавил white-space: nowrap, чтобы избежать переноса текста во время анимации. Если это неприемлемо, вам может понадобиться более сложное решение, чтобы предотвратить закручивание пуль.

function toggleSidebar() {
  document.querySelector('.sidebar')
    .classList.toggle('closed');
}
body {
  display: flex;
  flex-direction: row;
  background-image: url("https://4kwallpapers.com/images/wallpapers/macos-13-macos-ventura-macos-2022-stock-light-5k-retina-2048x1536-8135.jpg");
  background-size: cover !important;
  margin: 0px;
  height: 100%;
}

.sidebar {
  flex: 0 0 200px;
  flex-direction: column;
  backdrop-filter: blur(30px) saturate(2);
  -webkit-backdrop-filter: blur(30px) saturate(2);
  padding-inline: 0;
  padding-block: 13px;
  overflow-y: auto;
  overflow-x: hidden;
  transition: 2.2s cubic-bezier(.36,-0.01,0,.77);
  height: 100%;
  white-space: nowrap;
}

.sidebar.closed {
  flex-basis: 0;
}

.main {
  flex: 1 1 auto;
  flex-wrap: wrap;
  flex-direction: column;
  overflow: auto;
}
<body>
  <div class = "sidebar">
    <li><a href = "#">Demo</a></li>
  </div>
  <div class = "main">
    <button onclick = "toggleSidebar()">SIDEBAR</button>
  </div>
</body>

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