Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.03.2024, 13:02
Новичок на форуме
Отправить личное сообщение для Firefly Посмотреть профиль Найти все сообщения от Firefly
 
Регистрация: 26.06.2021
Сообщений: 5

Переопределить css-стили с помощью GreaseMonkey
Хочу с помощью GreaseMonkey переопределить стили на веб-странице, чтобы сайт отображался как мне надо.
Для этого пишу такой скрипт:

function AddStyle(cssStr){
    var n = document.createElement('style');
    n.type = "text/css";
    n.innerHTML = cssStr;
    document.getElementsByTagName('head')[0].appendChild(n);
}

AddStyle("  .monthDay { min-height: 110px } .thisPeriod {margin-top: 0px; margin-bottom: 0px;} .filterPanel {margin-top: 0px; margin-bottom: 0px;}");


Проблема в том, что мой вставленный тэг со стилем почему-то в итоге располагается не самым последним элементов внутри тега head, а где-то посередине, то есть после него возникают какие-то другие стили, переопределяющие мой. Из-за чего мой стиль срабатывает только наполовину.
Как сделать, чтобы он гарантированно переопределял любые стили элементов, то есть всегда был в самом конце?
Ответить с цитированием
  #2 (permalink)  
Старый 02.03.2024, 14:24
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Firefly, стили не только ты динамически добавляешь.
а) Положить в конец body.
б) Положить в html после body.(ну и что что не валидно, зато наверняка).
с) Использовать MutationObserver на всю страницу\setTimeout, наблюдать за добавлениями стилей и передвигать свой всегда в конец.
д) Использовать !important.
е) Использовать относительно свежую фичу css - слои (layers).
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 02.03.2024, 14:34
Новичок на форуме
Отправить личное сообщение для Firefly Посмотреть профиль Найти все сообщения от Firefly
 
Регистрация: 26.06.2021
Сообщений: 5

Спасибо, буду кумекать
Ответить с цитированием
  #4 (permalink)  
Старый 02.03.2024, 18:22
Аспирант
Отправить личное сообщение для roland Посмотреть профиль Найти все сообщения от roland
 
Регистрация: 02.11.2023
Сообщений: 30

Firefly, если Вы считаете, что Ваши стили перезаписываются из-за того, что загружаются перед стилями сайта, тогда самым простым решением будет просто повысить специфичность селекторов.

https://developer.mozilla.org/ru/doc...SS/Specificity

Встраивать стили можно с помощью функции GM_addStyle(css), добавив в meta-блок скрипта:
@grant GM_addStyle
Ответить с цитированием
  #5 (permalink)  
Старый 02.03.2024, 21:07
Новичок на форуме
Отправить личное сообщение для Firefly Посмотреть профиль Найти все сообщения от Firefly
 
Регистрация: 26.06.2021
Сообщений: 5

Спасибо вам за помощь.
Пока остановился на варианте: "Положить в конец body".

Оказалось, что функцию GM_addStyle из GreaseMonkey убрали.
Теперь выдается ошибка:
ReferenceError: GM_addStyle is not defined
Вместо нее предлагают написать свою функцию, точно такую же, как в моем первом сообщении.

Вариант со специфичностью - чуть сложней (для меня), т.к. если правильно понял, для гарантированной перезаписи существующих значений надо проходить циклом по всем элементам страницы и присваивать каждому тэгу мои значения, что не очень удобно.

Скорей всего потом попробую осилить mutationObserver, если будут проблемы с сайтами, динамически подгружающими свое содержимое время от времени.

Последний раз редактировалось Firefly, 02.03.2024 в 21:09.
Ответить с цитированием
  #6 (permalink)  
Старый 03.03.2024, 07:18
Аспирант
Отправить личное сообщение для roland Посмотреть профиль Найти все сообщения от roland
 
Регистрация: 02.11.2023
Сообщений: 30

Сообщение от Firefly Посмотреть сообщение
Вариант со специфичностью - чуть сложней (для меня), т.к. если правильно понял, для гарантированной перезаписи существующих значений надо проходить циклом по всем элементам страницы и присваивать каждому тэгу мои значения, что не очень удобно.
Firefly, то, что Вы описали, является инлайн стилями (inline styles). Я советую Вам всё-таки разобраться, что такое специфичность, чтобы в будущем понимать, почему одни правила CSS имеют приоритет применения над другими. Это очень важная тема, входящая в основы изучения CSS.

В вашем случае, если использовать CSS Nesting, у которого уже отличная поддержка, потребуется минимальное изменение стилей.
Ответить с цитированием
  #7 (permalink)  
Старый 03.03.2024, 10:02
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Проще всего специфичность повысить добавив кучку :not(_)
Но это для самых жестких случаев, когда на сайте уже и так суперспецифичный селектор с !important. В ином случае хватит и помещения в конец.
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JQuery CSS анализатор javascript jQuery 2 15.08.2010 21:27
Подскажите по CSS меню Александр_1988 Элементы интерфейса 1 17.05.2010 11:58
css как подавить внешние стили warobushek (X)HTML/CSS 3 22.11.2009 13:17
Удаление CSS свойста с помощью JS Hurley Internet Explorer 2 01.10.2009 21:55
Изменение имиджа по таймеру с помощью CSS и JavaScript Aimless Общие вопросы Javascript 10 15.08.2008 18:09