Как активировать модал, чтобы открыть все 3 кнопки нажатием, а не только одной кнопкой? - PullRequest
0 голосов
/ 18 апреля 2019

Я бы хотел, чтобы модал активировался при нажатии всех 3 кнопок, но, похоже, он не работает. Мне удалось открыть диалог только по первому нажатию кнопки. Я пытался возиться с Javascript и добавлять разные события, но не могу понять, что я делаю не так?

Также потребуется модал, чтобы открывать больше кнопок при нажатии в будущем, так как мы будем добавлять больше контента на сайт.

//  Get modal element
const modal = document.getElementById("simpleModal");
// Get open modal button
const modalBtn = document.getElementById("modalBtn");
// Get close btn
const closeBtn = document.getElementsByClassName("closeBtn")[0];

// listen for open click
modalBtn.addEventListener("click", openModal);

// Listen for close click
closeBtn.addEventListener("click", closeModal);

// function to open modal
function openModal() {
  modal.style.display = "block";
}

// Function to close block
function closeModal() {
  modal.style.display = "none";
}
#blog {
  background: #fff;
}

.blog-posts {
  display: flex;
  justify-content: center;
}

.blog-content {
  background: #f4f4f4;
  margin: 3rem;
  border-bottom-right-radius: 15px;
}

img {
  border-top-left-radius: 15px;
}

h6 {
  padding-top: 0.2rem;
}

h3 {
  padding-top: 1rem;
  font-size: 1.5rem;
  color: #333;
}

.btn-light {
  padding: 0.5rem 1rem;
  margin: 2rem;
}

.modal {
  display: none;
  position: fixed;
  z-index: 1;
  left: 0;
  top: 0;
  height: 100%;
  width: 100%;
  overflow: auto;
}

.modal-content {
  background: #f4f4f4;
  margin: auto;
  overflow: scroll;
  padding: 20px;
  width: 100%;
  height: 100%;
  animation: modalOpen 1.5s;
}

.closeBtn {
  color: $dark-color;
  float: right;
  margin: 1rem 0.5rem;
  font-size: 50px;
}
<section id="blog" class="text-center py-1">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
  <div class="blog-posts">
    <div class="blog-content">
      <img src="./img/blog.jpg" alt="blog" />
      <h6>APRIL 2019</h6>
      <h3>How we can help you</h3>
      <button id="modalBtn" class="btn-light">READ MORE</button>
    </div>

    <div class="blog-content">
      <img src="./img/blog.jpg" alt="blog" />
      <h6>APRIL 2019</h6>
      <h3>How we can help you</h3>
      <button id="modalBtn" class="btn-light">READ MORE</button>
    </div>

    <div class="blog-content">
      <img src="./img/blog.jpg" alt="blog" />
      <h6>APRIL 2019</h6>
      <h3>How we can help you</h3>
      <button id="modalBtn" class="btn-light">READ MORE</button>
    </div>
    <div id="simpleModal" class="modal">
      <div class="modal-content">
        <span class="closeBtn"><i class="fas fa-times-circle"></i></span>
      </div>
    </div>
    <div id="simpleModal2" class="modal">
      <div class="modal-content">
        <span class="closeBtn"><i class="fas fa-times-circle"></i></span>
      </div>
    </div>
  </div>
</section>

Ответы [ 5 ]

1 голос
/ 18 апреля 2019

Проблема в том, что у вас есть дубликаты идентификаторов для кнопок открытия. Дублирующиеся идентификаторы не являются действительным HTML, и это именно то, почему. Они могут вызвать нежелательное поведение.

const modalBtn = document.getElementsByID("modalBtn");

выберет только первое вхождение элемента с этим идентификатором. Так что просто первая кнопка.

Вы должны добавить разные идентификаторы и общий класс к кнопкам. Я добавил modal-btn класс к каждой кнопке, которая откроет модальный. Так что он выберет все эти кнопки.

