Как скрыть li с эффектом слайда в css

У меня есть ul, и, щелкнув один из его li, я хочу скрыть в нем дополнительный ul с эффектом скольжения. Я пробовал animation с height от 100% до 0. Но это не работает.

Это фрагмент кода, и в реальном сценарии будут динамические данные, а не li.

function hide() {
  var li = document.getElementById("game");
  game.classList.add("hide")
}
.hide {
  height: 0;
  overflow: hidden;
  animation-name: example;
  animation-duration: 4s;
}

@keyframes example {
  0% {
    height: 100%;
  }
  25% {
    height: 75%;
  }
  50% {
    height: 50%;
  }
  100% {
    height: 0%;
  }
}
<ul>
  <li>A</li>
  <li onclick = "hide()">b</li>
  <li id = "game" style = "height:100%">
    <ul>
      <li>1</li>
      <li>2</li>
    </ul>
  </li>

</ul>

Как я могу этого добиться?

Исправьте проблему со 100% высотой, и ваша анимация будет работать

Pete 29.05.2018 12:28

для этого вы можете использовать css transition.

vikscool 29.05.2018 12:30

не могли бы вы дать фрагмент кода

Sunil Garg 29.05.2018 12:31

@SunilGarg, взгляните на этот рабочий пример, я играю с шириной, и для получения дополнительной информации вы можете посмотреть W3School Transition

vikscool 29.05.2018 12:36
Поведение ключевого слова "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
119
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Использование процентов в вашем примере не сработает.

Решение 1: Вам нужно установить фиксированную высоту в @keyframes следующим образом:

function hide() {
  var li = document.getElementById("game");
  game.classList.add("hide")
}
.hide {
  height: 0;
  overflow: hidden;
  animation-name: example;
  animation-duration: 1s;
}

@keyframes example {
  0% {
    height: 40px;
  }
  25% {
    height: 30px;
  }
  50% {
    height: 20px;
  }
  100% {
    height: 0px;
  }
}
<ul>
  <li>A</li>
  <li onclick = "hide()">b</li>
  <li id = "game">
    <ul>
      <li>1</li>
      <li>2</li>
    </ul>
  </li>

</ul>

Решение 2: Добавьте фиксированную высоту к родительскому элементу <ul>, а затем вы можете использовать проценты в своих @keyframe следующим образом:

function hide() {
  var li = document.getElementById("game");
  game.classList.add("hide")
}
.hide {
  height: 0;
  overflow: hidden;
  animation-name: example;
  animation-duration: 1s;
}

ul {
  height: 200px;
}

@keyframes example {
  0% {
    height: 100%;
  }
  25% {
    height: 75%;
  }
  50% {
    height: 50%;
  }
  100% {
    height: 0%;
  }
}
<ul>
  <li>A</li>
  <li onclick = "hide()">b</li>
  <li id = "game">
    <ul>
      <li>1</li>
      <li>2</li>
    </ul>
  </li>

</ul>

Вот статья, который подробно описывает эту тему.

это работает, но в реальном сценарии данные привязываются динамически, поэтому не может быть n no if li, так как я могу определить, с какого px мне следует начать?

Sunil Garg 29.05.2018 12:29

@SunilGarg А, это хороший момент. Вы должны отредактировать свой вопрос, чтобы указать, что эти данные являются динамическими. В этом случае, если вы зададите родительскому элементу <ul> фиксированную высоту, вы можете использовать проценты. Причина, по которой проценты не работают в вашем примере, заключается в том, что нет элемента с фиксированной высотой, поэтому, когда вы добавляете процент, средство визуализации похоже на «50% чего ?!» Ничто не имеет фиксированной высоты, поэтому я должен визуализировать этот элемент 50% высота чего ?! " Я добавил решение, в котором вы можете использовать проценты, если вы установите фиксированную высоту для родительского элемента. Вы также можете изучить использование устройств vh.

R.F. Nelson 29.05.2018 12:33

Разве я не могу указать высоту в%, потому что я не знаю номер li, поэтому я не знаю начальную высоту в пикселях? и я обновил вопрос

Sunil Garg 29.05.2018 12:39

@SunilGarg Я обновил свой ответ. Где-то вам понадобится фиксированная высота, поэтому, возможно, вы могли бы установить высоту <ul> на жестко запрограммированное значение единиц vh, если он должен реагировать. Если это помогло, отметьте мой ответ как принятый. Спасибо и удачи.

R.F. Nelson 29.05.2018 12:42

@SunilGarg В конечном итоге вам, возможно, придется использовать JavaScript для динамической регулировки высоты элемента <ul>. Например, если есть x элементов <li> и вы знаете, что вам нужен 20px для каждого из них, то вы можете использовать JavaScript, чтобы установить высоту <ul> на x * 20px.

R.F. Nelson 29.05.2018 12:44

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