百度贴吧图片点击放大

直接在当前页面查看原图,可缩放,可多开,可拖拽

目前为 2017-01-17 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name 百度贴吧图片点击放大
  3. // @version 1.5.3.20170117
  4. // @description 直接在当前页面查看原图,可缩放,可多开,可拖拽
  5. // @include http://tieba.baidu.com/p/*
  6. // @grant GM_setValue
  7. // @grant GM_getValue
  8. // @grant GM_addStyle
  9. // @grant GM_registerMenuCommand
  10. // @author lliwhx
  11. // @copyright Copyright 2016-2017 lliwhx
  12. // @license MIT License
  13. // @namespace https://github.com/lliwhx/Userscripts
  14. // ==/UserScript==
  15.  
  16. //CSS
  17. 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}");
  18. //数据缓存
  19. var target,imageTarget,imageMouse,imageCount,imageButton,leftX,rightY,docResize,
  20. doc = document,
  21. docHeight = doc.documentElement.clientHeight-6,
  22. docWidth = doc.documentElement.clientWidth-6,
  23. parentElement = doc.getElementById("j_p_postlist"),
  24. mouseWheel = /Firefox/.test(navigator.userAgent)?"DOMMouseScroll":"mousewheel",
  25. definedEvent = GM_getValue("definedEvent","click,click,1,0,1").split(",");
  26. var imageEvent = {
  27. init:function(event){ //主事件
  28. var e=event,eTarget=e.target;
  29. if(e.button===0&&eTarget.className==="BDE_Image"){
  30. var imageSrc = eTarget.src.match(/[a-z0-9]+\.[a-zA-Z]{3,4}$/);
  31. if(!imageSrc) return false;
  32. var image = doc.createElement("img");
  33. image.classList.add("Tie_enlargeImage");
  34. image.src = "http://imgsrc.baidu.com/forum/pic/item/" + imageSrc[0];
  35. image.onload = function(){
  36. target = this;
  37. this.onload = null;
  38. imageTarget = [this.width,this.height];
  39. var ifHeight = imageTarget[1]>docHeight,ifX = 6,ifY = 6;
  40. if(ifHeight&&imageTarget[0]<docWidth){
  41. ifX = (docWidth-imageTarget[0])/2;
  42. }
  43. if(!ifHeight){
  44. ifX = (docWidth-imageTarget[0])/2;ifY = (docHeight-imageTarget[1])/2;
  45. }
  46. imageTarget.push(ifX,ifY);
  47. this.style.transform = "translate("+ifX+"px,"+ifY+"px)";
  48. parentDIV.appendChild(this);
  49. };
  50. image = null;
  51. }
  52. },
  53. StopPropagation:function(event){
  54. if(event.button===0&&event.target.className==="BDE_Image")event.stopPropagation();
  55. },
  56. Down:function(event){ //image鼠标down事件
  57. var e=event,eTarget=e.target;
  58. if (e.button!==0)return false;
  59. e.preventDefault();
  60. e.stopPropagation();
  61. if(target!==eTarget){
  62. target = eTarget;
  63. var reg = eTarget.style.transform.match(/[-0-9.]+/g);
  64. imageTarget = [eTarget.width,eTarget.height,parseFloat(reg[0]),parseFloat(reg[1])];
  65. }
  66. imageMouse = [e.clientX,e.clientY];
  67. imageCount = [imageTarget[2]-imageMouse[0],imageTarget[3]-imageMouse[1],6-imageTarget[0],6-imageTarget[1]];
  68. imageButton = true;
  69. doc.addEventListener("mousemove",imageEvent.Move);
  70. doc.addEventListener("mouseup",imageEvent.Up);
  71. },
  72. Move:function(event){
  73. var e=event;
  74. imageButton = false;
  75. leftX = e.clientX+imageCount[0];
  76. rightY = e.clientY+imageCount[1];
  77. if(leftX<imageCount[2]){ //左边界
  78. target.style.transform = "translate("+imageCount[2]+"px,"+rightY+"px)";
  79. return false;
  80. }
  81. if(leftX>docWidth){ //右边界
  82. target.style.transform = "translate("+docWidth+"px,"+rightY+"px)";
  83. return false;
  84. }
  85. if(rightY<imageCount[3]){ //上边界
  86. target.style.transform = "translate("+leftX+"px,"+imageCount[3]+"px)";
  87. return false;
  88. }
  89. if(rightY>docHeight){ //下边界
  90. target.style.transform = "translate("+leftX+"px,"+docHeight+"px)";
  91. return false;
  92. }
  93. target.style.transform = "translate("+leftX+"px,"+rightY+"px)";
  94. },
  95. Up:function(){
  96. if(!imageButton){
  97. imageTarget[2] = leftX;
  98. imageTarget[3] = rightY;
  99. leftX = null;
  100. rightY = null;
  101. }
  102. imageMouse = null;
  103. imageCount = null;
  104. doc.removeEventListener("mousemove",imageEvent.Move);
  105. doc.removeEventListener("mouseup",imageEvent.Up);
  106. },
  107. Close:function(event){
  108. event.stopPropagation();
  109. if(imageButton){
  110. parentDIV.removeChild(target);
  111. target = null;
  112. imageTarget = null;
  113. imageButton = null;
  114. }
  115. },
  116. Wheel:function(event){
  117. var e=event,eTarget=e.target;
  118. e.preventDefault();
  119. e.stopPropagation();
  120. if(target!==eTarget){
  121. target = eTarget;
  122. var reg = eTarget.style.transform.match(/[-0-9.]+/g);
  123. imageTarget = [eTarget.width,eTarget.height,parseFloat(reg[0]),parseFloat(reg[1])];
  124. }
  125. var wheelKey = definedEvent[3];
  126. if(wheelKey!=="0"){
  127. if((e.ctrlKey&&wheelKey==="1")||(e.altKey&&wheelKey==="2")||(e.shiftKey&&wheelKey==="3")){
  128. var eX = e.clientX,eY = e.clientY,
  129. eTargetWidth = imageTarget[0],eTargetHeight = imageTarget[1],
  130. ratioX = (eX-imageTarget[2])/eTargetWidth,ratioY = (eY-imageTarget[3])/eTargetHeight,
  131. wheelRatio = eTargetWidth+(e.wheelDelta||-e.detail*40)*definedEvent[4];
  132. imageTarget[0] = wheelRatio<150?150:wheelRatio;
  133. imageTarget[1] = imageTarget[0]*eTargetHeight/eTargetWidth;
  134. imageTarget[2] = eX-(imageTarget[0]*ratioX);
  135. imageTarget[3] = eY-(imageTarget[1]*ratioY);
  136. eTarget.width = imageTarget[0];
  137. eTarget.style.transform = "translate("+imageTarget[2]+"px,"+imageTarget[3]+"px)";
  138. return false;
  139. }
  140. }
  141. if(imageTarget[1]<docHeight)
  142. return false;
  143. var wheelY = imageTarget[3]+(-e.wheelDelta||e.detail*40)*definedEvent[2];
  144. if(wheelY>0||wheelY<docHeight-imageTarget[1]){
  145. wheelY = wheelY>0?6:docHeight-imageTarget[1];
  146. }
  147. imageTarget[3] = wheelY;
  148. eTarget.style.transform = "translate("+imageTarget[2]+"px,"+wheelY+"px)";
  149. }
  150. };
  151. //创建DIV父框架
  152. var parentDIV = doc.createElement("div");
  153. parentDIV.id = "Tie_enlargeImage_parentDIV";
  154. doc.body.appendChild(parentDIV);
  155. parentDIV = doc.getElementById("Tie_enlargeImage_parentDIV");
  156. //事件委托
  157. parentElement.addEventListener("click",imageEvent.StopPropagation,true);
  158. parentElement.addEventListener(definedEvent[0],imageEvent.init,true);
  159. parentDIV.addEventListener("mousedown",imageEvent.Down);
  160. parentDIV.addEventListener(definedEvent[1],imageEvent.Close);
  161. parentDIV.addEventListener(mouseWheel,imageEvent.Wheel);
  162. //清空缓存
  163. parentElement=null;
  164.  
  165. //自定义设置
  166. var userEvent = {
  167. init:function(){
  168. this.create();
  169. this.Event();
  170. },
  171. create:function(){
  172. var definedDIV = doc.createElement("div"); //创建自定义DIV框架
  173. definedDIV.id = "Tie_setValue_DIV";
  174. 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>";
  175. doc.body.appendChild(definedDIV);
  176. definedDIV = null;
  177. },
  178. Event:function(){
  179. var definedDIV = doc.getElementById("Tie_setValue_DIV"),
  180. parentElement = doc.getElementById("j_p_postlist"),
  181. setValue = doc.getElementsByName("Tie_setValue"),
  182. oldDefinedEvent = definedEvent.concat();
  183. for(var i=0;i<5;i++){
  184. setValue[i].value = oldDefinedEvent[i];
  185. }
  186. if(setValue[3].value==="0")setValue[4].style.visibility = "hidden";
  187. setValue[3].onchange = function(){
  188. setValue[4].style.visibility = this.value==="0"?"hidden":"visible";
  189. };
  190. doc.getElementById("Tie_setValue_a").onclick = function(){
  191. for(var i=0;i<5;i++){
  192. definedEvent[i] = setValue[i].value;
  193. }
  194. if(oldDefinedEvent[0]!==definedEvent[0]){
  195. parentElement.removeEventListener(oldDefinedEvent[0],imageEvent.init,true);
  196. parentElement.addEventListener(definedEvent[0],imageEvent.init,true);
  197. }
  198. if(oldDefinedEvent[1]!==definedEvent[1]){
  199. parentDIV.removeEventListener(oldDefinedEvent[1],imageEvent.Close);
  200. parentDIV.addEventListener(definedEvent[1],imageEvent.Close);
  201. }
  202. this.onclick = null;
  203. setValue[3].onchange = null;
  204. doc.body.removeChild(definedDIV);
  205. GM_setValue("definedEvent",definedEvent.toString());
  206. definedDIV = null;parentElement = null;setValue = null;oldDefinedEvent = null;
  207. };
  208. }
  209. };
  210. if(!GM_getValue("definedEvent")){
  211. userEvent.init();
  212. }
  213. GM_registerMenuCommand("自定义设置", function(){
  214. if(!doc.getElementById("Tie_setValue_DIV"))
  215. userEvent.init();
  216. });
  217.  
  218. window.addEventListener("resize", function(){
  219. if(typeof docResize!==undefined){
  220. clearTimeout(docResize);
  221. }
  222. docResize = setTimeout(function(){
  223. docHeight = doc.documentElement.clientHeight-6;
  224. docWidth = doc.documentElement.clientWidth-6;
  225. },334);
  226. });