Также HTML-атрибуты должны быть не camelCase, а тире, например this-class

//  Get modal element
const modal = document.getElementsByClassName("modal");
// Get open modal button
const modalBtn = document.getElementsByClassName("modal-btn");
// Get close btn
const closeBtn = document.getElementsByClassName("closeBtn");

// listen for open click
for (var i = 0; i < modalBtn.length; i++) {
  (function() {
    var j = i;
    modalBtn[j].addEventListener("click", function() {
      openModal(j)
    });
  })();

}


// Listen for close click
for (var i = 0; i < closeBtn.length; i++) {
  (function() {
    var j = i;
    closeBtn[j].addEventListener("click", function() {
      closeModal(j)
    });
  })();

}

// function to open modal
function openModal(j) {

  modal[j].style.display = "block";
}

// Function to close block
function closeModal(j) {
  modal[j].style.display = "none";
}
#blog {
  background: #fff;
}

.blog-posts {
  display: flex;
  justify-content: center;
}

.blog-content {
  background: #f4f4f4;
  margin: 3rem;
  border-bottom-right-radius: 15px;
}

img {
  border-top-left-radius: 15px;
}

h6 {
  padding-top: 0.2rem;
}

h3 {
  padding-top: 1rem;
  font-size: 1.5rem;
  color: #333;
}

.btn-light {
  padding: 0.5rem 1rem;
  margin: 2rem;
}

.modal {
  display: none;
  position: fixed;
  z-index: 1;
  left: 0;
  top: 0;
  height: 100%;
  width: 100%;
  overflow: auto;
}

.modal-content {
  background: #f4f4f4;
  margin: auto;
  overflow: scroll;
  padding: 20px;
  width: 100%;
  height: 100%;
  animation: modalOpen 1.5s;
}

.closeBtn {
  color: $dark-color;
  float: right;
  margin: 1rem 0.5rem;
  font-size: 50px;
}
<section id="blog" class="text-center py-1">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
  <div class="blog-posts">
    <div class="blog-content">
      <img src="./img/blog.jpg" alt="blog" />
      <h6>APRIL 2019</h6>
      <h3>How we can help you</h3>
      <button id="modalBtn" class="btn-light modal-btn">READ MORE</button>
    </div>

    <div class="blog-content">
      <img src="./img/blog.jpg" alt="blog" />
      <h6>APRIL 2019</h6>
      <h3>How we can help you</h3>
      <button id="modalBtn2" class="btn-light modal-btn">READ MORE</button>
    </div>

    <div class="blog-content">
      <img src="./img/blog.jpg" alt="blog" />
      <h6>APRIL 2019</h6>
      <h3>How we can help you</h3>
      <button id="modalBtn3" class="btn-light modal-btn">READ MORE</button>
    </div>
    <div id="simpleModal" class="modal">
      <div class="modal-content">
      a
        <span class="closeBtn"><i class="fas fa-times-circle"></i></span>
      </div>
    </div>
    <div id="simpleModal2" class="modal">
      <div class="modal-content">
      b
        <span class="closeBtn"><i class="fas fa-times-circle"></i></span>
      </div>
    </div>
    <div id="simpleModal3" class="modal">
      <div class="modal-content">
      c
        <span class="closeBtn"><i class="fas fa-times-circle"></i></span>
      </div>
    </div>
  </div>
</section>
1 голос
/ 18 апреля 2019

Вы делаете ошибку, когда вы даете одинаковый идентификатор элементам дерева! Идентификатор должен быть уникальным! Этот момент.

-Чтобы сделать его лучше, используйте getElementsByClassName, чтобы получить все элементы для прикрепления вашего события.

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

Для передачи аргумента я использую пользовательский атрибут!

Вот исправленный код:

//  Get modal element
const modal = document.getElementById("simpleModal");
// Get open modal button
var modalBtn = document.getElementsByClassName("readMore");
// Get close btn
const closeBtn = document.getElementsByClassName("closeBtn")[0];

