#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, поэтому не стесняйтесь подавать его как таковой!
Есть два исправления, которые работают в обоих браузерах и обеспечивают ожидаемое поведение:
- Вы пытаетесь установить для фона градиент в первом свойстве. 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;"
- Используйте другой 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. …так что это не ошибка. Большое вам спасибо за то, что нашли время и желание помочь! Я дал вам преимущество, но оно не отображается, так как я здесь новичок.