Добавление/изменение свойств во всех тегах типа (странные результаты)

Я ищу способ добавить/изменить некоторые свойства во всех тегах определенного типа после загрузки страницы.

Я нашел два пути. Но по какой-то причине, которую я не понимаю, результаты разные.

Способ 1 — добавление тега стиля в качестве последнего дочернего элемента <html>.

var style = document.createElement( "style" );

style.innerHTML = `

div {
  background-color: black;
  color: white;
}

`;

document.documentElement.appendChild( style );

Результат тега стиля как последнего дочернего метода HTML

Способ 2. Получение всех тегов этого типа и болезненное их изменение.

var elems = document.body.getElementsByTagName("div");

for( let i = 0; i < elems.length; i++ ){

  elems[i].style.backgroundColor = "black";
  elems[i].style.color = "white";

}

Результат петлевого/поточного метода

Поэтому мне было интересно, почему результаты между двумя методами различны, и я также рад узнать о других методах изменения всех тегов типа, конечно.

Это может быть приоритет, с которым движок CSS применяет стиль. Встроенные стили перезаписывают стили CSS.

vanowm 10.01.2023 12:39

@vanowm Понятно, я предполагал, что, поскольку стили добавляются в самом конце, они будут иметь приоритет. И я видел, как встроенные свойства/атрибуты также игнорировались, что может отменить приоритет встроенных?

micky_mikes 10.01.2023 12:57
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел &quot;Заголовок&quot; в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
Как React Helmet спасает меня при разделении файлов CSS?
Как React Helmet спасает меня при разделении файлов CSS?
Многие новички могут столкнуться с проблемой, когда одна страница с CSS наследует свойства от другой страницы с другим CSS. У меня было много проблем,...
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Руководство для начинающих по веб-разработке: HTML, CSS и JavaScript.
Руководство для начинающих по веб-разработке: HTML, CSS и JavaScript.
Добро пожаловать, мои коллеги по интернету, в захватывающий мир веб-разработки! Дорогие мои начинающие, я здесь, чтобы провести вас через основы HTML,...
0
2
80
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

  • первый метод создает тег <style> и устанавливает его атрибуты, как если бы вы писали css в теге <style> или вводили его через <link>
  • второй метод использует атрибут style каждого тега, который также является стандартом W3C, но ограничен только этим тегом и имеет синтаксические ограничения (не может использовать селекторы, такие как :hover , :focus...)

2-й метод быстрее, чем 1, имеет более высокий приоритет и не содержит ошибок в отношении scoped, он предпочтительнее в javascript.

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

micky_mikes 10.01.2023 12:51

Вы можете так подумать, потому что javascript выглядит тяжелым, но на самом деле создание тега стиля заставляет браузер делать больше, чем он должен взаимодействовать с DOM (это дорого), просматривать все индексы в поисках селекторов и, наконец, то же самое реализует ответ css

Tachibana Shin 10.01.2023 12:56

Я был так же сбит с толку, как и вы, пока не провел тесты производительности. метод с использованием class почти эквивалентен style, и они оба быстрее, чем <style>

Tachibana Shin 10.01.2023 12:57

Если вам нужно изменить 2 или более свойств, которые вы можете использовать class, это легко и быстро написать

Tachibana Shin 10.01.2023 12:59

Хм, отличный совет, спасибо. И это верно независимо от того, сколько тегов задействовано (например, 300+)?

micky_mikes 10.01.2023 13:02

Я думаю, что класс не подходит для моей цели, так как это не мой HTML. Поэтому мне нужно сначала создать элемент стиля, как в методе 1, добавить свойства класса, а затем добавить класс к каждому тегу типа. Или вы хотите сказать, что это также быстрее?

micky_mikes 10.01.2023 13:07

Если вы не можете вставить <style> сразу после загрузки страницы, то style будет быстрее, чем class. на ваш вопрос style будет быстрее, чем <style> даже с 300+ элементами, которые я тестировал на своем сайте, состоящем примерно из 2000 элементов

Tachibana Shin 10.01.2023 13:17

Просто class выглядит чище. вы также можете обратиться к .cssText, он будет писать более аккуратно, чем style за почти эквивалентную стоимость

Tachibana Shin 10.01.2023 13:17

Я бы не смог ничего изменить, пока страница не загрузится полностью, нет. Блин, я невероятно удивлен, что это быстрее даже с таким большим количеством элементов, определенно супер полезно знать, спасибо. Аккуратность активного HTML не проблема, так что все в порядке. И я хотел бы использовать .cssText, но я не могу его использовать, так как не хочу удалять какие-либо другие ранее установленные свойства стиля в этих элементах.

micky_mikes 10.01.2023 13:43

Здесь метод 1 добавляет новый тег стиля в документ и применяет стили CSS с помощью innerHTML. Все теги на странице, соответствующие селектору div, будут иметь стили, использующие эту технику. Однако, в зависимости от того, сколько стилей требуется, этот метод может привести к более медленной загрузке страницы.

Затем другой метод, который выбирает свойства фона и цвета каждого элемента div на странице, перебирая их все. Этот подход быстрее, потому что не нужно ждать загрузки новых стилей.

Итак, еще один метод, который вы можете использовать, просто немного изменив свой второй метод:

var elems = document.querySelectorAll("div");
for( let i = 0; i < elems.length; i++ ){
  elems[i].style.backgroundColor = "black";
  elems[i].style.color = "white";
}

Тем не менее, вы также можете использовать Jquery для быстрого выполнения:

$("div").css({
  "background-color": "black",
  "color": "white"
});

Изменение свойства style элемента аналогично изменению атрибута стиля.

vanowm 10.01.2023 13:27
Ответ принят как подходящий

Разница была в приоритете. Те же встроенные результаты метода 2 (цикл / встроенный) были достигнуты с помощью метода 1 (<style> как последний дочерний элемент) путем добавления правила !important из-за повышенного приоритета. Вот так:

div {
  background-color: black !important;
  color: white !important;
}

Простой пример, демонстрирующий, как легко и полностью отменить все изменения и вернуться к исходному HTML:

<!DOCTYPE html>
<html>
<head>
<style>

  p {
    background-color: red;
  }

</style>
</head>
<body>

  <p>Text sample.</p>

  <p style = "background-color: grey">Text sample.</p>

  <button onclick = "test1()">Remove temporary changes</button>

</body>
<script>

  function test1() {
    document.getElementById("tempChanges").remove();
  }

</script>
<style id = "tempChanges">

  p {
    background-color: green !important;
  }

</style>
</html>

Хотя !important работает, это не рекомендуется, потому что его сложнее перезаписать, если вам нужно, например, на определенной странице или в строке для определенного элемента.

Can O' Spam 10.01.2023 15:27

@CanO'Spam Спасибо. Да, я понимаю это, но для моего варианта использования он должен иметь наивысший приоритет и действует только временно.

micky_mikes 10.01.2023 15:33

Другие вопросы по теме