for (var x=0; x < modalBtn.length; x++) {
  modalBtn[x].addEventListener("click", openModal);
}
 
// Listen for close click
closeBtn.addEventListener("click", closeModal);

// function to open modal
function openModal(event) {

  var content = "";
  var modalPreview = document.getElementById("modalPreview");
  if (event) {
   
    console.log("Look for target element" + event.target);
    console.log("Look for parent element" + event.target.parentNode);

    content = event.target.getAttribute("MyContent");
    
    console.log("Use some data from parent element" + event.target.parentNode.childNodes[0]);
    
    console.log("Use some data from parent element" + event.target.parentNode.childNodes[1]);
    
    console.log("Use some data from parent element" + event.target.parentNode.childNodes[2]);
    
  
  }
  
  modal.style.display = "block";
  
  modalPreview.innerHTML = content;
  
  // += append
  modalPreview.appendChild(event.target.parentNode.childNodes[1]);
  
}

// Function to close block
function closeModal() {
  modal.style.display = "none";
}
#blog {
  background: #fff;
}

.blog-posts {
  display: flex;
  justify-content: center;
}

.blog-content {
  background: #f4f4f4;
  margin: 3rem;
  border-bottom-right-radius: 15px;
}

.readMore {
  color: blue
}

img {
  border-top-left-radius: 15px;
}

h6 {
  padding-top: 0.2rem;
}

h3 {
  padding-top: 1rem;
  font-size: 1.5rem;
  color: #333;
}

.btn-light {
  padding: 0.5rem 1rem;
  margin: 2rem;
}

.modal {
  display: none;
  position: fixed;
  z-index: 1;
  left: 0;
  top: 0;
  height: 100%;
  width: 100%;
  overflow: auto;
}

.modal-content {
  background: #f4f4f4;
  margin: auto;
  overflow: scroll;
  padding: 20px;
  width: 100%;
  height: 100%;
  animation: modalOpen 1.5s;
}

.closeBtn {
  color: $dark-color;
  float: right;
  margin: 1rem 0.5rem;
  font-size: 50px;
}
<section id="blog" class="text-center py-1">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
  <div class="blog-posts">
    <div class="blog-content">
      <img src="https://maximumroulette.com/imgs/social/stack.png" alt="blog" />
      <h6>APRIL 2019</h6>
      <h3>How we can help you</h3>
      <button MyContent=" TEXT 1 " id="modalBtn1" class="btn-light readMore">READ MORE</button>
    </div>

    <div class="blog-content">
      <img src="http://maximumroulette.com/imgs/social/linkedin.png" alt="blog" />
      <h6>APRIL 2019</h6>
      <h3>How we can help you</h3>
      <button MyContent=" TEXT 2 " id="modalBtn2" class="btn-light readMore">READ MORE</button>
    </div>

    <div class="blog-content">
      <img src="http://maximumroulette.com/imgs/social/linkedin.png" alt="blog" />
      <h6>APRIL 2019</h6>
      <h3>How we can help you</h3>
      <button MyContent=" TEXT 3 " id="modalBtn3" class="btn-light readMore">READ MORE</button>
    </div>
    <div id="simpleModal" class="modal">
      <div class="modal-content">
        <div id="modalPreview"></div>
        <span class="closeBtn"><i class="fas fa-times-circle"></i></span>
      </div>
    </div>
    <div id="simpleModal2" class="modal">
      <div class="modal-content">
        <span class="closeBtn"><i class="fas fa-times-circle"></i></span>
      </div>
    </div>
  </div>
</section>
0 голосов
/ 18 апреля 2019

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

