Создание собственного элемента

https://yocton.ru/html-elements/global-attributes/slot

by yocton

HTML

<script src="//code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<link rel="stylesheet" href="//stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script src="//stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<!DOCTYPE html>
<html lang="ru">

  <head>
    <meta charset="utf-8">
    <title>Модальное окно</title>
  </head>

  <body>
    <template id="modal-template">
  <style>
      :host {
        display: block;
      }

      .modal {
        position: relative;
        z-index: 1;
        top: auto;
        right: auto;
        bottom: auto;
        left: auto;
        display: block;
        padding: 1em;
        background: #fff;
        border: 1px solid #ccc;
      }
  </style>
  <div class="modal" tabindex="-1" role="dialog">
    <div class="modal-dialog" role="document">
      <div class="modal-content">
        <div class="modal-header">
          <slot name="modal-header"></slot>
        </div>
        
        <div class="modal-body">
          <slot name="modal-body"></slot>
        </div>
        
        <div class="modal-footer">
          <slot name="modal-footer"></slot>
        </div>
      </div>
    </div>
  </div>
</template>

    <div id="app">
    <!-- Используем наш новый элемент -->
      <ui-modal>
        <div slot="modal-header">
          <h5 class="modal-title">Заголовок для модального окна</h5>
          <button type="button" class="close" data-dismiss="modal" aria-label="Close">
        <span aria-hidden="true">&times;</span>
      </button>
        </div>

        <div slot="modal-body">
          <p>Здесь находится содержимое модального окна.</p>
        </div>

        <div slot="modal-footer">
          <button type="button" class="btn btn-primary">Сохранить</button>
          <button...

CSS

body {
  padding: 3em;
  background: #fff;
}

JavaScript

class Modal extends HTMLElement {
  static get is() {
    return 'ui-modal'
  }

  constructor() {
    super();
    var template = document.getElementById('modal-template').content;
    var shadowRoot = this.
    attachShadow({
        mode: 'open'
      })
      .appendChild(template.cloneNode(true));
  }
}
customElements.define(Modal.is, Modal);