CSS Анимация бокового меню (используется как панель фильтров для таблицы) - PullRequest
3 голосов
/ 05 августа 2020

Эй, я борюсь с использованием CSS Анимации. Я использую Bootstrap 4, и я новичок в разработке веб-сайтов, а также в CSS. Я использую Animate. css для анимации. Я хочу, чтобы кнопка со значком расширялась в сторону и показывала div с элементами select (для фильтрации таблиц, для которой я использую таблицы данных). Вот мой воспроизводимый сценарий: я не могу понять, как запустить анимацию с помощью кнопки со значком (я также хочу, чтобы кнопка выбора располагалась равномерно и по центру по вертикали, но кнопка справа). Я мог реализовать это только с помощью display: flex, но тогда float-right не работает для кнопки.

Вот код: я не мог понять, как использовать анимацию. css в jsfiddle: / Edit: Я забыл метод анимации: https://jsfiddle.net/z4yvp0gL/8/

HTML:

<div>
  <div class="row button-container">
    <div class="col" style="display: flex;">
      <div id="sideExpand"><select>
          <optgroup label="This is a group">
            <option value="12" selected>This is item 1</option>
            <option value="13">This is item 2</option>
            <option value="14">This is item 3</option>
          </optgroup>
        </select><select>
          <optgroup label="This is a group">
            <option value="12" selected>This is item 1</option>
            <option value="13">This is item 2</option>
            <option value="14">This is item 3</option>
          </optgroup>
        </select><select>
          <optgroup label="This is a group">
            <option value="12" selected>This is item 1</option>
            <option value="13">This is item 2</option>
            <option value="14">This is item 3</option>
          </optgroup>
        </select></div>
      <button class="btn btn btn-transparent btn-icon" id="filterToggle" onclick="SetActiveDiv('#sideExpand',this)"><i class="fa fa-filter" style="position: absolute;font-size: 150%;"></i></button>
    </div>
  </div>
</div>

CSS

#sideExpand {
  display: none;
  width: 100%;
  border-radius: 35px;
  background-color: rgba(31, 45, 65, 0.125);
}
select {
  border: 0;
  background-color: initial;
  font-size: 100%;
  display: block;
  margin: auto;
  word-wrap: normal;
}
.btn-icon {
  padding: 0;
  display: -webkit-inline-box;
  display: inline-flex;
  -webkit-box-align: center;
  align-items: center;
  -webkit-box-pack: center;
  justify-content: center;
  overflow: hidden;
  border-radius: 100%;
  flex-shrink: 0;
  height: calc( (1rem * 1.5) + (0.5rem * 2) + (2px) ) !important;
  width: calc( (1rem * 1.5) + (0.5rem * 2) + (2px) ) !important;
}

Javascript

function SetActiveDiv(ID, bt) {
  var element = document.querySelector(ID);
  if (element !== null) {
    if (element.classList.contains("show")) {
      element.classList.remove("show");
      animateCSS(element, "fadeOutLeftBig", "2s")
      animateCSS(bt, "fadeOutLeftBig", "2s")
      return setTimeout(() => {
        element.style.display = "none";
      }, 2000);
    } else {
      element.style.display = "flex";
      element.classList.add("show");
      animateCSS(element, "fadeInLeftBig", "2s").then((message) => {});
      return animateCSS(bt, "fadeInLeftBig", "2s").then((message) => {});
    }
  }
  return console.log(ID, " not found!");
}

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Как добавить анимацию перехода с CSS

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

Есть два способа анимации с использованием css, со свойством Animate или свойством Transition. Я использую свойство перехода в этом примере, потому что эта анимация проста, а анимация перехода лучше для производительности.

Переход: Установите свойство, которое вы хотите изменить, продолжительность и Кривая Безье (время анимации).

Комментарии в коде более подробно объясняют, для чего предназначена каждая часть кода.

Deme: https://jsfiddle.net/hexzero/9da0q3eh/

