目前支持:放大、缩小(含滚轮)、旋转、还原
/*** @说明信息* @date 2022/10/13 19:46:44* @初始化图片查看器* @date 2022/09/21 14:40:06* @id 唯一标识,指定id区域内的图片* @params 扩展参数,设置图片大小,目前只支持:案例:{ width: '100%', height: '100%' }* @ignoreImg 需要忽略的图片,需加在图片标签上,案例:<img src="" ignoreImg>************************************/export function photoInfo (id, params) {// 获取根节点const bodyDom = document.body// 获取指定ID范围内的图片列表const imgList = document.getElementById(id).getElementsByTagName('img')// 给图片设置点击事件if (imgList.length > 0) {let i = 0for (i; i < imgList.length; i++) {if (imgList[i].getAttribute('ignoreImg') === null) {imgList[i].onclick = function (ev) {// 禁止浏览器滚动bodyDom.style.overflow = 'hidden'// 添加底层遮罩const maskDom = document.createElement('div')maskDom.style.position = 'fixed'maskDom.style.top = '0'maskDom.style.width = '100%'maskDom.style.height = '100%'maskDom.style.zIndex = '99999990'maskDom.style.backgroundColor = 'rgba(64,70,76, .8)'bodyDom.appendChild(maskDom)// 顶部关闭区域const maskCloseDom = document.createElement('div')maskCloseDom.style.float = 'right'maskCloseDom.style.marginTop = '10px'maskCloseDom.style.marginRight = '10px'maskCloseDom.style.marginBottom = '20px'maskCloseDom.style.width = '110px'maskCloseDom.style.height = '40px'maskCloseDom.style.lineHeight = '40px'maskCloseDom.style.textAlign = 'center'maskCloseDom.style.zIndex = '99999991'maskCloseDom.innerText = '×'maskCloseDom.style.fontSize = '26px'maskCloseDom.style.color = '#fff'maskCloseDom.style.cursor = 'pointer'maskCloseDom.style.backgroundColor = 'rgba(50,55,59, .9)'maskDom.appendChild(maskCloseDom)maskCloseDom.onclick = function () {onCloseDom(maskDom, bodyDom)}// 中间图片区域const maskImgDivDom = document.createElement('div')maskImgDivDom.style.position = 'relative'maskImgDivDom.style.width = '80%'maskImgDivDom.style.height = '85%'maskImgDivDom.style.overflow = 'hidden'maskImgDivDom.style.margin = '70px auto auto auto'maskImgDivDom.style.zIndex = '99999991'maskDom.appendChild(maskImgDivDom)// 主区域图片console.log(params)const maskImgDom = document.createElement('img')maskImgDom.style.position = 'absolute'maskImgDom.style.top = '0'maskImgDom.style.left = '0'maskImgDom.style.right = '0'maskImgDom.style.margin = 'auto'if (params !== undefined && params.height !== undefined) {maskImgDom.style.height = params.height}if (params !== undefined && params.width !== undefined) {maskImgDom.style.width = params.width}maskImgDom.style.maxWidth = '100%'maskImgDom.style.maxHeight = '100%'maskImgDom.setAttribute('src', ev.srcElement.currentSrc)maskImgDom.setAttribute('draggable', true)maskImgDivDom.appendChild(maskImgDom)// 拖拽事件maskImgDivDom.onmousedown = function (e) {onPositionImg(e, maskImgDivDom, maskImgDom)}// 鼠标上下滚动事件let scrollFunc = function (e) {let evt = e || window.eventif (evt.wheelDelta) { // 兼容处理if (evt.wheelDelta > 0) { //当滑轮向上滚动时onLargeImg (maskImgDom)}if (evt.wheelDelta < 0) { //当滑轮向下滚动时onSmallImg(maskImgDom)}} else if (evt.detail) { //Firefox滑轮事件if (evt.detail > 0) { //当滑轮向上滚动时onLargeImg (maskImgDom)}if (evt.detail < 0) { //当滑轮向下滚动时onSmallImg(maskImgDom)}}}if (maskImgDivDom.addEventListener) {maskImgDivDom.addEventListener('DOMMouseScroll', scrollFunc, { passive: false });}maskImgDivDom.onmousewheel = scrollFunc// 底部操作区域const maskOperationDom = document.createElement('div')maskOperationDom.style.display = 'flex'maskOperationDom.style.justifyContent = 'space-between'maskOperationDom.style.width = '500px'maskOperationDom.style.height = '40px'maskOperationDom.style.lineHeight = '40px'maskOperationDom.style.margin = '10px auto auto auto'maskOperationDom.style.textAlign = 'center'maskOperationDom.style.zIndex = '99999991'maskDom.appendChild(maskOperationDom)// 放大const maskButtonLargeDom = document.createElement('div')maskButtonLargeDom.style.boxSizing = 'border-box'maskButtonLargeDom.style.padding = '0 40px'maskButtonLargeDom.style.cursor = 'pointer'maskButtonLargeDom.style.textAlign = 'center'maskButtonLargeDom.innerText = '放大'maskButtonLargeDom.style.color = '#fff'maskButtonLargeDom.style.backgroundColor = 'rgba(50,55,59, .9)'maskOperationDom.appendChild(maskButtonLargeDom)maskButtonLargeDom.onclick = function () {onLargeImg (maskImgDom)}// 缩小const maskButtonSmallDom = document.createElement('div')maskButtonSmallDom.style.boxSizing = 'border-box'maskButtonSmallDom.style.padding = '0 40px'maskButtonSmallDom.style.cursor = 'pointer'maskButtonSmallDom.style.textAlign = 'center'maskButtonSmallDom.innerText = '缩小'maskButtonSmallDom.style.color = '#fff'maskButtonSmallDom.style.backgroundColor = 'rgba(50,55,59, .9)'maskOperationDom.appendChild(maskButtonSmallDom)maskButtonSmallDom.onclick = function () {onSmallImg(maskImgDom)}// 还原const maskButtonReductionDom = document.createElement('div')maskButtonReductionDom.style.boxSizing = 'border-box'maskButtonReductionDom.style.padding = '0 40px'maskButtonReductionDom.style.cursor = 'pointer'maskButtonReductionDom.style.textAlign = 'center'maskButtonReductionDom.innerText = '还原'maskButtonReductionDom.style.color = '#fff'maskButtonReductionDom.style.backgroundColor = 'rgba(50,55,59, .9)'maskOperationDom.appendChild(maskButtonReductionDom)maskButtonReductionDom.onclick = function () {onReductionImg(maskImgDom)}// 旋转const maskButtonRotateDom = document.createElement('div')maskButtonRotateDom.style.boxSizing = 'border-box'maskButtonRotateDom.style.padding = '0 40px'maskButtonRotateDom.style.cursor = 'pointer'maskButtonRotateDom.style.textAlign = 'center'maskButtonRotateDom.innerText = '旋转'maskButtonRotateDom.style.color = '#fff'maskButtonRotateDom.style.backgroundColor = 'rgba(50,55,59, .9)'maskOperationDom.appendChild(maskButtonRotateDom)maskButtonRotateDom.onclick = function () {onRotateImg(maskImgDom)}}}}}
}let scaleIndex = 1 // 放大的值
let rotateIndex = 0 // 旋转的值
let offsetX, offsetY // 拖动的值
let canMove = false // 是否可拖拽// 放大
function onLargeImg (item) {scaleIndex += 0.2item.style.transform = 'rotate('+rotateIndex+'deg)' + 'scale('+scaleIndex+')'
}// 缩小
function onSmallImg (item) {if (scaleIndex > 0.3) {scaleIndex -= 0.2item.style.transform = 'rotate('+rotateIndex+'deg)' + 'scale('+scaleIndex+')'}
}// 还原
function onReductionImg (item) {scaleIndex = 1item.style.transform = 'scale('+scaleIndex+')'rotateIndex = 0item.style.transform = 'rotate('+rotateIndex+'deg)'offsetX = 0offsetY = 0canMove = falseitem.style.top = '0'item.style.left = '0'item.style.right = '0'
}// 旋转
function onRotateImg (item) {rotateIndex += 90item.style.transform = 'rotate('+rotateIndex+'deg)' + 'scale('+scaleIndex+')'
}// 关闭
function onCloseDom (item, bodyDom) {scaleIndex = 1rotateIndex = 0item.remove()bodyDom.style.overflow = ''
}// 记录位置
function onPositionImg (e, itemDiv, itemImg) {let evt = e || eventcanMove = trueoffsetX = evt.clientX - itemImg.offsetLeftoffsetY = evt.clientY - itemImg.offsetTopdocument.onmousemove = function (e) {onDragImg (e, itemImg)}document.onmouseup = function () {onDragCloseImg ()}
}// 拖拽
function onDragImg (e, item) {let evt = e || eventif (canMove === true) {evt.preventDefault()let left = evt.clientX - offsetXlet top = evt.clientY - offsetYitem.style.right = ''item.style.left = left + "px"item.style.top = top + "px"}
}// 鼠标抬起关闭拖拽
function onDragCloseImg () {canMove = falsedocument.onmousemove = null
}
gitee仓库:myphoto-layer: 轻量级图片查看器
博客:我的个人日志
效果图