// ==UserScript==
// @name Image Preview
// @namespace https://mp.weixin.qq.com/s/*
// @version 0.2
// @description preview any image
// @author You
// @match https://mp.weixin.qq.com/s/*
// @match https://xie.infoq.cn/article/*
// @require https://cdn.jsdelivr.net/npm/vue@2.6.11
// @grant none
// @downloadURL none
// ==/UserScript==
(function () {
// 图片预览组件
Vue.component('img-preview', {
props: {
// 是否显示
isShow: {
type: Boolean,
required: true,
default: false,
},
// 图片url
picUrl: {
type: String,
default: '',
},
},
template: `
`,
methods: {
// 固定body不让其滚动
fixedBody() {
document.body.style.overflow = 'hidden'
},
// 释放body,让其滚动
looseBody() {
document.body.style.overflow = 'auto'
},
},
watch: {
isShow(val) {
if (val) {
// 展示
this.fixedBody()
} else {
this.looseBody()
}
},
},
})
// 插入DOM元素
var imgPreviewContainer = document.createElement('div')
imgPreviewContainer.setAttribute('class', 'img-preview-container')
document.body.appendChild(imgPreviewContainer)
addStyle()
// 挂载
const vm = new Vue({
el: imgPreviewContainer,
data: {
picUrl: '',
isShowImgPreview: false,
},
template: '',
created() {
// 冒泡阶段处理,避免有些网站把事件拦截掉了
document.addEventListener('click', (ev) => {
const img = ev.target
const { nodeName } = img
if (nodeName === 'IMG') {
// 图片
this.picUrl = img.getAttribute('src')
this.isShowImgPreview = true
}
}, true)
},
})
// 添加样式
function addStyle() {
const style = document.createElement('style')
style.innerHTML = `
.img-view-wrapper {
display: flex;
justify-content: center;
align-items: center;
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
overflow: auto;
z-index: 99999 !important;
background: rgba(0, 0, 0, 0.6);
}
.img-view {
cursor: zoom-out;
max-width: 100%;
max-height: 100%;
}
.scale-enter-active,
.scale-leave-active {
transition: all 0.4s;
}
.scale-enter,
.scale-leave-to {
transform: scale(0);
}`
document.head.appendChild(style)
}
})()