- // ==UserScript==
- // @name 百度贴吧图片点击放大
- // @version 1.5.3.20170117
- // @description 直接在当前页面查看原图,可缩放,可多开,可拖拽
- // @include http://tieba.baidu.com/p/*
- // @grant GM_setValue
- // @grant GM_getValue
- // @grant GM_addStyle
- // @grant GM_registerMenuCommand
- // @author lliwhx
- // @copyright Copyright 2016-2017 lliwhx
- // @license MIT License
- // @namespace https://github.com/lliwhx/Userscripts
- // ==/UserScript==
-
- //CSS
- GM_addStyle("#Tie_enlargeImage_parentDIV{position:fixed;z-index:1005;top:0;left:0;}.Tie_enlargeImage{position:absolute;box-shadow:1px 1px 10px #000;cursor:url(http://cur.cursors-4u.net/others/oth-8/oth755.cur),progress;}.Tie_enlargeImage:hover{z-index:1006;}#Tie_setValue_DIV{position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;background:rgba(0,0,0,0.5);}.Tie_definedDIV{position:absolute;z-index:10000;background:#fff;top:50%;left:50%;transform:translate(-50%,-50%);}.Tie_definedDIV_title{border-bottom:1px solid #f2f2f5;line-height:40px;font-size:15px;font-weight:700;padding:0 0 0 15px;}.Tie_definedDIV_point{padding:20px 40px;}.Tie_groupSubtitle{font-weight:bold;}.Tie_configItem{line-height:30px;margin:0 20px}.Tie_configItem select{margin:0.5em}.Tie_definedDIV_SaveBtn{background-color:#f2f2f5;text-align:center;padding:10px 0;}.Tie_SaveBtn_a{background:#ff8140;color:#fff;font-size:15px;display:inline-block;padding:0 15px;line-height:35px;border-radius:3px;}.Tie_SaveBtn_a:hover{background:#f7671d}");
- //数据缓存
- var target,imageTarget,imageMouse,imageCount,imageButton,leftX,rightY,docResize,
- doc = document,
- docHeight = doc.documentElement.clientHeight-6,
- docWidth = doc.documentElement.clientWidth-6,
- parentElement = doc.getElementById("j_p_postlist"),
- mouseWheel = /Firefox/.test(navigator.userAgent)?"DOMMouseScroll":"mousewheel",
- definedEvent = GM_getValue("definedEvent","click,click,1,0,1").split(",");
- var imageEvent = {
- init:function(event){ //主事件
- var e=event,eTarget=e.target;
- if(e.button===0&&eTarget.className==="BDE_Image"){
- var imageSrc = eTarget.src.match(/[a-z0-9]+\.[a-zA-Z]{3,4}$/);
- if(!imageSrc) return false;
- var image = doc.createElement("img");
- image.classList.add("Tie_enlargeImage");
- image.src = "http://imgsrc.baidu.com/forum/pic/item/" + imageSrc[0];
- image.onload = function(){
- target = this;
- this.onload = null;
- imageTarget = [this.width,this.height];
- var ifHeight = imageTarget[1]>docHeight,ifX = 6,ifY = 6;
- if(ifHeight&&imageTarget[0]<docWidth){
- ifX = (docWidth-imageTarget[0])/2;
- }
- if(!ifHeight){
- ifX = (docWidth-imageTarget[0])/2;ifY = (docHeight-imageTarget[1])/2;
- }
- imageTarget.push(ifX,ifY);
- this.style.transform = "translate("+ifX+"px,"+ifY+"px)";
- parentDIV.appendChild(this);
- };
- image = null;
- }
- },
- StopPropagation:function(event){
- if(event.button===0&&event.target.className==="BDE_Image")event.stopPropagation();
- },
- Down:function(event){ //image鼠标down事件
- var e=event,eTarget=e.target;
- if (e.button!==0)return false;
- e.preventDefault();
- e.stopPropagation();
- if(target!==eTarget){
- target = eTarget;
- var reg = eTarget.style.transform.match(/[-0-9.]+/g);
- imageTarget = [eTarget.width,eTarget.height,parseFloat(reg[0]),parseFloat(reg[1])];
- }
- imageMouse = [e.clientX,e.clientY];
- imageCount = [imageTarget[2]-imageMouse[0],imageTarget[3]-imageMouse[1],6-imageTarget[0],6-imageTarget[1]];
- imageButton = true;
- doc.addEventListener("mousemove",imageEvent.Move);
- doc.addEventListener("mouseup",imageEvent.Up);
- },
- Move:function(event){
- var e=event;
- imageButton = false;
- leftX = e.clientX+imageCount[0];
- rightY = e.clientY+imageCount[1];
- if(leftX<imageCount[2]){ //左边界
- target.style.transform = "translate("+imageCount[2]+"px,"+rightY+"px)";
- return false;
- }
- if(leftX>docWidth){ //右边界
- target.style.transform = "translate("+docWidth+"px,"+rightY+"px)";
- return false;
- }
- if(rightY<imageCount[3]){ //上边界
- target.style.transform = "translate("+leftX+"px,"+imageCount[3]+"px)";
- return false;
- }
- if(rightY>docHeight){ //下边界
- target.style.transform = "translate("+leftX+"px,"+docHeight+"px)";
- return false;
- }
- target.style.transform = "translate("+leftX+"px,"+rightY+"px)";
- },
- Up:function(){
- if(!imageButton){
- imageTarget[2] = leftX;
- imageTarget[3] = rightY;
- leftX = null;
- rightY = null;
- }
- imageMouse = null;
- imageCount = null;
- doc.removeEventListener("mousemove",imageEvent.Move);
- doc.removeEventListener("mouseup",imageEvent.Up);
- },
- Close:function(event){
- event.stopPropagation();
- if(imageButton){
- parentDIV.removeChild(target);
- target = null;
- imageTarget = null;
- imageButton = null;
- }
- },
- Wheel:function(event){
- var e=event,eTarget=e.target;
- e.preventDefault();
- e.stopPropagation();
- if(target!==eTarget){
- target = eTarget;
- var reg = eTarget.style.transform.match(/[-0-9.]+/g);
- imageTarget = [eTarget.width,eTarget.height,parseFloat(reg[0]),parseFloat(reg[1])];
- }
- var wheelKey = definedEvent[3];
- if(wheelKey!=="0"){
- if((e.ctrlKey&&wheelKey==="1")||(e.altKey&&wheelKey==="2")||(e.shiftKey&&wheelKey==="3")){
- var eX = e.clientX,eY = e.clientY,
- eTargetWidth = imageTarget[0],eTargetHeight = imageTarget[1],
- ratioX = (eX-imageTarget[2])/eTargetWidth,ratioY = (eY-imageTarget[3])/eTargetHeight,
- wheelRatio = eTargetWidth+(e.wheelDelta||-e.detail*40)*definedEvent[4];
- imageTarget[0] = wheelRatio<150?150:wheelRatio;
- imageTarget[1] = imageTarget[0]*eTargetHeight/eTargetWidth;
- imageTarget[2] = eX-(imageTarget[0]*ratioX);
- imageTarget[3] = eY-(imageTarget[1]*ratioY);
- eTarget.width = imageTarget[0];
- eTarget.style.transform = "translate("+imageTarget[2]+"px,"+imageTarget[3]+"px)";
- return false;
- }
- }
- if(imageTarget[1]<docHeight)
- return false;
- var wheelY = imageTarget[3]+(-e.wheelDelta||e.detail*40)*definedEvent[2];
- if(wheelY>0||wheelY<docHeight-imageTarget[1]){
- wheelY = wheelY>0?6:docHeight-imageTarget[1];
- }
- imageTarget[3] = wheelY;
- eTarget.style.transform = "translate("+imageTarget[2]+"px,"+wheelY+"px)";
- }
- };
- //创建DIV父框架
- var parentDIV = doc.createElement("div");
- parentDIV.id = "Tie_enlargeImage_parentDIV";
- doc.body.appendChild(parentDIV);
- parentDIV = doc.getElementById("Tie_enlargeImage_parentDIV");
- //事件委托
- parentElement.addEventListener("click",imageEvent.StopPropagation,true);
- parentElement.addEventListener(definedEvent[0],imageEvent.init,true);
- parentDIV.addEventListener("mousedown",imageEvent.Down);
- parentDIV.addEventListener(definedEvent[1],imageEvent.Close);
- parentDIV.addEventListener(mouseWheel,imageEvent.Wheel);
- //清空缓存
- parentElement=null;
-
- //自定义设置
- var userEvent = {
- init:function(){
- this.create();
- this.Event();
- },
- create:function(){
- var definedDIV = doc.createElement("div"); //创建自定义DIV框架
- definedDIV.id = "Tie_setValue_DIV";
- definedDIV.innerHTML = "<div class='Tie_definedDIV'><div class='Tie_definedDIV_title'>自定义设置</div><div><div class='Tie_definedDIV_point'><div class='Tie_groupSubtitle'>请保证鼠标在图片上进行操作</div><div class='Tie_configItem'>默认支持鼠标左键拖拽图片</div><div class='Tie_configItem'>查看图片<select name='Tie_setValue'><option value='click'>单击</option><option value='dblclick'>双击</option></select></div><div class='Tie_configItem'>关闭图片<select name='Tie_setValue'><option value='click'>单击</option><option value='dblclick'>双击</option></select></div><div class='Tie_configItem'>上移图片<select name='Tie_setValue'><option value='1'>滚轮向上</option><option value='-1'>滚轮向下</option></select></div><div class='Tie_configItem'>缩放图片<select name='Tie_setValue'><option value='0'>关闭</option><option value='1'>Ctrl</option><option value='2'>Alt</option><option value='3'>Shift</option></select>+<select name='Tie_setValue'><option value='1'>滚轮向上放大</option><option value='-1'>滚轮向下放大</option></select></div></div></div><div class='Tie_definedDIV_SaveBtn'><a id='Tie_setValue_a' class='Tie_SaveBtn_a' href='javascript:void(0);'><span>确定</span></a></div></div>";
- doc.body.appendChild(definedDIV);
- definedDIV = null;
- },
- Event:function(){
- var definedDIV = doc.getElementById("Tie_setValue_DIV"),
- parentElement = doc.getElementById("j_p_postlist"),
- setValue = doc.getElementsByName("Tie_setValue"),
- oldDefinedEvent = definedEvent.concat();
- for(var i=0;i<5;i++){
- setValue[i].value = oldDefinedEvent[i];
- }
- if(setValue[3].value==="0")setValue[4].style.visibility = "hidden";
- setValue[3].onchange = function(){
- setValue[4].style.visibility = this.value==="0"?"hidden":"visible";
- };
- doc.getElementById("Tie_setValue_a").onclick = function(){
- for(var i=0;i<5;i++){
- definedEvent[i] = setValue[i].value;
- }
- if(oldDefinedEvent[0]!==definedEvent[0]){
- parentElement.removeEventListener(oldDefinedEvent[0],imageEvent.init,true);
- parentElement.addEventListener(definedEvent[0],imageEvent.init,true);
- }
- if(oldDefinedEvent[1]!==definedEvent[1]){
- parentDIV.removeEventListener(oldDefinedEvent[1],imageEvent.Close);
- parentDIV.addEventListener(definedEvent[1],imageEvent.Close);
- }
- this.onclick = null;
- setValue[3].onchange = null;
- doc.body.removeChild(definedDIV);
- GM_setValue("definedEvent",definedEvent.toString());
- definedDIV = null;parentElement = null;setValue = null;oldDefinedEvent = null;
- };
- }
- };
- if(!GM_getValue("definedEvent")){
- userEvent.init();
- }
- GM_registerMenuCommand("自定义设置", function(){
- if(!doc.getElementById("Tie_setValue_DIV"))
- userEvent.init();
- });
-
- window.addEventListener("resize", function(){
- if(typeof docResize!==undefined){
- clearTimeout(docResize);
- }
- docResize = setTimeout(function(){
- docHeight = doc.documentElement.clientHeight-6;
- docWidth = doc.documentElement.clientWidth-6;
- },334);
- });