Модальное окно - html + css + javascript

Бьюсь второй день, ничего не получается. Люди добрые, помогите кодом ?

Идея такая - есть <а>Команда</а> и когда нажимаешь на нее появляется модалка, в которой 10 фотографий наших сотрудников. Просто фото.

Как это реализовать?

Заранее спасибо ?


Ответы (2 шт):

Автор решения: Алексей Обухов

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

Также есть куча готовых модалок

Мне нравится бутстрап, поэтому вот так сделал:

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-Piv4xVNRyMGpqkS2by6br4gNJ7DXjqk09RmUpJ8jgGtD7zP9yug3goQfGII0yAns" crossorigin="anonymous"></script>

<!-- Button trigger modal -->
<a class="btn btn-primary" data-toggle="modal" data-target="#exampleModalCenter">
  Комманда
</a>

<!-- Modal -->
<div class="modal fade" id="exampleModalCenter" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalLongTitle">Фотографии сотрудников</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
<div class="modal-body">
<div class="container">
  <img src="https://picsum.photos/200/300?1"/>
  <img src="https://picsum.photos/200/300?2"/>
  <img src="https://picsum.photos/200/300?3"/>
  <img src="https://picsum.photos/200/300?4"/>
  <img src="https://picsum.photos/200/300?5"/>
  <img src="https://picsum.photos/200/300?6"/>
  <img src="https://picsum.photos/200/300?7"/>
  <img src="https://picsum.photos/200/300?8"/>
  <img src="https://picsum.photos/200/300?9"/>
  <img src="https://picsum.photos/200/300?10"/>
</div>
</div>
<div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
      </div>
    </div>
  </div>
</div>

→ Ссылка
Автор решения: De.Minov

Без бутстрапов и прочей ерунды.

Комментарии внутри

let Modal = document.querySelector('#modal'), // В переменную "шаблон" модалки
  ModalContentBlock = Modal.querySelector('.modal__block'), // Там где хранится контент
  ModalContent;

document.addEventListener('click', function(e) { // Делаем делигированное событие по клику
  if(e.target.tagName === 'A') { // Определяем, является ли нажатое элементом A (ссылка), если да, то..
    ModalContent = document.querySelector(e.target.getAttribute('href')) || false; // Т.к. в ссылке мы передаём id, то будем искать такой элемент, || false - если что-то не так - false

    if(ModalContent !== false // Если не false
    && ModalContent.classList.contains('modal__content')) { // И содержит в себе класс modal__content => значит это точно модалка
      e.preventDefault(); // И первым действием мы отменяем переход по ссылке, т.к. запись у нас является якорем.
      //

      document.body.style.overflow = 'hidden'; // Уберём прокрутку body
      ModalContentBlock.append(...ModalContent.children); // Переместим контент в модалку
      Modal.style.display = 'block'; // покажем модалку.
    } else ModalContent = '';
  }

  // А тут закрытие модалки
  if(Modal.contains(e.target) && e.target !== ModalContentBlock && !ModalContentBlock.contains(e.target) // Тут проверяем произошёл ли клик вне контента
  || e.target.classList.contains('--modal__close')) { // А тут произошёл ли клик по кнопке
    document.body.style.overflow = ''; // Возвращаем скролл body
    Modal.style.display = ''; // Скрываем модалку // Тут лучше делать анимацю закрытие
    if(ModalContent) ModalContent.append(...ModalContentBlock.children); // Вовращаем контент обратно
  }
});
.modal__content-hidden {
  display: none;
}

.modal__overlay {
  display: none;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, .75);
  overflow: hidden auto;
  padding: 50px;
  box-sizing: border-box;
  position: fixed;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  z-index: 999;
}

.modal__wrap {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  min-width: 320px;
  width: 100%;
  max-width: 700px;
  min-height: 100%;
  margin: 0 auto;
}

.modal__block {
  display: block;
  width: 100%;
  min-height: 100px;
  border-radius: 5px;
  padding: 10px;
  box-sizing: border-box;
  background: #fff;
  position: relative;
}

.modal__btn-close {
  display: block;
  width: 20px;
  height: 20px;
  position: absolute;
  top: 0;
  right: 0;
  cursor: pointer;
}

.modal__btn-close::before,
.modal__btn-close::after {
  content: '';
  display: block;
  width: 16px;
  height: 2px;
  background: #000;
  position: absolute;
  left: 50%;
  top: 50%;
}

.modal__btn-close::before {
  transform: translate(-50%, -50%) rotate(45deg);
}

.modal__btn-close::after {
  transform: translate(-50%, -50%) rotate(-45deg);
}

.modal__btn-close:hover::before,
.modal__btn-close:hover::after {
  background: #f00;
}
<!-- Ссылка для открытия модалки -->
<a href="#photos">Открыть модалку с фото</a>

<!-- Тут будем прятать модалки, чтобы не клонировать их, а просто переносить -->
<div class="modal__content-hidden">
  <!-- Это основной контент модалки, его будем подставлять в "шаблон", шаблон будет вставляться по #id из ссылки открытия.
href="#photos" в нашем случае -->
  <div id="photos" class="modal__content">
    <img src="//picsum.photos/100/100?1" />
    <img src="//picsum.photos/100/100?2" />
    <img src="//picsum.photos/100/100?3" />
    <img src="//picsum.photos/100/100?4" />
    <img src="//picsum.photos/100/100?5" />
    <img src="//picsum.photos/100/100?6" />
    <img src="//picsum.photos/100/100?7" />
    <img src="//picsum.photos/100/100?8" />

    <div style="align-text:center">
      <button class="--modal__close">Закрыть окно</button>
    </div>
  </div>
</div>

<!-- "Шаблон" модалки, чтобы не плодить их -->
<div id="modal" class="modal__overlay">
  <div class="modal__wrap">
    <div class="modal__block">
      <!-- Кнопка закрытия по классу, чтобы вставлять свои в контент -->
      <div class="modal__btn-close --modal__close"></div>
    </div>
  </div>
</div>

→ Ссылка