Как получить текстовое значение атрибута style?

#html #css #getelementbyid #inline-styles

#HTML #css #getelementbyid #встроенные стили

Вопрос:

Мне нужно отобразить стиль CSS элемента точно так, как я определил его в его встроенном стиле. Например, у меня есть div, который выглядит так:

 <div
  id="1"
style="background: 
radial-gradient(circle at 50% 0,
  salmon,
  rgba(255,0,0,0) 10px),
radial-gradient(circle at 50% 100%,
  salmon,
  rgba(255,0,0,0) 10px);
background-size: 10px 10px;
"> </div>
  

Я хочу получить СТРОКУ, которая выглядит следующим образом:

 radial-gradient(circle at 50% 0,
  salmon,
  rgba(255,0,0,0) 10px),
radial-gradient(circle at 50% 100%,
  salmon,
  rgba(255,0,0,0) 10px);
background-size: 10px 10px;
  

Я не пытаюсь менять стили, мне просто нужна строка встроенного стиля. У меня много разных элементов с разными стилями.
Я использую document.getElementById(1).style.cssText метод для достижения того, чего я хочу, но он не работает. В Firefox я получаю с ним много разных свойств (например, background-origin , background-clip , и т.д.), Поэтому результат выглядит так:

 background-color: black;
background-position: 0% 0%, 0% 0%;
background-repeat: repeat, repeat;
background-attachment: scroll, scroll;
background-image: radial-gradient(circle at 50% 0px, salmon, rgba(255, 0, 0, 0) 10px), radial-gradient(circle at 50% 100%, salmon, rgba(255, 0, 0, 0) 10px);
background-size: 10px 10px;
background-origin: padding-box, padding-box;
background-clip: border-box, border-box;
  

в то время как в Chrome background-size удаляется. Какой метод я должен использовать, чтобы получить встроенный стиль в строковом формате точно так, как он определен в моем встроенном стиле?

Комментарии:

1. Поведение, которое вы видите в Firefox, связано с тем, что браузер явно перечисляет все значения по умолчанию для свойств, связанных с фоном. developer.mozilla.org/de/docs/Web/CSS/background-attachment указывает background-attachment , что for, например scroll, scroll , используется по умолчанию. Поэтому это не должно оказывать никакого влияния на действие ваших заданных свойств.

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

3. Почему бы и нет document.getElementById(1).getAttribute("style") ?

4. Потому что происходит то же самое, что и с cssText.

Ответ №1:

Хорошо, я провел несколько экспериментов:

Как я уже упоминал в своем комментарии, background border , …) — это сокращенное свойство, которое может задавать несколько свойств за один раз.

Сначала: Firefox.
При изменении значения атрибута style элемента с помощью elem.style.cssText свойства Firefox распакует все свойства background , которые можно установить, включая их неявные значения по умолчанию. Это означает, что, как вы видели, вы получаете кучу свойств, таких как background-attachment и background-repeat в строке атрибута. Это не влияет на поведение вашего кода, свойства будут применяться так, как вы ожидаете, если вы ставите background первым.

Chrome ведет себя немного не так, как вы ожидаете. В процессе синтаксического анализа нового ввода, который вы предоставили для атрибута style, он расширит свойства, явно и неявно заданные background сокращением, и переопределит любые другие изменения в материалах, связанных с фоном, которые появляются впоследствии вместе с ними. Примечательно, что эта ошибка, похоже, влияет только на JavaScript API, изображение отображается как ожидалось. Такое поведение, скорее всего, является ошибкой в Chrome, поэтому не стесняйтесь подавать его как таковой!

Есть два исправления, которые работают в обоих браузерах и обеспечивают ожидаемое поведение:

  1. Вы пытаетесь установить для фона градиент в первом свойстве. CSS учитывает градиенты изображений, поэтому правильным свойством, не являющимся сокращением, для этого будет background-image . Это отключает все действия smart browser в отношении сокращений, поэтому вы должны быть в курсе
     document.getElementById("your-id").style.cssText = "background-image: radial-gradient(circle at 50% 0, salmon, rgba(255,0,0,0) 10px), radial-gradient(circle at 50% 100%, salmon, rgba(255,0,0,0) 10px); background-size: 10px 10px;"
      
  2. Используйте другой API. Обычный способ изменения стилей в JavaScript — это изменить значение соответствующего ключа в объекте style. Эти значения также попадают в атрибут style, но вы экономите браузеру немного времени на синтаксическом анализе (даже должно быть немного быстрее). Выполнение того, что вы хотите сделать, будет выглядеть следующим образом:
     let e = document.getElementById("your-id");
    e.style.background = "radial-gradient(circle at 50% 0, salmon, rgba(255,0,0,0) 10px), radial-gradient(circle at 50% 100%, salmon, rgba(255,0,0,0) 10px)";
    e.style.backgroundSize = "10px 10px";
      

Надеюсь, это было полезно, хорошего дня!

Комментарии:

1. Было ли это полезно для вас? Если это так, пожалуйста, подумайте о том, чтобы пометить ответ как «принятый», используя кнопку с галочкой

2. Большое вам спасибо за ваш ответ. Я думаю, что я не объяснил это четко — я не пытаюсь изменить стиль, а просто получить строку стиля. Итак, хотя я знаю, что все вложенные свойства не изменят сам стиль, они изменят строку — и я не уверен, смогу ли я изменить все свойство «background» на «background-image». Вот почему это также не будет работать в Chrome, поскольку такое поведение связано с удалением ненужных свойств css (если у вас есть «background», вам действительно не нужен «background-size» — хотя вы делаете это по практическим соображениям)…

3. …так что это не ошибка. Большое вам спасибо за то, что нашли время и желание помочь! Я дал вам преимущество, но оно не отображается, так как я здесь новичок.