UNPKG

@zhangqingcq/plug-r-qw

Version:

A JS lib base on Vue and View-design, you can achieve some complex functions with simple code after install this lib.

130 lines (115 loc) 3.81 kB
/** * @description全屏预览,原生dom技术 * @author ricky email:zhangqingcq@foxmail.com * @created 2020.05.08 */ import _ from 'lodash' import { t } from '../locale/index' let _index = 0 function domHandle(src, _i, imgEl, nameEl) { if (nameEl) { nameEl.innerHTML = src[_i]?.name ?? '' if (src[_i]?.name) { if (nameEl.classList.contains('hide')) { nameEl.classList.remove('hide') } } else if (!nameEl.classList.contains('hide')) { nameEl.classList.add('hide') } } if (imgEl) { imgEl.src = src[_i]?.src ?? src[_i] _index = _i } } function lastImg(arrSrc, src, imgEl, nameEl) { if (arrSrc) { let _i if (_index - 1 < 0) { _i = src.length - 1 } else { _i = _index - 1 } domHandle(src, _i, imgEl, nameEl) } } function nextImg(arrSrc, src, imgEl, nameEl) { if (arrSrc) { let _i if (_index + 1 > src.length - 1) { _i = 0 } else { _i = _index + 1 } domHandle(src, _i, imgEl, nameEl) } } /** * 全屏图片预览,支持单张图片预览,或多张图片轮播 * @param {string|Array<string>|Array<Record<string,any>>} src 图片地址,或者地址组成的数组,或包含地址src和名字name的对象组成的数组 * @param {number} index src为数组时默认展示图的索引值,默认:0 */ export default function fullScreenImgByDom(src, index = 0) { const T = (...arg) => t.apply(this, arg) const close = T('r.closePreview') const fullImg = T('r.fullImg') const last = T('r.last') const next = T('r.next') let notice let _src let _name _index = index const arrSrc = Array.isArray(src) if (arrSrc) { _src = src[_index]?.src ?? src[_index] _name = src[_index]?.name } else { _src = src } if (arrSrc && src.length > 1) { notice = `${last} : ←, ↑, A, W | ${next} : →, ↓, D, S | ${close} : Esc` } else { notice = `${close} : Esc` } let bodyEl = _.first(document.getElementsByTagName('body')) let child = document.createElement('div') child.setAttribute('class', 'fullScreenImgByDom') child.innerHTML = `<div class="previewInner"><div class="pageFBt left${ arrSrc && src.length > 1 ? '' : ' hide' }"><i class="ivu-icon ivu-icon-ios-arrow-back" title="${last}" ></i></div><img src="${_src}" alt="${fullImg}" ><div class="pageFBt right${ arrSrc && src.length > 1 ? '' : ' hide' }"><i class="ivu-icon ivu-icon-ios-arrow-forward" title="${next}" ></i></div><i class="ivu-icon ivu-icon-md-close" title="${close}" ></i></div><p class="pNotice cannotSelect">${notice}</p><p class="pName ${ _name ? '' : 'hide' }">${_name}</p>` function closeHandler() { let bb = _.first(document.getElementsByTagName('body')) if (bb) { bb.removeChild(child) } document.removeEventListener('keyup', keyupHandler) } child.querySelector('.ivu-icon-md-close').addEventListener('click', closeHandler) const imgEl = child.querySelector('img') const nameEl = child.querySelector('.pName') child.querySelector('.pageFBt.left').addEventListener('click', function () { lastImg(arrSrc, src, imgEl, nameEl) }) child.querySelector('.pageFBt.right').addEventListener('click', function () { nextImg(arrSrc, src, imgEl, nameEl) }) function keyupHandler(e) { if (e.keyCode === 37 || e.keyCode === 38 || e.keyCode === 87 || e.keyCode === 65) { //上、左、w、a lastImg(arrSrc, src, imgEl, nameEl) } else if (e.keyCode === 39 || e.keyCode === 40 || e.keyCode === 83 || e.keyCode === 68) { //下、右、s、d nextImg(arrSrc, src, imgEl, nameEl) } else if (e.keyCode === 27) { //Esc closeHandler() } } document.addEventListener('keyup', keyupHandler) bodyEl.appendChild(child) child.focus({ preventScroll: true }) }