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. Приходится работать с уже свёрстанной страничкой.

ksa 16.02.2011 11:56

Цитата:

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

Нет.
спан как был строчным тат и останется.

<div style='display: block;'>
   <span>one<span>
   <span>two<span>
</div>


Спаны не стали блочными... ;)
Т.ч. всё это "наследование" в твоих мечтах... :)

Sonkkorh 16.02.2011 12:14

ок, но как тогда определить виден ли элемент на странице или нет?
идти вверх по родителям и проверять у всех display?

ksa 16.02.2011 12:49

Цитата:

Сообщение от Sonkkorh
идти вверх по родителям и проверять у всех display?

Чем не вариант! :)

Sonkkorh 16.02.2011 12:50

думал есть способ проще

ksa 16.02.2011 12:51

Вот чего еще нашел :)
Цитата:

Определяем видимость элемента на странице

Для того чтобы в JS проверить виден ли объект, нужно проверить его offsetHeight, если он равен 0 (ноль), то элемент скрыт.
http://pontyk.com.ua/2010/08/14/opre...a-na-stranice/

Kolyaj 16.02.2011 13:17

Цитата:

Сообщение от Sonkkorh
как тогда определить виден ли элемент на странице или нет?

if (el.offsetWidth) {
    alert('Элемент виден.');
}

bushstas 20.02.2011 13:58

ну у всех элементов у которых display=none clientHeight=0

просто проверяй если clientHeight==0 то соответственно у элемента display=none

поправьте меня если я не прав или если у элемента может быть по какой то другой причине clientHeight равен 0

хотя наверное если задать через стиль высота равную 0 ))) но думаю не везде это сработает

Aetae 20.02.2011 17:08

Может и используется. Например чтоб делать такие чтуки:
<div style="border-top:25px solid white; border-bottom:15px solid white; border-right:15px solid black; width:0; height:0; font-size:0; float:left"></div>
<div style="border-top:15px solid white; border-bottom:25px solid white; border-left:15px solid black; width:0; height:0; font-size:0; float:left"></div>


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