function SetActiveDiv(ID, bt) {
  var element = document.getElementById(ID);
  if (element) {
   element.classList.toggle("slide") // By toggling the class, 
   return true               //css attributes change that triggers the animation to start
  }
  return console.log(ID, " not found!");
}
#sideExpand {
  display:flex;
  width: 100%;
  height: calc( (1rem * 1.5) + (0.5rem * 2) + (2px) );
  border-radius: 35px;
  background-color: rgba(31, 45, 65, 0.125);
  transition: transform 1s ease-in; // Transition set which property will be animated and how
  transform: translateX(100%); // this is the initial position of the element

Примечание: это означает, что для начала элемент будет на 100% смещен. В правую сторону, из-за потока документа.

  z-index: -1; // z-index determines how elements stack up on the z axis, lower values to to the bottom of the stack
}

#sideExpand.slide{  // We have to use the Id along side the class do to specificity
  transform: translateX(0%); // This is the position that will be achieved 
}

.filter-container{
  padding: .3rem;
  display: flex; 
  justify-content: flex-end;
  overflow: hidden;  // Hides the overflowing element, at the moment the filter is 100% 
} // out of position that would extent the view to the right significantly.

#filterToggle{  // I advise to never use inline style, try to add them to your style-sheets
  background: white; // fore, the use of inline styles and the !important keyword
  font-size: 150%; // has extremely high specificity values that are hard to overwrite 
  border: .2rem solid #c1c1c1;
}

#filterToggle::after{ // Add a cover to hide the filters
  position:absolute;
  content: "";
  height: calc( (1rem * 1.5) + (0.5rem * 2) + (2px) );
  width: 4rem;
  background:white;
  right: -2rem ;
  z-index: -1;
}

Если вы заметите какие-либо несоответствия или у вас есть предложения по улучшению моих ответов, пожалуйста, дайте мне знать. Спасибо

0 голосов
/ 05 августа 2020

Вы можете просто использовать css анимацию:

ОБНОВЛЕНИЕ: кнопка закреплена слева.

function SetActiveDiv() {
  var element = document.getElementById("sideExpand");
  element.classList.toggle("show");
}
#sideExpand {
  display: flex;
  width: 100%;
  border-radius: 35px;
  padding: 10px 10px 10px 48px;
  justify-content: space-between;
  transition: transform .3s ease;
  transform: translateX(-105%);
  background-color: rgba(31, 45, 65, 0.125);
}

#sideExpand.show {
  transform: translateX(0) !important;
}

#sideExpand select {
  border: 0;
  background-color: initial;
  font-size: 100%;
  word-wrap: normal;
}

.btn-icon {
  padding: 0;
  outline: none;
  cursor: pointer;
      position: fixed;
    left: 6px;
    top: 6px;
  display: -webkit-inline-box;
  display: inline-flex;
  -webkit-box-align: center;
  align-items: center;
  -webkit-box-pack: center;
  justify-content: center;
  overflow: hidden;
  border-radius: 100%;
  flex-shrink: 0;
  height: calc( (1rem * 1.5) + (0.5rem * 2) + (2px)) !important;
  width: calc( (1rem * 1.5) + (0.5rem * 2) + (2px)) !important;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css" integrity="sha512-1PKOgIY59xJ8Co8+NE6FZ+LOAZKjy+KY8iq0G4B3CyeY6wYHN3yt9PW0XpSriVlkMXe40PTKnXrLnZ9+fkDaog==" crossorigin="anonymous" />
<div>
  <div class="row button-container">
    <div class="col" style="display: flex;">
      <div id="sideExpand">
        <select>
          <optgroup label="This is a group">
            <option value="12" selected>This is item 1</option>
            <option value="13">This is item 2</option>
            <option value="14">This is item 3</option>
          </optgroup>
        </select>
        <select>
          <optgroup label="This is a group">
            <option value="12" selected>This is item 1</option>
            <option value="13">This is item 2</option>
            <option value="14">This is item 3</option>
          </optgroup>
        </select>
        <select>
          <optgroup label="This is a group">
            <option value="12" selected>This is item 1</option>
            <option value="13">This is item 2</option>
            <option value="14">This is item 3</option>
          </optgroup>
        </select>
      </div>
      <button class="btn btn btn-transparent btn-icon" id="filterToggle" onclick="SetActiveDiv()"><i class="fa fa-filter" style="position: absolute;font-size: 150%;"></i></button>
    </div>
  </div>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...