Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   наследный display (https://javascript.ru/forum/dom-window/15187-naslednyjj-display.html)

Sonkkorh 16.02.2011 11:05

наследный display
 
свойство display, как известно, наследуется от родительского элемента. Но если display у элемента не указан, то style.display вернёт значение по умолчанию, хотя у родительского элемента display может отличатся.
Как узнать реальный display

Например

<div style="display:none">
<span id="spanid">блабла<span>
</div>
<script>
alert(document.getElementById('spanid').style.display);
</script>


В результате получим не none, что было бы логично, а ''.

Aetae 16.02.2011 11:24

Как раз таки логично именно ''.
Тут: document.getElementById('spanid').style только то, что указанно <span id="spanid" style="тут"><span>.(ну и то, что указанно собсно через style)

Sonkkorh 16.02.2011 11:26

и? Ты просто скопировал мой пример. Результат-то от этого не поменялся.

Sonkkorh 16.02.2011 11:28

вопрос как раз в том, чтоб определить результирующий display, тот который браузер отобразит.

walik 16.02.2011 11:29

Если не ошибаюсь то свойство display не наследует значение у родителя.

Можно узнать вот так:
<html>
<head>
</head>
<body>
<div style="display:none">
<span id="spanid">блабла<span>
</div>
<script>
function GetCssStyle(e){
    if (e.currentStyle) return e.currentStyle;
    else if (window.getComputedStyle) return window.getComputedStyle(e,null);
}
alert(GetCssStyle(document.getElementById('spanid') ).display);
</script>
</body>
</html>


Но так вернет default значение - "inline", так как я уже говорил, что если я не ошибаюсь, то display не наследует значение у родителя.

Sonkkorh 16.02.2011 11:38

в том-то и дело что наследует
если открыть пример в браузере, то "блабла" не видно. Аналайзер хрома и фф показывают, что display наследуется от родителя.

walik 16.02.2011 11:41

а вам не подойдет свойство visibility ?

<html>
<head>
</head>
<body>
<div style="visibility: hidden">
<span id="spanid">блабла<span>
</div>
<script>
function GetCssStyle(e){
    if (e.currentStyle) return e.currentStyle;
    else if (window.getComputedStyle) return window.getComputedStyle(e,null);
}
alert(GetCssStyle(document.getElementById('spanid') ).visibility);
</script>
</body>
</html>


Только нужно учесть что visibility будет занимать место на страничке, поэтому и спрашиваю что если не подойдет :)

ksa 16.02.2011 11:45

Цитата:

Сообщение от Sonkkorh
если открыть пример в браузере, то "блабла" не видно

Это не потому что свойство display наследуется... :D В противном случае все что в диве имело бы

display: block;


А он таки у всех свой...

ksa 16.02.2011 11:53

Цитата:

Сообщение от Sonkkorh
вопрос как раз в том, чтоб определить результирующий display, тот который браузер отобразит.

Как вариант ответа
Цитата:

Я хочу получить значение CSS свойства, но возвращается пустая строка. Например, хочу узнать цвет текста элемента и пишу
document.getElementById("elemId").style.color
, а результат пустая строка. Что делать?


Объект style элемента (document.getElementById("elementId").style), содержит только те значения, которые были заданны явно в атрибуте style в тэге элемента или были предварительно назначены через скрипт. Если Вы задаёте CSS свойства через тэг <STYLE></STYLE> или внешние листы стилей, то они не будут присутствовать в объекте style элемента.

Возникает вопрос, как узнать вычисленное значение свойства элемента, если оно не задано в атрибуте style элемента и не было инициализировано через скрипт?

Воспользуйтесь функцией (работает начиная с NN 6, IE 5, Opera 7):

function getElementComputedStyle(elem, prop)
{
  if (typeof elem!="object") elem = document.getElementById(elem);
  
  // external stylesheet for Mozilla, Opera 7+ and Safari 1.3+
  if (document.defaultView && document.defaultView.getComputedStyle)
  {
    if (prop.match(/[A-Z]/)) prop = prop.replace(/([A-Z])/g, "-$1").toLowerCase();
    return document.defaultView.getComputedStyle(elem, "").getPropertyValue(prop);
  }
  
  // external stylesheet for Explorer and Opera 9
  if (elem.currentStyle)
  {
    var i;
    while ((i=prop.indexOf("-"))!=-1) prop = prop.substr(0, i) + prop.substr(i+1,1).toUpperCase() + prop.substr(i+2);
    return elem.currentStyle[prop];
  }
  
  return "";
}

Взято тут
http://www.tigir.com/javascript.htm

Sonkkorh 16.02.2011 11:53

он наследуется, если не указан явно. в данном случае у span он явно не указан.

visibility не подойдёт, т.к. пишу скрипт для GM. Приходится работать с уже свёрстанной страничкой.


Часовой пояс GMT +3, время: 23:10.