Теперь вы можете решить, хотите ли вы получать элементы по идентификатору (теперь для меня это была самая быстрая настройка: https://jsfiddle.net/2kt6fqhz/2/) или по имени класса. Если вы получаете их по имени класса, установить событие довольно просто. слушатели столько кнопок / элементов, сколько вы хотите. Я рекомендую второй вариант.

пример:

<div class="blog-content">
  <img src="./img/blog.jpg" alt="blog" />
  <h6>APRIL 2019</h6>
  <h3>How we can help you</h3>
  <button id="modalBtn1" class="btn-light">READ MORE</button>
</div>

<div class="blog-content">
  <img src="./img/blog.jpg" alt="blog" />
  <h6>APRIL 2019</h6>
  <h3>How we can help you</h3>
  <button id="modalBtn2" class="btn-light">READ MORE</button>
</div>

<div class="blog-content">
  <img src="./img/blog.jpg" alt="blog" />
  <h6>APRIL 2019</h6>
  <h3>How we can help you</h3>
  <button id="modalBtn3" class="btn-light">READ MORE</button>
</div>
0 голосов
/ 18 апреля 2019

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

Вот пример.

	#blog {
  background: #fff;
}

.blog-posts {
  display: flex;
  justify-content: center;
}

.blog-content {
  background: #f4f4f4;
  margin: 3rem;
  border-bottom-right-radius: 15px;
}

img {
  border-top-left-radius: 15px;
}

h6 {
  padding-top: 0.2rem;
}

h3 {
  padding-top: 1rem;
  font-size: 1.5rem;
  color: #333;
}

.btn-light {
  padding: 0.5rem 1rem;
  margin: 2rem;
}

.modal {
  display: none;
  position: fixed;
  z-index: 1;
  left: 0;
  top: 0;
  height: 100%;
  width: 100%;
  overflow: auto;
}

.modal-content {
  background: #f4f4f4;
  margin: auto;
  overflow: scroll;
  padding: 20px;
  width: 100%;
  height: 100%;
  animation: modalOpen 1.5s;
}

.closeBtn {
  color: $dark-color;
  float: right;
  margin: 1rem 0.5rem;
  font-size: 50px;
}

.modelinput{display:none;}
.modelinput:checked + .modal_wrap{display:block;}
.btn{display:inline-block; padding:4px 10px; background:#cc3333; margin:auto; color:#fff; border-radius:3px;}
.btnwrap{text-align:center; margin-bottom:10px;}
<section id="blog" class="text-center py-1">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
  <div class="blog-posts">
    <div class="blog-content">
      <img src="./img/blog.jpg" alt="blog" />
      <h6>APRIL 2019</h6>
      <h3>How we can help you</h3>
      <div class="btnwrap"><label class="btn" for="modelbox">Read More</label></div>
	  
    </div>

    <div class="blog-content">
      <img src="./img/blog.jpg" alt="blog" />
      <h6>APRIL 2019</h6>
      <h3>How we can help you</h3>
      <div class="btnwrap"><label class="btn" for="modelbox">Read More</label></div>
    </div>

    <div class="blog-content">
      <img src="./img/blog.jpg" alt="blog" />
      <h6>APRIL 2019</h6>
      <h3>How we can help you</h3>
      <div class="btnwrap"><label class="btn" for="modelbox">Read More</label></div>
    </div>
	
	<input type="checkbox" class="modelinput" id="modelbox" />
    <div id="simpleModal" class="modal modal_wrap">
      <div class="modal-content">
        <span class="closeBtn"><label for="modelbox"><i class="fas fa-times-circle"></i></label></span>
      </div>
    </div>
  </div>
</section>

Читать подробно https://www.growyourgk.com/css/simple-popup-without-javascript/

0 голосов
/ 18 апреля 2019

Изменение модального содержимого

В случае, если у вас есть много кнопок, которые запускают один и тот же модал с немного другим содержанием?Используйте атрибуты event.relatedTarget и HTML data- * для изменения содержания модального окна в зависимости от нажатия кнопки.

проверка эта ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...