Почему Modal Popup с Jekyll и bootsratp показывает только содержимое последнего ребенка?

Я пытаюсь создать модальное всплывающее окно, используя jekyll и bootstrap. Проблема в том, что в каждом всплывающем окне отображается только последний дочерний элемент в информации цикла, а не этот конкретный дочерний элемент. Я попробовал несколько разных идей, чтобы решить эту проблему, но я не могу понять это.

Ниже приведен код, который у меня есть для проекта, над которым я работаю. Что я делаю неправильно?

Заранее спасибо за помощь!

HTML:

{% for stone in site.data.stones %}

<div class="popup-content">
  <h1>{{ stone.color }}</h1>
  <button class="close">Close</button>
</div>
</div>
<div class="popup-hold">
  <h1>{{ stone.gem }}</h1>
  <button class="open">Open</button>
</div>

{% endfor %}

CSS:

.popup-overlay {
   visibility: hidden;
   position: absolute;
   background: grey;
   height: 50%;
   width: 50%;
   left: 25%;
}

.popup-overlay.active {
   visibility: visible;
   z-index: 1;
}

.popup-content {
   visibility: hidden;

}

.popup-content.active {
   visibility: visible;
   z-index: 1;
}

.popup-hold {
   height: 330px;
   border: 2px solid black;
}

stones.yml:

- gem: Mind
  color: yellow

- gem: Time
  color: green

- gem: Soul
  color: orange

Jquery:

$(document).ready(function(e) {
 // adds "active" class to overlay and content
  $(".open").on("click", function(){
    $(".popup-overlay, .popup-content").addClass("active");
  });
  // removes "active" class from overlay and content
  $(".close, .popup-overlay").on("click", function(){
    $(".popup-overlay, .popup-content").removeClass("active");
  });
});

1 ответ

Вы не дали нам полную картину - так что трудно помочь.

Тем не менее, я подозреваю, что есть две (2) разные проблемы.

ПЕРВЫЙ: нет открытия <div class="pop-overlay> в цикле Джекила.

Измените вашу жидкостную петлю, чтобы включить начальный div для наложения каждого камня:

{% for stone in site.data.stones %}

<div class="popup-overlay"> // Add this opening div
  <div class="popup-content">
    <h1>{{ stone.color }}</h1>
    <button class="close">Close</button>
  </div>
</div>

<div class="popup-hold">
  <h1>{{ stone.gem }}</h1>
  <button class="open">Open</button>
</div>

{% endfor %}

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

ВТОРОЕ: Получить jquery ТОЛЬКО чтобы открыть связанный (предыдущий) модальный

Эта проблема в том, что ваш jquery открывает ВСЕ модалы на странице - в зависимости от того, что .open кнопку, которую вы нажимаете.

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

Попробуйте изменить свой jquery так, чтобы при нажатии на .open Кнопка, открывается только предыдущий / связанный модальный элемент (в отличие от всех).

Попробуйте что-то вроде этого jquery:

<script>
$(document).ready(function(e) {
 // adds "active" class to overlay and content
  $(".open").on("click", function(){
    $(this).parent().prev(".popup-overlay").addClass("active");
    $(this).parent().prev(".popup-overlay").find(".popup-content").addClass("active");
  });
  // removes "active" class from overlay and content
  $(".close").on("click", function(){
    $(".popup-overlay, .popup-content").removeClass("active");
  });
});
</script>

ПРИМЕЧАНИЕ. Этот скрипт закроет все открытые модалы при нажатии любой из кнопок закрытия.

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

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

Если это не работает, то вы должны предоставить полный вывод html или лучший рабочий пример.

Вот демонстрация того, как я ДУМАЮ, что вы хотите запустить:

$(document).ready(function(e) {
  // adds "active" class to overlay and content
  $(".open").on("click", function() {
    $(this).parent().prev(".popup-overlay").addClass("active");
    $(this).parent().prev(".popup-overlay").find(".popup-content").addClass("active");
  });
  // removes "active" class from overlay and content
  $(".close").on("click", function() {
    $(".popup-overlay, .popup-content").removeClass("active");
  });
});
  .popup-overlay {
  visibility: hidden;
  position: absolute;
  background: grey;
  height: 50%;
  width: 50%;
  left: 25%;
}

.popup-overlay.active {
  visibility: visible;
  z-index: 1;
}

.popup-content {
  visibility: hidden;
}

.popup-content.active {
  visibility: visible;
  z-index: 1;
}

.popup-hold {
  height: 330px;
  border: 2px solid black;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


<div class="popup-overlay">
  <div class="popup-content">
    <h1>yellow</h1>
    <button class="close">Close</button>
  </div>
</div>

<div class="popup-hold">
  <h1>Mind</h1>
  <button class="open">Open</button>
</div>


<div class="popup-overlay">
  <div class="popup-content">
    <h1>Green</h1>
    <button class="close">Close</button>
  </div>
</div>

<div class="popup-hold">
  <h1>Time</h1>
  <button class="open">Open</button>
</div>


<div class="popup-overlay">
  <div class="popup-content">
    <h1>Orange</h1>
    <button class="close">Close</button>
  </div>
</div>

<div class="popup-hold">
  <h1>Soul</h1>
  <button class="open">Open</button>
</div>

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