CSS Style Visibility не работает должным образом - PullRequest
7 голосов
/ 21 января 2010

У меня есть HTML-страница с основным элементом управления вкладки.Я использую JavaScript, чтобы показать и скрыть вкладки и элементы содержимого вкладок.Моя проблема заключается в том, что если я изменю видимость элемента внутри одного из элементов содержимого вкладки на «скрытый», а затем обратно на «видимый», то элемент, кажется, забывает или теряет свой родительский контейнер div и остается видимым независимо от его оригиналавидимость родителей.

Для иллюстрации возьмите следующий пример:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
     "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script type="text/javascript"> 
    function hideTab(){
        document.getElementById('tab1').style.visibility = 'hidden'
    }
    function showTab(){
        document.getElementById('tab1').style.visibility = 'visible'
    }
    function hideContent(){
        document.getElementById('tc1').style.visibility = 'hidden'
    }
    function showContent(){
        document.getElementById('tc1').style.visibility = 'visible'
    }
</script>
</head>
<body>
    <a href="javascript: hideTab()">Hide Tab</a><br />
    <a href="javascript: showTab()">Show Tab</a><br />
    <a href="javascript: hideContent()">Hide Content</a><br />
    <a href="javascript: showContent()">Show Content</a><br /><br />
    <div id="tab1" style="background:yellow;width:100px">
        <div id='tc1'>Content Text</div>
    </div>
</body>
</html>

В IE8 нажмите «Скрыть вкладку», а затем «Показать вкладку», все работает нормально.На показанной вкладке нажмите «Скрыть содержимое», затем «Показать содержимое». Это также правильно.Теперь нажмите «Скрыть вкладку» еще раз, и вы увидите, что вкладка исчезла, но содержимое по-прежнему неправильно.

В IE8 проблема исчезает, когда я использую режим совместимости.Кроме того, я заметил, что если я удаляю элемент DOCTYPE, я не могу воспроизвести проблему.

В Chrome (мой личный фаворит) проблема остается постоянной независимо от элемента DOCTYPE.Я не пробовал это в Firefox.

Я уверен, что есть очень веская причина для такого поведения, я также уверен, что для меня будет простое решение, чтобы мои вкладки работали правильно.Я с нетерпением жду ваших комментариев.

Ответы [ 3 ]

17 голосов
/ 21 января 2010

Это связано с тем, что свойство CSS «видимость» наследуется, но не влияет на макет страницы. Поэтому, если вы установите элемент как скрытый, все его дочерние элементы будут, если вы явно не сделаете их видимыми (в этом случае указывается visibility: visible).

Вы должны сбросить свойство CSS для наследования, чтобы получить желаемое поведение. Вы можете сделать это, используя ключевое слово inherit в качестве значения: visibility: inherit

РЕДАКТИРОВАТЬ Или, как Javascript:

element.style.visiblity = 'inherit';
2 голосов
/ 13 декабря 2010

Я предполагаю, что ваш пример упрощен, и в вашем реальном коде у вас есть несколько вкладок. В этом случае я удивляюсь, что опубликованные ответы сработали для вас. Разве вы не хотите, чтобы видимость tc1 сохранялась при возврате к tab1? Если вы это сделаете, то придерживайтесь своей первоначальной идеи, но измените функции вкладки, как показано:

function hideTab(){
    document.getElementById('tab1').style.display = 'none'
}
function showTab(){
    document.getElementById('tab1').style.display = 'block'
}

Обратите внимание, что я изменяю свойство display родительского элемента div, а не свойство видимости.

1 голос
/ 21 января 2010

Вместо того, чтобы устанавливать видимость дочернего элемента в «видимый», установите для него «наследовать» - тогда он будет подчиняться настройке видимости своих родителей вместо того, чтобы переопределять его независимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...