Войти через VK Войти через FB Войти через Google Войти через Яндекс
Поиск по сайту
Кроссбраузерное получение стиля
Забегая вперед, для экономии Вашего времени выкладываю готовый кусок универсального кода получения стиля, например, ширины элемента:
element=document.getElementById('aa');
var c=window.getComputedStyle(element, null);
s.style.width=parseInt(c.width)+"px";
Почему так сложно? Почему нельзя просто написать [element].style.width?
Проблема связана с тем, что стили определенного элемента будут доступны в JavaScript через конструкцию [element].style только в двух случаях:
-
Если стили были прописаны в атрибуте style соответствующего тега. Например:
В случае этого примера через JavaScript будут доступны значения свойств [element].style.position и [element].style.top, а остальные свойства (в т.ч. установленные через CSS) будут недоступны.<div style="position:absolute; top:5px"></div>
- Если стили были установлены через JavaScript, то они будут доступны везде, ведь на самом деле объект [element].style отражает состояние атрибута style соответствующего тега.
Если вам сложно понять, в чем же заключается проблема, взгляните на этот пример:
<style type="text/css">
.someClass {
margin-left: 15px;
cursor: pointer;
}
</style>
<div onclick="alert(this.style.marginLeft || 'Нету :(')" class="someClass">Нажми на меня</div>
РЕЗУЛЬТАТ:
Как видите, хотя CSS-свойство margin-left и повлияло на отображение, его "нету" в объекте [element].style.
Справиться с этой проблемой можно, получив значения из "вычисленного" стиля элемента. В соответствии с названием, это будет метод getComputedStyle.
Метод getComputedStyle
В W3C-браузерах у объекта window доступен метод getComputedStyle, который принимает два параметра: сам элемент, стили которого мы хотим получить, и "псевдо-элемент". Второй параметр обязателен и для простых элементов должен быть пустой строкой или null. А вообще, этот параметр работает по аналогии с "псевдо-классами" в CSS, т.е. может принимать параметры "hover", "visited" и подобные.
Этот метод возвращает объект CSSStyleDeclaration, другими словами, объект такого же типа, как и [element].style, но в данном случае мы не можем менять свойства этого объекта, а только получать их значения.
Вот переделанный пример, подобный тому, что был представлен выше:
<style type="text/css">
.someClass {
margin-left: 15px;
cursor: pointer;
}
</style>
<div onclick="alert(window.getComputedStyle(this, null).marginLeft)" class="someClass">Нажми на меня</div>
РЕЗУЛЬТАТ:
Стоит отдельно отметить, что getComputedStyle возвращает действительные значения стилей, которые будут изменяться в соответствии с изменением свойств объекта [element].style.
Если в вашей задаче необходимо узнать значения вычисленных свойств "по-умолчанию", то вы можете вызвать метод getComputedStyle у объекта document.defaultView с теми же параметрами, в результате получив вычисленные значения свойств, строго указанных в CSS или внутреннем стиле элемента.
Как работать со свойствами стилей
Очень просто получать значение текущего вычисленного стиля:
var computedStyle = window.getComputedStyle(element, null);
В скриптах, которые будут изменять свойства стилей элементов, лучше реализовать следующий принцип работы:
Если свойство стиля, с которым будет производиться работа, недоступно в объекте [element].style, получаем его из текущих вычисленных стилей и "запоминаем", или обновляем соответствующее свойство в [element].style. После этого нам уже не нужно обращаться к действительным стилям, ведь значение интересующего нас свойства будет соответствовать значению в [element].style.
Единицы измерения
Вторая проблема, с которой сталкиваешься при работе со свойствами стилей, заключается в том, что при изменении значений определенных свойств из JavaScript, нужно указывать единицы измерения вместе с числовым значением.
Обычно, если мы хотим переместить какой-то элемент, то мы получаем его текущее положение и прибавляем к нему определенное значение. Но значения в CSS хранятся в виде строки, например "15px". Поскольку в JavaScript оператор "+" производит конкатацию, если один из элементов операции - строка, то обычные операции, как с числами, тут не сработают:
var a = "15px";
a++; // NaN - not a number
var a = "15px";
a += 5; // 15px5
var a = "15px";
var b = a + 7; // 15px7
И наоборот, если мы попытаемся обновить свойство, приравняв ему число, то в режиме следования стандартам ничего не произойдет, так как не указаны единицы измерения.
Поэтому, всегда нужно следить за тем, в каком виде мы работаем со значением свойства и в каком виде его записываем. Работать удобнее в виде числа, а записывать нужно в виде строки, содержащей единицы измерения.
В общем виде, работа должна происходить так:
// Допустим, мы работаем с каким-то элементом,
// для которого доступен style.top:
var top = parseInt(element.style.top); // Получили число из строки
top++; // Увеличили его на единицу
// Так как "px" строкового типа, то произойдет
// конкатация и будет записано правильное значение
// с единицами измерения:
element.style.top = top + "px";
Обратите внимание, что в последней строке мы можем сделать вот так:
element.style.top = top + 25 + 100 + "px";
Потому что при последовательном вычислении выражения конкатенация произойдет только в последнюю очередь, а выражения слева от строки будут складываться, как числа.
Оригинал: http://javascript.ru/blog/Andrej-Paranichev/Osnovy-programmnoj-animacii-JavaScript
.
Прокомментировать/Отблагодарить