Щелкните по элементу, чтобы позволить элементам после него скользить вперед

#javascript #html #jquery #css

#javascript #HTML #jquery #css

Вопрос:

Я тренируюсь и пытаюсь создать страницу в Instagram.

Теперь макет готов, но у меня есть некоторые проблемы с javascript.

Как мне сделать эффект, подобный instagram, как показано в gif ниже?

введите описание изображения здесь

Я заставляю css отображать: нет, когда щелкают по элементу.

Но я не уверен, как заставить элементы после его перемещения вперед.

Пожалуйста, обратитесь к gif ниже.

введите описание изображения здесь

Я идея была:

При щелчке на элементе оберните элементы после него, а затем измените положение css для переноса. Я использовал jquery wrap(), но это не сработало так, как я хотел.

например, исходный код выглядит следующим образом

 <div class="box">111</div>
<div class="box">222</div>
<div class="box">333</div>
<div class="box">444</div>
<div class="box">555</div>
 

Я использовал

       $(".box").click(function () {
        $(this).nextAll().wrap('<div class="wrap"></div>');
      });
 

если я нажму 222, результат будет

 <div class="box">111</div>
<div class="box">222</div>
<div class="wrap">
    <div class="box">333</div>
</div>
<div class="wrap">
    <div class="box">444</div>
</div>
<div class="wrap">
    <div class="box">555</div>
</div>
 

но я хочу, чтобы это было так

 <div class="box">111</div>
<div class="box">222</div>
<div class="wrap">
    <div class="box">333</div>
    <div class="box">444</div>
    <div class="box">555</div>
</div>
 

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

Или есть какой-нибудь лучший способ добиться этого эффекта?

Комментарии:

1. Вы смотрели на метод wrapAll() ?

2. Это метод, который я ищу. Спасибо!

3. Имейте в виду, что как только вы их обернете, они nextAll() не будут работать точно так же. Но это все о том, как научиться заставлять его работать

Ответ №1:

Я знаю, что @charlietfl уже ответил на часть вашего вопроса, так что здесь речь идет только об анимации. Это всего лишь один из способов сделать это, и есть много других для этого.

Пример кода доступен ниже.

Итак, как это работает?

Примените оболочку к блоку, чтобы получить простой элемент для анимации (да, вы также можете просто анимировать поле с полями и без оболочки. Оболочка предназначена только для создания простой анимации заполнения.)

Если щелкнуть .close span, оболочке присваивается следующий CSS:

 width: 0;
opacity: 0;
padding-left: 0;
padding-right: 0;
 

Поскольку оболочка имеет

 transition: 0.5s;
 

он будет красиво скользить влево. (в данном случае переход применяется к ширине, непрозрачности и заполнению)

И, возможно, подумайте о том, чтобы что-то сделать с z-индексом (анимация непрозрачности немного уродлива перед другими элементами).

Я надеюсь, что смогу кому-нибудь помочь — Хорошего дня!

 $(".close").click(function(){
    var el = $(this).closest(".box_wrapper");
    el.css("width", 0);
    el.css("opacity", 0);
    el.css("padding-left", 0);
    el.css("padding-right", 0);
    setTimeout(function() {
      el.remove();
    }, 500);
}); 
 .box_wrapper {
  float: left;
  transition: 0.5s;
  width: 100px;
  height: 200px;
  padding: 15px;
}

.box {
  background-color: lightgrey;
  width: 100px;
  height: 100%;
  padding: 10px;
} 

.close {
  float: right;
  cursor: pointer;
} 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="box_wrapper">
  <div class="box"><span class="close">X</span>1</div>
</div>
<div class="box_wrapper">
  <div class="box"><span class="close">X</span>2</div>
</div>
<div class="box_wrapper">
  <div class="box"><span class="close">X</span>3</div>
</div>
<div class="box_wrapper">
  <div class="box"><span class="close">X</span>4</div>
</div> 

И да, этот код не идеален. Есть некоторые вещи, которые нужно улучшить, такие как заполнение в .box_wrapper amp; .box, анимация непрозрачности и js. (может быть значительно упрощен)