ShPB
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Конечно лучше было-бы искать flex через BeforeCSS или CSSOM a function searchFlexInDOM убрать, но не факт, что будет быстрее на случайных сайтах. img[width] тоже надо переделывать. Выложу пока так: Код: // ==UserScript== // @name operaFixFlex // @include http* // ==/UserScript== /* * opera:config#UserPrefs|MinimumFontSize должен быть 0 */ (function(){ var whiteListSites = /vk\.com|yadi\.sk|habr|github|yandex|meduza/; //var blackListSites = //; var storage = sessionStorage; var isFlex = storage.getItem('operaIsFlex'); var cssFixFlex = 'form {overflow: hidden}\ img, div, header, footer, nav, aside, section, article, hgroup, main, p, button, a {min-width: 0px; min-height: 0px;}\ img[width="16"][height="16"] {max-width: 16px !important; max-height: 16px !important}\ img[width="18"][height="18"] {max-width: 18px !important; max-height: 18px !important}\ img[width="20"][height="20"] {max-width: 20px !important; max-height: 20px !important}\ img[width="22"][height="22"] {max-width: 22px !important; max-height: 22px !important}\ img[width="24"][height="24"] {max-width: 24px !important; max-height: 24px !important}\ img[width="26"][height="26"] {max-width: 26px !important; max-height: 26px !important}\ img[width="28"][height="28"] {max-width: 28px !important; max-height: 28px !important}\ img[width="30"][height="30"] {max-width: 30px !important; max-height: 30px !important}\ img[width="32"][height="32"] {max-width: 32px !important; max-height: 32px !important}\ img[width="36"][height="36"] {max-width: 36px !important; max-height: 36px !important}\ img[width="48"][height="48"] {max-width: 48px !important; max-height: 48px !important}\ img[width="64"][height="64"] {max-width: 64px !important; max-height: 64px !important}\ img[width="128"][height="128"] {max-width: 128px !important; max-height: 128px !important}'; function setFlexFlag(boolean) { isFlex = boolean; storage.setItem('operaIsFlex', boolean); } function checkFlex() { if ( document.head.querySelector('#operaFixFlex') ) { return; } else if (isFlex === 'true' || whiteListSites.test(location.hostname)) { addCssToDocument(); opera.addEventListener('AfterEvent.DOMContentLoaded', fixPageJumps); } else { searchFlexInDOM(); } } function searchFlexInDOM() { if ( (document.querySelector('html').scrollWidth > document.querySelector('html').clientWidth && !document.querySelector('table')) || (document.querySelector('a > img') && /flex/.test(window.getComputedStyle(document.querySelector('a > img').parentNode).display)) || (document.querySelector('img[height]') && document.querySelector('img[height]').clientHeight !== 0 && document.querySelector('img[height]') && document.querySelector('img[height]').height != document.querySelector('img[height]').clientHeight) || (document.querySelector('img[width]') && document.querySelector('img[width]').clientWidth !== 0 && document.querySelector('img[width]') && document.querySelector('img[width]').height != document.querySelector('img[width]').clientWidth) ) { setFlexFlag('true'); addCssToDocument(); opera.addEventListener('AfterEvent.DOMContentLoaded', fixPageJumps); } else { setFlexFlag('false'); } }; function addCssToDocument() { document.head.insertAdjacentHTML('beforeend', '<style id="operaFixFlex">' + cssFixFlex + '</style>'); } function fixPageJumps() { var bodyDivsHeight = 0; var linksQuantity = document.links.length; function compareLinksQuantity() { document.body.style.minHeight = window.getComputedStyle(document.body).height; if (linksQuantity != document.links.length) { linksQuantity = document.links.length; fixPageJumps(); } } function calcBodyDivsHeight() { var divs = document.querySelectorAll('body > *'); var curBodyDivsHeight = 0; for (var j = 0; j < divs.length; j++) { curBodyDivsHeight += divs[j].clientHeight; } if ( bodyDivsHeight != curBodyDivsHeight ) fixPageJumps(); bodyDivsHeight = curBodyDivsHeight; } function fixPageJumps() { document.body.style.minHeight = ''; document.body.style.minHeight = window.getComputedStyle(document.body).height; } opera.addEventListener('AfterEvent.scroll', compareLinksQuantity); opera.addEventListener('AfterEvent.click' , calcBodyDivsHeight); } if ( isFlex === 'false' /*|| blackListSites.test(location.hostname)*/ ) { return; } if (isFlex === 'true' || whiteListSites.test(location.hostname)) { addCssToDocument(); opera.addEventListener('AfterEvent.DOMContentLoaded', fixPageJumps); } opera.addEventListener('BeforeEvent.DOMContentLoaded', checkFlex); }()); |
|