限时优惠活动
亲爱的苦力吧用户,我们为了回馈新老用户一直以来的鼎力支持,即日起(2025-02-06至2025-03-06)凡是购买苦力吧VIP/充值K币的新老用户,都直接可获得买一送一的优惠馈赠。例如:购买一个月的VIP会员可直接获得两个月的VIP会员;充值100K币可直接获得200K币,以此类推!有任何疑问可联系在线客服,感谢各位用户对苦力吧素材的信任与厚爱,我们将一如既往的给大家上新更多优质的素材源码,祝大家开工大吉、工作顺利、心想事成。

js响应式弹出层图片全屏查看器

所属分类: 网页特效-弹出层    2024-01-31 11:46:56

js响应式弹出层图片全屏查看器 ie兼容6
 查看演示  登录后下载 温馨提示
登录会员即可享受免费下载
 我要建站

js响应式弹出层图片全屏查看器(共3个文件)

    • script.js
    • index.html
    • style.css

使用方法

// Inspired by Medium image zoom animation

let isOpen = false

let overlay

function createOverlay() {
  overlay = document.createElement('zoomable-image-overlay')
  document.body.appendChild(overlay)
}

class ZoomableImageOverlay extends HTMLElement {
  connectedCallback() {
    const style = document.createElement('style')
    style.textContent = ZoomableImageOverlay.style

    const shadow = this.attachShadow({ mode: 'open' })
    shadow.appendChild(style)
  }

  show() {
    this.setAttribute('shown', '')
  }

  hide() {
    this.removeAttribute('shown')
  }

  static get style() {
    return `
      :host {
        display: block;
        position: fixed;
        top: 0;
        left: 0;
        z-index: 1;
        background: rgba(255, 255, 255, 0.8);
        backdrop-filter: blur(10px);
        -webkit-backdrop-filter: blur(10px);
        width: 100%;
        height: 100%;
        opacity: 0;
        pointer-events: none;
        transition: 0.2s ease opacity;
      }

      :host([shown]) {
        cursor: zoom-out;
        opacity: 1;
        pointer-events: all;
      }
    `
  }
}

class ZoomableImage extends HTMLElement {
  isOpen = false
  connectedCallback() {
    this.image = this.querySelector('img')
    overlay.addEventListener('click', this.close.bind(this))
    window.addEventListener('scroll', this.close.bind(this))

    const style = document.createElement('style')
    style.textContent = ZoomableImage.style

    const shadow = this.attachShadow({ mode: 'open' })
    shadow.appendChild(style)
    shadow.appendChild(this.image)

    this.addEventListener('click', this.toggle.bind(this))
    window.addEventListener('resize', this.updateTransform.bind(this))
  }

  toggle() {
    if (isOpen) {
      this.close()
      return
    }
    isOpen = true
    this.isOpen = true
    overlay.show()
    this.setAttribute('open', '')
    this.image.style.zIndex = '2'
    this.originalImageRect = this.image.getBoundingClientRect()
    this.updateTransform()
  }

  updateTransform() {
    if (!this.isOpen) return
    const wrapperRect = this.getBoundingClientRect()
    const imageMaxWidth = this.image.naturalWidth
    const imageMaxHeight = this.image.naturalHeight
    const fullWidth = Math.min(window.innerWidth, imageMaxWidth)
    const fullHeight = Math.min(window.innerHeight, imageMaxHeight)
    const scaleX = fullWidth / this.originalImageRect.width
    const scaleY = fullHeight / this.originalImageRect.height
    const scale = Math.min(scaleX, scaleY)
    const translateX =
      -wrapperRect.left +
      (window.innerWidth - this.originalImageRect.width * scale) / 2
    const translateY =
      -wrapperRect.top +
      (window.innerHeight - this.originalImageRect.height * scale) / 2
    this.image.style.transform = `translate(${translateX}px, ${translateY}px) scale(${scale})`
  }

  close() {
    if (!this.isOpen) return
    this.isOpen = false
    isOpen = false
    this.removeAttribute('open')
    const onTransitionEnd = () => {
      this.image.style.zIndex = ''
      this.image.removeEventListener('transitionend', onTransitionEnd)
    }
    this.image.addEventListener('transitionend', onTransitionEnd)
    this.image.style.transform = 'none'
    overlay.hide()
  }

  static get style() {
    return `
      :host {
        display: flex;
        justify-content: flex-start;
        align-items: flex-start;
        cursor: zoom-in;
      }
      :host([open]) {
        cursor: zoom-out;
      }
      img {
        width: 100%;
        transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1);
        transform-origin: left top;
      }
    `
  }
}

createOverlay()

customElements.define('zoomable-image', ZoomableImage)
customElements.define('zoomable-image-overlay', ZoomableImageOverlay)

站长提示:
1. 苦力吧素材官方QQ群:950875342
2. 平台上所有素材资源,需注册登录会员方能正常下载。
3. 会员用户积极反馈网站、素材资源BUG或错误问题,每次奖励2K币
4. PHP源码类素材,如需协助安装调试,或你有二次开发需求,可联系苦力吧客服。
5. 付费素材资源,需充值后方能下载,如有任何疑问可直接联系苦力吧客服
相关资源 / 弹出层

bootstrap创建的响应式图片弹出层切换特效代码

一款图片弹出层左右切换插件,鼠标单击列表中一张图片,会触发弹出层一个带有左箭头和右箭头的图片弹出层,可点击左右箭头进行切换上一张或下一张图片,非常的简单实用。
  弹出层
 5319  0

原生js轻量级Toast通知信息插件

一款原生js脚本写的通知插件,超丝滑超酷的feel~大家可以试试!
  弹出层
 3333  0

bootstrap带有左右切换及放大动画的响应式图片弹出层

一款图片弹出层插件,点击缩略图即可弹出图片大图弹出层,可进行左右切换上一张或下一张图片,弹出层图片带有缓慢放大动画效果。
  弹出层
 3325  0

Bootstrap的轻量级弹出提示框插件

一款多功能弹出提示层插件,可自定义绑定单击事件或悬停触发,支持设置弹出方位以及弹出内容自定义。
  弹出层
 5218  0

评论数(0) 回复有机会获得K币 用户协议

^_^ 还没有人评论,快来抢个沙发!
😀
  • 😀
  • 😊
  • 😂
  • 😍
  • 😑
  • 😷
  • 😵
  • 😛
  • 😣
  • 😱
  • 😋
  • 😎
  • 😵
  • 😕
  • 😶
  • 😚
  • 😜
  • 😭
发表评论