Overlay original image size on hover on all websites

Displays the original dimensions of a hover image on all websites.

当前为 2025-02-12 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Overlay original image size on hover on all websites
  3. // @description Displays the original dimensions of a hover image on all websites.
  4. // @name:af Oorspronklike beeldgrootte oorle op alle webwerwe
  5. // @description:af Toon die oorspronklike afmetings van 'n zweefbeeld op alle webwerwe.
  6. // @name:ar عرض أبعاد الصورة الأصلية عند التحويم على جميع المواقع الإلكترونية
  7. // @description:ar يعرض أبعاد الصورة الأصلية عند التحويم على جميع المواقع الإلكترونية.
  8. // @name:az Bütün veb saytlarda üzərində keçid zamanı orijinal şəkil ölçüsü
  9. // @description:az Bütün veb saytlarda üzərində keçid zamanı orijinal şəkil ölçüsünü göstərir.
  10. // @name:bg Наслој оригиналне величине слике приликом левог приказа на свим веб локацијама
  11. // @description:bg Прикажите оригиналне димензије слике приликом левог приказа на свим веб локацијама.
  12. // @name:bn সমস্ত ওয়েবসাইটে হভার ছবির মৌলিক মাপ ওভারলে
  13. // @description:bn সমস্ত ওয়েবসাইটে হভার ছবির মৌলিক মাপ প্রদর্শন করে।
  14. // @name:ca Superposició de la mida original de la imatge en el passar el ratolí en tots els llocs web
  15. // @description:ca Mostra les dimensions originals d'una imatge en passar el ratolí en tots els llocs web.
  16. // @name:cs Překrytí původní velikosti obrázku po najetí na všechny webové stránky
  17. // @description:cs Zobrazí původní rozměry obrázku po najetí na všechny webové stránky.
  18. // @name:da Overlay af original billedstørrelse ved hover på alle websteder
  19. // @description:da Vis original størrelse af et billede ved hover på alle websteder.
  20. // @name:de Originalgröße der Bildüberlagerung beim Hover auf allen Websites
  21. // @description:de Zeigt die Originalabmessungen eines Bildes beim Hover auf allen Websites an.
  22. // @name:el Επικάλυψη πρωτότυπου μεγέθους εικόνας κατά την αιωρούμενη κατάσταση σε όλους τους ιστότοπους
  23. // @description:el Εμφανίζει τις πρωτότυπες διαστάσεις μιας εικόνας κατά την αιωρούμενη κατάσταση σε όλους τους ιστότοπους.
  24. // @name:eo Overlay de la originala bildogrando dum muso super ĉiuj retejoj
  25. // @description:eo Montras la originalajn dimensiojn de hovrigi bildo sur ĉiuj retejoj.
  26. // @name:es Superposición del tamaño original de la imagen al pasar el cursor en todos los sitios web
  27. // @description:es Muestra las dimensiones originales de una imagen al pasar el cursor en todos los sitios web.
  28. // @name:fi Päällekkäinen alkuperäinen kuvakoko hoverilla kaikilla verkkosivustoilla
  29. // @description:fi Näyttää alkuperäiset kuvakoot hoverilla kaikilla verkkosivustoilla.
  30. // @name:fr Incrustation de la taille de l'image originale au survol sur tous les sites web
  31. // @description:fr Affiche les dimensions d'origine d'une image en survol sur tous les sites web.
  32. // @name:gl Superposición do tamaño orixinal da imaxe ao pasar o rato en todos os sitios web
  33. // @description:gl Amosa as dimensións orixinais dunha imaxe ao pasar o rato en todos os sitios web.
  34. // @name:he חיבור גודל תמונה מקורי בעת העברה מעל לכל אתרי האינטרנט
  35. // @description:he מציג את הממדים המקוריים של תמונה בעת העברת עכבר מעל לכל אתרי האינטרנט.
  36. // @name:hi सभी वेबसाइटों पर होवर पर मूल छवि आकार ओवरले
  37. // @description:hi सभी वेबसाइटों पर होवर पर छवि के मूल आकार को दिखाता है।
  38. // @name:hu Eredeti képméret átlátszása az egérrel történő lebegés közben az összes webhelyen
  39. // @description:hu Az eredeti kép méreteinek megjelenítése az egérrel történő lebegés közben az összes webhelyen.
  40. // @name:id Overlay ukuran asli gambar saat mengarahkan kursor di semua situs web
  41. // @description:id Menampilkan dimensi asli gambar saat mengarahkan kursor di semua situs web.
  42. // @name:is Yfirbragð upprunalegs myndastærðar á sveiflum á öllum vefsíðum
  43. // @description:is Sýnir upprunalegar málmar á mynd á sveiflum á öllum vefsíðum.
  44. // @name:it Sovrapposizione delle dimensioni originali dell'immagine al passaggio del mouse su tutti i siti web
  45. // @description:it Visualizza le dimensioni originali di un'immagine al passaggio del mouse su tutti i siti web.
  46. // @name:ja すべてのウェブサイトでホバー画像の元のサイズをオーバーレイ表示
  47. // @description:ja すべてのウェブサイトでホバー画像の元の寸法を表示します。
  48. // @name:km បង្ហាញទំហំរូបភាពដែលបង្ហាញឡើងលើលំនាំដើមនៅលើវេបសាយទាំងអស់
  49. // @description:km បង្ហាញទំហំដែលមាននៅលើរូបភាពដែលបង្ហាញឡើងលើលំនាំដើមនៅលើវេបសាយទាំងអស់។
  50. // @name:ko 모든 웹 사이트에서 이미지 원래 크기 오버레이 표시
  51. // @description:ko 모든 웹 사이트에서 이미지를 가리킬 때 원래 크기를 표시합니다.
  52. // @name:ms Overlay saiz asal imej semasa hover di semua laman web
  53. // @description:ms Papar dimensi asal imej semasa hover di semua laman web.
  54. // @name:mt Overlay ta 'dimensioni oriġinali tal-immaġni fuq hover fuq siti kollha tal-web
  55. // @description:mt Juri d-dimensjonijiet oriġinali ta 'immaġni fuq hover fuq siti kollha tal-web.
  56. // @name:nb Overlegg av original bildestørrelse ved svev på alle nettsteder
  57. // @description:nb Viser original størrelse av et bilde når du svever over det på alle nettsteder.
  58. // @name:nl Overlay originele afbeeldingsgrootte bij zweven op alle websites
  59. // @description:nl Toont de originele afmetingen van een zwevende afbeelding op alle websites.
  60. // @name:pl Nakładka oryginalnego rozmiaru obrazu po najechaniu na wszystkie strony internetowe
  61. // @description:pl Wyświetla oryginalne wymiary obrazka po najechaniu na wszystkie strony internetowe.
  62. // @name:pt Sobreposição do tamanho original da imagem ao passar o mouse em todos os sites
  63. // @description:pt Exibe as dimensões originais de uma imagem ao passar o mouse em todos os sites.
  64. // @name:ro Suprapunere dimensiune originală imagine la survol pe toate site-urile web
  65. // @description:ro Afișează dimensiunile originale ale unei imagini la survol pe toate site-urile web.
  66. // @name:ru Отображение оригинального размера изображения при наведении на всех веб-сайтах
  67. // @description:ru Отображает оригинальные размеры изображения при наведении курсора на всех веб-сайтах.
  68. // @name:sr Преклоп оригиналне величине слике приликом левог приказа на свим веб локацијама
  69. // @description:sr Приказује оригиналне димензије слике приликом левог приказа на свим веб локацијама.
  70. // @name:sv Överlagring av originalbildstorlek vid svävning på alla webbplatser
  71. // @description:sv Visar originalstorlek på en bild när du svävar över den på alla webbplatser.
  72. // @name:th แสดงขนาดภาพต้นฉบับเมื่อโฮฟเวอร์บนเว็บไซต์ทั้งหมด
  73. // @description:th แสดงขนาดต้นฉบับของภาพเมื่อโฮฟเวอร์บนเว็บไซต์ทั้งหมด
  74. // @name:tl Overlay ng orihinal na sukat ng imahe sa hover sa lahat ng mga website
  75. // @description:tl Nagpapakita ng orihinal na sukat ng imahe sa hover sa lahat ng mga website.
  76. // @name:tr Tüm web sitelerinde üzerine gelindiğinde orijinal resim boyutunu göster
  77. // @description:tr Tüm web sitelerinde üzerine gelindiğinde resmin orijinal boyutlarını gösterir.
  78. // @name:uk Налагодження оригінального розміру зображення при наведенні на всі веб-сайти
  79. // @description:uk Відображає оригінальні розміри зображення при наведенні на всі веб-сайти.
  80. // @name:vi Hiển thị kích thước hình ảnh gốc khi di chuột qua trên tất cả các trang web
  81. // @description:vi Hiển thị kích thước gốc của hình ảnh khi di chuột qua trên tất cả các trang web.
  82. // @name:zh 鼠标悬停时在所有网站上显示原始图像尺寸
  83. // @description:zh 在所有网站上显示悬停图像的原始尺寸。
  84. // @match *://*/*
  85. // @exclude *://beeg.com/*
  86. // @exclude *://kindroid.ai/*
  87. // @exclude *://*.mage.space/*
  88. // @exclude *://*.manyvids.com/*
  89. // @exclude *://*.xvideos.com/*
  90. // @exclude https://www.google.com/recaptcha/*
  91. // @icon data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' fill='white'%3E%3Cpath d='M.2 468.9C2.7 493.1 23.1 512 48 512l96 0 320 0c26.5 0 48-21.5 48-48l0-96c0-26.5-21.5-48-48-48l-48 0 0 80c0 8.8-7.2 16-16 16s-16-7.2-16-16l0-80-64 0 0 80c0 8.8-7.2 16-16 16s-16-7.2-16-16l0-80-64 0 0 80c0 8.8-7.2 16-16 16s-16-7.2-16-16l0-80-80 0c-8.8 0-16-7.2-16-16s7.2-16 16-16l80 0 0-64-80 0c-8.8 0-16-7.2-16-16s7.2-16 16-16l80 0 0-64-80 0c-8.8 0-16-7.2-16-16s7.2-16 16-16l80 0 0-48c0-26.5-21.5-48-48-48L48 0C21.5 0 0 21.5 0 48L0 368l0 96c0 1.7 .1 3.3 .2 4.9z'/%3E%3C/svg%3E
  92. // @version 1.0.8
  93. // @author BreatFR
  94. // @copyright 2024, BreatFR (https://breat.fr)
  95. // @grant none
  96. // @namespace https://gitlab.com/breatfr
  97. // @homepageURL https://gitlab.com/breatfr/overlay-original-image-size-on-hover-on-all-websites
  98. // @supportURL https://discord.gg/Q8KSHzdBxs
  99. // @license AGPL-3.0-or-later; https://www.gnu.org/licenses/agpl-3.0.txt
  100. // ==/UserScript==
  101.  
  102. (() => {
  103. "use strict";
  104.  
  105. // Styles
  106. const toolbarStyles = {
  107. alignItems: "center",
  108. backdropFilter: "blur(1rem)",
  109. backgroundColor: "rgba(0, 0, 0, 0.4)",
  110. borderRadius: "5rem",
  111. color: "white",
  112. display: "none",
  113. fontSize: "1rem",
  114. margin: "0 20px",
  115. padding: "0.5rem 0.75rem",
  116. pointerEvents: "none",
  117. position: "absolute",
  118. textAlign: "center",
  119. whiteSpace: "nowrap !important",
  120. width: "max-content",
  121. wordBreak: "keep-all !important",
  122. zIndex: 1000
  123. };
  124.  
  125. const innerToolbarStyles = {
  126. display: "flex",
  127. width: "100%",
  128. justifyContent: "flex-start"
  129. };
  130.  
  131. // Create toolbar element
  132. const toolbar = document.createElement("div");
  133. Object.assign(toolbar.style, toolbarStyles);
  134. toolbar.style.display = "flex";
  135. console.log("Toolbar created:", toolbar);
  136.  
  137. // Create inner toolbar element
  138. const innerToolbar = document.createElement("div");
  139. Object.assign(innerToolbar.style, innerToolbarStyles);
  140. toolbar.appendChild(innerToolbar);
  141.  
  142. // Create image size label
  143. const imageSizeLabel = document.createElement("span");
  144. innerToolbar.appendChild(imageSizeLabel);
  145.  
  146. // Append the toolbar to the body once
  147. document.body.appendChild(toolbar);
  148. console.log("Toolbar appended to body");
  149.  
  150. const findImage = (element) => {
  151. if (element.tagName === "IMG") {
  152. return element;
  153. }
  154. return null;
  155. };
  156.  
  157. const showImageSize = (img) => {
  158. console.log("Showing image size for:", img);
  159. if (img.src.endsWith(".svg")) {
  160. // For SVG images, use the width and height attributes
  161. imageSizeLabel.textContent = `${img.naturalWidth} × ${img.naturalHeight}`;
  162. toolbar.style.display = "flex";
  163. updateToolbarPosition(img);
  164. } else {
  165. const originImage = new Image();
  166. originImage.onload = () => {
  167. imageSizeLabel.textContent = `${originImage.naturalWidth} × ${originImage.naturalHeight}`;
  168. toolbar.style.display = "flex";
  169. updateToolbarPosition(img);
  170. };
  171. originImage.src = img.src.replace(/([?&])name=([^&]*)/, "$1name=orig");
  172. }
  173. };
  174.  
  175. let debounceTimeout;
  176.  
  177. const debounce = (func, delay) => {
  178. clearTimeout(debounceTimeout);
  179. debounceTimeout = setTimeout(func, delay);
  180. };
  181.  
  182. const updateToolbarPosition = (img) => {
  183. requestAnimationFrame(() => {
  184. // Créer un élément de mesure invisible
  185. const measurementDiv = document.createElement("div");
  186. measurementDiv.style.position = "absolute";
  187. measurementDiv.style.visibility = "hidden";
  188. measurementDiv.style.width = `${img.naturalWidth}px`;
  189. measurementDiv.style.height = `${img.naturalHeight}px`;
  190. measurementDiv.style.maskImage = "none";
  191. measurementDiv.style.webkitMaskImage = "none";
  192. document.body.appendChild(measurementDiv);
  193.  
  194. // Utiliser les dimensions de l'élément de mesure
  195. const rect = measurementDiv.getBoundingClientRect();
  196. const windowWidth = window.innerWidth;
  197.  
  198. // Supprimer l'élément de mesure après utilisation
  199. document.body.removeChild(measurementDiv);
  200.  
  201. // Default positioning
  202. let left = rect.left + window.scrollX;
  203. innerToolbar.style.flexDirection = "row";
  204.  
  205. // Check if the toolbar will overflow the right edge of the screen
  206. if (left + toolbar.offsetWidth > windowWidth) {
  207. // Switch to right alignment
  208. left = rect.right + window.scrollX - toolbar.offsetWidth;
  209. innerToolbar.style.flexDirection = "row-reverse";
  210. }
  211.  
  212. toolbar.style.left = `${left}px`;
  213. toolbar.style.top = `${rect.top + window.scrollY + 16}px`;
  214. toolbar.style.display = "flex";
  215. });
  216. };
  217.  
  218. document.body.addEventListener("mousemove", (event) => {
  219. const img = findImage(event.target);
  220. if (img) {
  221. debounce(() => updateToolbarPosition(img), 50); // Debounce with a 50ms delay
  222. }
  223. });
  224.  
  225.  
  226. const hideImageSize = () => {
  227. console.log("Hiding image size");
  228. toolbar.style.display = "none";
  229. };
  230.  
  231. document.body.addEventListener("mouseover", (event) => {
  232. const img = findImage(event.target);
  233. if (img) {
  234. showImageSize(img);
  235. }
  236. });
  237.  
  238. document.body.addEventListener("mouseout", (event) => {
  239. const img = findImage(event.target);
  240. if (img && !toolbar.contains(event.relatedTarget)) {
  241. hideImageSize();
  242. }
  243. });
  244.  
  245. document.body.addEventListener("mousemove", (event) => {
  246. const img = findImage(event.target);
  247. if (img) {
  248. updateToolbarPosition(img);
  249. }
  250. });
  251. })();
  252. // ==UserScript==
  253. // @name Overlay original image size on hover on all websites
  254. // @description Displays the original dimensions of a hover image on all websites.
  255. // @name:af Oorspronklike beeldgrootte oorle op alle webwerwe
  256. // @description:af Toon die oorspronklike afmetings van 'n zweefbeeld op alle webwerwe.
  257. // @name:ar عرض أبعاد الصورة الأصلية عند التحويم على جميع المواقع الإلكترونية
  258. // @description:ar يعرض أبعاد الصورة الأصلية عند التحويم على جميع المواقع الإلكترونية.
  259. // @name:az Bütün veb saytlarda üzərində keçid zamanı orijinal şəkil ölçüsü
  260. // @description:az Bütün veb saytlarda üzərində keçid zamanı orijinal şəkil ölçüsünü göstərir.
  261. // @name:bg Наслој оригиналне величине слике приликом левог приказа на свим веб локацијама
  262. // @description:bg Прикажите оригиналне димензије слике приликом левог приказа на свим веб локацијама.
  263. // @name:bn সমস্ত ওয়েবসাইটে হভার ছবির মৌলিক মাপ ওভারলে
  264. // @description:bn সমস্ত ওয়েবসাইটে হভার ছবির মৌলিক মাপ প্রদর্শন করে।
  265. // @name:ca Superposició de la mida original de la imatge en el passar el ratolí en tots els llocs web
  266. // @description:ca Mostra les dimensions originals d'una imatge en passar el ratolí en tots els llocs web.
  267. // @name:cs Překrytí původní velikosti obrázku po najetí na všechny webové stránky
  268. // @description:cs Zobrazí původní rozměry obrázku po najetí na všechny webové stránky.
  269. // @name:da Overlay af original billedstørrelse ved hover på alle websteder
  270. // @description:da Vis original størrelse af et billede ved hover på alle websteder.
  271. // @name:de Originalgröße der Bildüberlagerung beim Hover auf allen Websites
  272. // @description:de Zeigt die Originalabmessungen eines Bildes beim Hover auf allen Websites an.
  273. // @name:el Επικάλυψη πρωτότυπου μεγέθους εικόνας κατά την αιωρούμενη κατάσταση σε όλους τους ιστότοπους
  274. // @description:el Εμφανίζει τις πρωτότυπες διαστάσεις μιας εικόνας κατά την αιωρούμενη κατάσταση σε όλους τους ιστότοπους.
  275. // @name:eo Overlay de la originala bildogrando dum muso super ĉiuj retejoj
  276. // @description:eo Montras la originalajn dimensiojn de hovrigi bildo sur ĉiuj retejoj.
  277. // @name:es Superposición del tamaño original de la imagen al pasar el cursor en todos los sitios web
  278. // @description:es Muestra las dimensiones originales de una imagen al pasar el cursor en todos los sitios web.
  279. // @name:fi Päällekkäinen alkuperäinen kuvakoko hoverilla kaikilla verkkosivustoilla
  280. // @description:fi Näyttää alkuperäiset kuvakoot hoverilla kaikilla verkkosivustoilla.
  281. // @name:fr Incrustation de la taille de l'image originale au survol sur tous les sites web
  282. // @description:fr Affiche les dimensions d'origine d'une image en survol sur tous les sites web.
  283. // @name:gl Superposición do tamaño orixinal da imaxe ao pasar o rato en todos os sitios web
  284. // @description:gl Amosa as dimensións orixinais dunha imaxe ao pasar o rato en todos os sitios web.
  285. // @name:he חיבור גודל תמונה מקורי בעת העברה מעל לכל אתרי האינטרנט
  286. // @description:he מציג את הממדים המקוריים של תמונה בעת העברת עכבר מעל לכל אתרי האינטרנט.
  287. // @name:hi सभी वेबसाइटों पर होवर पर मूल छवि आकार ओवरले
  288. // @description:hi सभी वेबसाइटों पर होवर पर छवि के मूल आकार को दिखाता है।
  289. // @name:hu Eredeti képméret átlátszása az egérrel történő lebegés közben az összes webhelyen
  290. // @description:hu Az eredeti kép méreteinek megjelenítése az egérrel történő lebegés közben az összes webhelyen.
  291. // @name:id Overlay ukuran asli gambar saat mengarahkan kursor di semua situs web
  292. // @description:id Menampilkan dimensi asli gambar saat mengarahkan kursor di semua situs web.
  293. // @name:is Yfirbragð upprunalegs myndastærðar á sveiflum á öllum vefsíðum
  294. // @description:is Sýnir upprunalegar málmar á mynd á sveiflum á öllum vefsíðum.
  295. // @name:it Sovrapposizione delle dimensioni originali dell'immagine al passaggio del mouse su tutti i siti web
  296. // @description:it Visualizza le dimensioni originali di un'immagine al passaggio del mouse su tutti i siti web.
  297. // @name:ja すべてのウェブサイトでホバー画像の元のサイズをオーバーレイ表示
  298. // @description:ja すべてのウェブサイトでホバー画像の元の寸法を表示します。
  299. // @name:km បង្ហាញទំហំរូបភាពដែលបង្ហាញឡើងលើលំនាំដើមនៅលើវេបសាយទាំងអស់
  300. // @description:km បង្ហាញទំហំដែលមាននៅលើរូបភាពដែលបង្ហាញឡើងលើលំនាំដើមនៅលើវេបសាយទាំងអស់។
  301. // @name:ko 모든 웹 사이트에서 이미지 원래 크기 오버레이 표시
  302. // @description:ko 모든 웹 사이트에서 이미지를 가리킬 때 원래 크기를 표시합니다.
  303. // @name:ms Overlay saiz asal imej semasa hover di semua laman web
  304. // @description:ms Papar dimensi asal imej semasa hover di semua laman web.
  305. // @name:mt Overlay ta 'dimensioni oriġinali tal-immaġni fuq hover fuq siti kollha tal-web
  306. // @description:mt Juri d-dimensjonijiet oriġinali ta 'immaġni fuq hover fuq siti kollha tal-web.
  307. // @name:nb Overlegg av original bildestørrelse ved svev på alle nettsteder
  308. // @description:nb Viser original størrelse av et bilde når du svever over det på alle nettsteder.
  309. // @name:nl Overlay originele afbeeldingsgrootte bij zweven op alle websites
  310. // @description:nl Toont de originele afmetingen van een zwevende afbeelding op alle websites.
  311. // @name:pl Nakładka oryginalnego rozmiaru obrazu po najechaniu na wszystkie strony internetowe
  312. // @description:pl Wyświetla oryginalne wymiary obrazka po najechaniu na wszystkie strony internetowe.
  313. // @name:pt Sobreposição do tamanho original da imagem ao passar o mouse em todos os sites
  314. // @description:pt Exibe as dimensões originais de uma imagem ao passar o mouse em todos os sites.
  315. // @name:ro Suprapunere dimensiune originală imagine la survol pe toate site-urile web
  316. // @description:ro Afișează dimensiunile originale ale unei imagini la survol pe toate site-urile web.
  317. // @name:ru Отображение оригинального размера изображения при наведении на всех веб-сайтах
  318. // @description:ru Отображает оригинальные размеры изображения при наведении курсора на всех веб-сайтах.
  319. // @name:sr Преклоп оригиналне величине слике приликом левог приказа на свим веб локацијама
  320. // @description:sr Приказује оригиналне димензије слике приликом левог приказа на свим веб локацијама.
  321. // @name:sv Överlagring av originalbildstorlek vid svävning på alla webbplatser
  322. // @description:sv Visar originalstorlek på en bild när du svävar över den på alla webbplatser.
  323. // @name:th แสดงขนาดภาพต้นฉบับเมื่อโฮฟเวอร์บนเว็บไซต์ทั้งหมด
  324. // @description:th แสดงขนาดต้นฉบับของภาพเมื่อโฮฟเวอร์บนเว็บไซต์ทั้งหมด
  325. // @name:tl Overlay ng orihinal na sukat ng imahe sa hover sa lahat ng mga website
  326. // @description:tl Nagpapakita ng orihinal na sukat ng imahe sa hover sa lahat ng mga website.
  327. // @name:tr Tüm web sitelerinde üzerine gelindiğinde orijinal resim boyutunu göster
  328. // @description:tr Tüm web sitelerinde üzerine gelindiğinde resmin orijinal boyutlarını gösterir.
  329. // @name:uk Налагодження оригінального розміру зображення при наведенні на всі веб-сайти
  330. // @description:uk Відображає оригінальні розміри зображення при наведенні на всі веб-сайти.
  331. // @name:vi Hiển thị kích thước hình ảnh gốc khi di chuột qua trên tất cả các trang web
  332. // @description:vi Hiển thị kích thước gốc của hình ảnh khi di chuột qua trên tất cả các trang web.
  333. // @name:zh 鼠标悬停时在所有网站上显示原始图像尺寸
  334. // @description:zh 在所有网站上显示悬停图像的原始尺寸。
  335. // @match *://*/*
  336. // @exclude *://beeg.com/*
  337. // @exclude *://kindroid.ai/*
  338. // @exclude *://*.mage.space/*
  339. // @exclude *://*.manyvids.com/*
  340. // @exclude *://*.xvideos.com/*
  341. // @exclude https://www.google.com/recaptcha/*
  342. // @icon data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' fill='white'%3E%3Cpath d='M.2 468.9C2.7 493.1 23.1 512 48 512l96 0 320 0c26.5 0 48-21.5 48-48l0-96c0-26.5-21.5-48-48-48l-48 0 0 80c0 8.8-7.2 16-16 16s-16-7.2-16-16l0-80-64 0 0 80c0 8.8-7.2 16-16 16s-16-7.2-16-16l0-80-64 0 0 80c0 8.8-7.2 16-16 16s-16-7.2-16-16l0-80-80 0c-8.8 0-16-7.2-16-16s7.2-16 16-16l80 0 0-64-80 0c-8.8 0-16-7.2-16-16s7.2-16 16-16l80 0 0-64-80 0c-8.8 0-16-7.2-16-16s7.2-16 16-16l80 0 0-48c0-26.5-21.5-48-48-48L48 0C21.5 0 0 21.5 0 48L0 368l0 96c0 1.7 .1 3.3 .2 4.9z'/%3E%3C/svg%3E
  343. // @version 1.0.8
  344. // @author BreatFR
  345. // @copyright 2024, BreatFR (https://breat.fr)
  346. // @grant none
  347. // @namespace https://gitlab.com/breatfr
  348. // @homepageURL https://gitlab.com/breatfr/overlay-original-image-size-on-hover-on-all-websites
  349. // @downloadURL https://gitlab.com/breatfr/overlay-original-image-size-on-hover-on-all-websites/-/raw/main/js/overlay-original-image-size-on-hover-on-all-websites.user.js
  350. // @updateURL https://gitlab.com/breatfr/overlay-original-image-size-on-hover-on-all-websites/-/raw/main/js/overlay-original-image-size-on-hover-on-all-websites.user.js
  351. // @supportURL https://discord.gg/Q8KSHzdBxs
  352. // @license AGPL-3.0-or-later; https://www.gnu.org/licenses/agpl-3.0.txt
  353. // ==/UserScript==
  354.  
  355. (() => {
  356. "use strict";
  357.  
  358. // Styles
  359. const toolbarStyles = {
  360. alignItems: "center",
  361. backdropFilter: "blur(1rem)",
  362. backgroundColor: "rgba(0, 0, 0, 0.4)",
  363. borderRadius: "5rem",
  364. color: "white",
  365. display: "none",
  366. fontSize: "1rem",
  367. margin: "0 1em",
  368. padding: "0.5rem 0.75rem",
  369. pointerEvents: "none",
  370. position: "absolute",
  371. textAlign: "center",
  372. whiteSpace: "nowrap !important",
  373. width: "max-content",
  374. wordBreak: "keep-all !important",
  375. zIndex: 1000
  376. };
  377.  
  378. const innerToolbarStyles = {
  379. display: "flex",
  380. width: "100%",
  381. justifyContent: "flex-start"
  382. };
  383.  
  384. // Create toolbar element
  385. const toolbar = document.createElement("div");
  386. Object.assign(toolbar.style, toolbarStyles);
  387. toolbar.style.display = "flex";
  388. console.log("Toolbar created:", toolbar);
  389.  
  390. // Create inner toolbar element
  391. const innerToolbar = document.createElement("div");
  392. Object.assign(innerToolbar.style, innerToolbarStyles);
  393. toolbar.appendChild(innerToolbar);
  394.  
  395. // Create image size label
  396. const imageSizeLabel = document.createElement("span");
  397. innerToolbar.appendChild(imageSizeLabel);
  398.  
  399. // Append the toolbar to the body once
  400. document.body.appendChild(toolbar);
  401. console.log("Toolbar appended to body");
  402.  
  403. const findImage = (element) => {
  404. if (element.tagName === "IMG") {
  405. return element;
  406. }
  407. return null;
  408. };
  409.  
  410. const showImageSize = (img) => {
  411. console.log("Showing image size for:", img);
  412. if (img.src.endsWith(".svg")) {
  413. // For SVG images, use the width and height attributes
  414. imageSizeLabel.textContent = `${img.naturalWidth} × ${img.naturalHeight}`;
  415. toolbar.style.display = "flex";
  416. updateToolbarPosition(img);
  417. } else {
  418. const originImage = new Image();
  419. originImage.onload = () => {
  420. imageSizeLabel.textContent = `${originImage.naturalWidth} × ${originImage.naturalHeight}`;
  421. toolbar.style.display = "flex";
  422. updateToolbarPosition(img);
  423. };
  424. originImage.src = img.src.replace(/([?&])name=([^&]*)/, "$1name=orig");
  425. }
  426. };
  427.  
  428. const updateToolbarPosition = (img) => {
  429. requestAnimationFrame(() => {
  430. const rect = img.getBoundingClientRect();
  431. const windowWidth = window.innerWidth;
  432.  
  433. // Default positioning
  434. let left = rect.left + window.scrollX;
  435. innerToolbar.style.flexDirection = "row";
  436.  
  437. // Check if the toolbar will overflow the right edge of the screen
  438. if (left + toolbar.offsetWidth > windowWidth) {
  439. // Switch to right alignment
  440. left = rect.right + window.scrollX - toolbar.offsetWidth;
  441. innerToolbar.style.flexDirection = "row-reverse";
  442. }
  443.  
  444. toolbar.style.left = `${left}px`;
  445. toolbar.style.top = `${rect.top + window.scrollY + 16}px`;
  446. });
  447. };
  448.  
  449. const hideImageSize = () => {
  450. console.log("Hiding image size");
  451. toolbar.style.display = "none";
  452. };
  453.  
  454. document.body.addEventListener("mouseover", (event) => {
  455. const img = findImage(event.target);
  456. if (img) {
  457. showImageSize(img);
  458. }
  459. });
  460.  
  461. document.body.addEventListener("mouseout", (event) => {
  462. const img = findImage(event.target);
  463. if (img && !toolbar.contains(event.relatedTarget)) {
  464. hideImageSize();
  465. }
  466. });
  467.  
  468. document.body.addEventListener("mousemove", (event) => {
  469. const img = findImage(event.target);
  470. if (img) {
  471. updateToolbarPosition(img);
  472. }
  473. });
  474. })();