js模仿淘宝放大镜

先看看效果

 

 

 

html:

  <div class="container">
    <div class="wrapper-container">
        <!-- 大图 -->
        <div class="wrapper"></div>

        <!-- 放大镜 -->
        <div class="min-box"></div>

        <!-- 大大图盒子 -->
        <div class="maxs"></div>
    </div>
    <!-- 缩略图 -->
    <ul class="slids"></ul>
  </div>

css:

*{
  padding: 0;
  margin: 0;
}
.container {
  width: 500px;
  margin:50px;
}
.wrapper-container {
  width: 500px;
  height: 500px;
  border: 1px solid #ccc;
  position: relative;
  cursor: move;
}
.min-box {
  border: 2px solid #ccc;
  background: rgba(255, 255, 255, .5);
  position: absolute;
  display: none;
}
.wrapper {
  width: 100%;
  height: 100%;
}
.maxs {
  width: 500px;
  height: 500px;
  border: 1px solid red;
  position: absolute;
  top:0;
  left: 105%;
  display: none;
  background-repeat: no-repeat;
}
.wrapper img {
  width: 100%;
}
.slids {
  width: 500px;
  height: 200px;
  font-size: 0;
}
.slids li{
  width: 20%;
  display: inline-block;
  padding: 2px;
  box-sizing: border-box;
}
.slids li img{
  width: 100%;
}

javascript:

 

function _$() {}

// 初始化
_$.prototype.init = function(){

  // 遍历输出缩略图
  this.forSlids()

  // 初始显示
  this.showImg(0)

  // 设置放大镜的宽高
  this.setMul()

  // 添加事件
  this.addEvent()
}

// 全局变量
_$.prototype.state = function(){
  return {
    imgLens: 5,  // 图片数量
    mul: 4, // 放大倍数
  }
}

// 获取元素
_$.prototype.getEl = function(){
  let wrapper = document.getElementsByClassName('wrapper')[0]
  let slide = document.getElementsByClassName('slids')[0]
  let minBox = document.getElementsByClassName('min-box')[0]
  let maxs = document.getElementsByClassName('maxs')[0]
  return {
    wrapper,
    slide,
    minBox,
    maxs
  }
}

// 遍历输出缩略图
_$.prototype.forSlids = function(){
  let { slide } = this.getEl()
  let { imgLens } = this.state()

  for(var i = 0; i < imgLens; i++){
    let li = document.createElement('li')
    let img = new Image()
    img.setAttribute('index', i)
    img.src = `./img/${i}.jpg`
    li.appendChild(img)
    slide.appendChild(li)
  }
}

// 添加事件
_$.prototype.addEvent = function(){
  let { slide, wrapper, minBox, maxs } = this.getEl()
  let { mul } = this.state()
  // 给li添加点击事件
  let _this = this

  // li的点击事件
  slide.onclick = function(e){
    let event = e || window.event
    let target = event.target
    if(target.nodeName.toLowerCase() == 'img'){
      let index = target.getAttribute('index')
      _this.showImg(index)
    }
  }

  // wrapper 的鼠标事件
  // 移入
  wrapper.parentNode.onmouseenter = function(e){
    minBox.style.display = 'block'
    maxs.style.display = 'block'
    
  }
  // 移出
  wrapper.parentNode.onmouseleave = function(){
    minBox.style.display = 'none'
    maxs.style.display = 'none'
  }
  // 移动
  wrapper.parentNode.onmousemove  = function(e){
    let ev = e || window.event,
        w  = minBox.clientWidth,
        h  = minBox.clientHeight,
        pw = minBox.parentNode.clientWidth,
        ph = minBox.parentNode.clientHeight,
        pl = minBox.parentNode.offsetLeft,
        pt = minBox.parentNode.offsetTop
        x  = ev.clientX - pl,
        y  = ev.clientY - pt,
        l  = x - (w / 2),
        t  = y - (h / 2)

    // 限制超出
    l = l <= 0 ? 0 : l
    t = t <= 0 ? 0 : t
    
    l = l >= pw - w ? pw - w : l
    t = t >= ph - h ? ph - h : t

    // 限制不让出框
    minBox.style.left = l + 'px'
    minBox.style.top = t + 'px'

    maxs.style.backgroundPosition = `-${l * mul}px -${t * mul}px`
  }
}

// 点击后显示大图
_$.prototype.showImg = function(index){
  let { wrapper, maxs } = this.getEl()
  let { mul } = this.state()
  wrapper.innerHTML = `<img src=${`./img/${index}.jpg`}></img>`

  maxs.style.background = `url(./img/${index}.jpg)`
  maxs.style.backgroundSize = `100` * mul + '%'
}

// 计算放大镜的宽高,并设置
_$.prototype.setMul = function(){
  let { minBox } = this.getEl()
  let { mul } = this.state()
  let w = minBox.parentNode.clientWidth
  let h = minBox.parentNode.clientHeight
  minBox.style.width = w / mul  + 'px'
  minBox.style.height = h / mul + 'px'
}

let $$ = new _$()
$$.init()

 

转载于:https://www.cnblogs.com/chefweb/p/11434127.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值