先看看效果
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()