画像ビューア(プレビュー)

効果

効果### 達成

一連の考え

  • 親コンテナとその中に 2 つのサブコンテナがあります。2 つのサブコンテナはイメージ リスト コンテナとクリック後のプレビュー コンテナです。
  • プレビュー コンテナにはマスク レイヤと画像ラベルが必要です。マスク レイヤは特定の画像をクリックすると表示されます
  • マスク レイヤの左右に切り替えボタンがあります (ただし、境界条件に注意してください。最初のボタンには左矢印がなく、最後のボタンには右矢印がありません)。切り替えるときは、現在のパスを置き換えます。 image とターゲット画像のパス。
  • 呼び出すことができるイベントをカスタマイズしpreview、このイベントをリッスンして、トリガーされるかどうかを制御します。
  • 画像のパスを独自のものに置き換えます。

コード

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>图片查看器</title>
  <style>
    body {
    
    
      padding: 0;
      margin: 0;
      position: relative;
      height: 100vh;
    }

    ul {
    
    
      list-style: none;
      display: flex;
      flex-wrap: wrap;
      padding: 0;
      margin: 0px;
      height: 100%;
      width: 100%;
    }

    ul img {
    
    
      width: 100px;
    }

    #mask {
    
    
      height: 100%;
      width: 100%;
      background-color: rgba(1, 1, 1, 0.5);
      text-align: center;
      position: absolute;
      top: 0;
      left: 0;
      display: none;
    }

    .preview {
    
    
      display: block;
      /* display: inline-block; */
      color: white;
      font-size: 300%;
      position: absolute;
      top: 50vh;
      left: 0;
      float: left;

    }

    .next {
    
    
      display: block;
      /* display: inline-block; */
      color: white;
      font-size: 300%;
      position: absolute;
      top: 50vh;
      right: 0;
      float: right;
    }
  </style>
</head>

<body>
  <ul id="list">
    <li><img src="../../pictures/mmexport1649928066941.jpg" alt=""></li>
    <li><img src="../../pictures/mmexport1649927142313.jpg" alt=""></li>
    <li><img src="../../pictures/mmexport1649927128631.jpg" alt=""></li>
    <li><img src="../../pictures/mmexport1649927124536.jpg" alt=""></li>
    <li><img src="../../pictures/mmexport1649927131843.jpg" alt=""></li>
  </ul>
  <div id="mask">
    <span class="preview">
      < </span>
        <img src="" alt="" width="300px">
        <span class="next"> > </span>
  </div>
</body>
<script type="text/javascript">
  const imgList = document.getElementById('list');
  let imgs = document.querySelectorAll('ul img');
  function setPreviewBehavior(subjects) {
    
    
    let previewEvent = document.createEvent('Event');
    previewEvent.initEvent('preview', true, true);
    if (!Array.isArray(subjects)) {
    
    
      if (subjects.length) subjects = Array.from(subjects);
      else subjects = [subjects];
    }
    previewEvent.previewTarget = subjects.map(evt => {
    
    
      return evt.src;
    });
    subjects.forEach(subject => {
    
    
      subject.preview = function () {
    
    
        subject.dispatchEvent(previewEvent);
      }
    });
  }
  setPreviewBehavior(imgs);
  const previewMask = document.getElementById('mask');
  let previewImage = previewMask.querySelector('img');
  let previewPrevious = previewMask.querySelector('.preview');
  let previewNext = previewMask.querySelector('.next');
  previewMask.addEventListener('click', evt => {
    
    
    if (evt.target === previewMask) {
    
    
      evt.target.style.display = 'none';
    }
  });
  imgList.addEventListener('click', evt => {
    
    
    if (evt.target.preview) {
    
    
      evt.target.preview();
    }
  });
  imgList.addEventListener('preview', evt => {
    
    
    const src = evt.target.src,
      imgs = evt.previewTarget;
    previewMask.style.display = 'block';
    previewImage.src = src;
    let idx = imgs.indexOf(src);
    function updateButton(idx) {
    
    
      previewPrevious.style.display = idx ? 'block' : 'none';
      previewNext.style.display = idx < imgs.length - 1 ? 'block' : 'none';
    }
    updateButton(idx);
    previewPrevious.onclick = function (evt) {
    
    
      previewImage.src = imgs[--idx];
      updateButton(idx);
    };
    previewNext.onclick = function (evt) {
    
    
      previewImage.src = imgs[++idx];
      updateButton(idx);
    }
  })
</script>

</html>

おすすめ

転載: blog.csdn.net/m0_52276756/article/details/131069929