Изменить элемент отображения не возвращается к стандартным значениям стиля JS

У меня есть функция в JS, которая скрывает элемент parsed:

function hide(id){
  document.getElementById(id).style.display = "none";
}

Как создать функцию, которая возвращает элемент в значение стиля по умолчанию. Например, свойство div display равно "block", так как для изображения есть "inline-block", другие элементы "inline" или списки "list-item". Как вернуть их состояние по умолчанию?

function show(id){
  document.getElementById(id).style.display = "?????";
}

Я знаю, как это сделать в JQuery, но это не вариант.

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

Так как в моем примере есть CSS, в результате style.display = '' устраняет стиль, добавленный с помощью JS, но возвращается к тому, какой стиль добавляется в CSS, я хочу вернуть его значение по умолчанию даже до назначения стилей с помощью CSS.

Я пробовал это, как было предложено в ссылке в одном из комментариев:

elem = document.getElementById(id);
var theCSSprop = window.getComputedStyle(elem,null).getPropertyValue("display");

но в этом случае 'theCSSprop' возвращает "none" для a div, когда я ожидаю "block"

Любые идеи? Спасибо.

Ответ 1

Вам нужно просто присвоить пустое значение:

document.getElementById(id).style.display = "";

Или используя метод removeProperty:

document.getElementById(id).style.removeProperty( 'display' );

Но обратите внимание, что removeProperty не будет работать на IE<9.

Если вы хотите получить исходное значение CSS, вам, вероятно, понадобится получить его из пустого элемента <iframe>. Я создал пример в jsFiddle, как получить текущее значение, используя getComputedStyle и значение iframe в jsFiddle.

Обратите внимание, что getComputedStyle не поддерживает старые версии IE. Он поддерживает IE9 +.

Для IE8 вы должны использовать Element.currentStyle

Ответ 2

Вы можете использовать пользовательские атрибуты

function hide(id){
    var elem = document.getElementById(id);
    //Store prev value
    elem.setAttribute('custom-attr', elem.style.display);
    elem.style.display = "none";
}

function show(id){
    var elem = document.getElementById(id);
    //Set prev value
    elem.style.display = elem.getAttribute('custom-attr');
}

Ответ 3

Вот еще одно решение для получения любого значения по умолчанию любого элемента. Идея следующая:

  • Получить имя узла определенного элемента
  • Добавить фальшивый элемент того же имени node в тело
  • Получить любое значение свойства поддельного элемента.
  • Удалить поддельный элемент.

function getDefaultValue(element, property) {
    var elDefault = document.createElement(element.nodeName);
    document.body.appendChild(elDefault);
    propertyValue = window.getComputedStyle(elDefault,null).getPropertyValue(property);
    document.body.removeChild(elDefault);
  return propertyValue;
}
 function resetPropertyValue (element,propertyName) {
    var propertyDefaultValue = getDefaultValue(element, propertyName);
    if (element.style.setProperty) {
        element.style.setProperty (propertyName, propertyDefaultValue, null);
    } 
    else {
        element.style.setAttribute (propertyName, propertyDefaultValue);
    }
}
#d {
  background: teal;
  display: inline;
}
<button onclick="resetPropertyValue(document.getElementById('d'), 'display')">Try it</button>
<div id="d">test</div>

Ответ 4

Заполнение пустого значения удаляет встроенное переопределение, поэтому исходное значение снова активируется.

function show(id){
    document.getElementById(id).style.display = "";
}

Ответ 5

Так как вы хотите, это значение по умолчанию для элемента, а не то, что в таблице стилей, вы просто хотите установить значение auto.

document.getElementById(id).style.display="auto"

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

Ответ 6

Примечание: Если вы определяете display: none; для класса или тега (либо в отдельном файле css, либо в разделе главы), вышеуказанные методы не будут работать.

Затем вам нужно будет определить, какой тип тега + класс он есть, и вручную назначить значение, специфичное для него.


Вот примеры того, что может не работать:

// In many cases this won't work:
function ShowHide_WillRarelyWork(id, bDisplay) {
    // Note: This will fail if parent is of other tag than element.
    var o = document.getElementById(id);
    if (o == null) return;
    //
    if (bDisplay) {
        o.style.display = 'inherit';
        o.style.visibility = true;
    }
    else {
        o.style.display = 'none';
    }
} // ShowHide_WillRarelyWork(...)

// This will work in most, but not all, cases:
function ShowHide_MayWork(id, bDisplay) {
    // Note: This will fail if element is declared as 'none' in css.
    var o = document.getElementById(id);
    if (o == null) return;
    //
    if (bDisplay) {
        o.style.display = null;
        o.style.visibility = true;
    }
    else {
        o.style.display = 'none';
    }
} // ShowHide_MayWork(...)

Это долго, но, скорее всего, будет работать:

function getDefaultDisplayByTag(sTag) {
    // This is not fully implemented, as that would be very long...
    // See http://www.w3.org/TR/CSS21/sample.html for full list.
    switch (sTag) {
        case 'div':
        case 'ul':
        case 'h1':
        case 'h2':
        case 'h3':
        case 'h4':
        case 'h5':
        case 'h6':      return 'block';
        //
        case 'li':      return 'list-item';
        //
        case 'table':   return 'table';
        //
        case 'td':
        case 'th':      return 'table-cell';
    }
    // Fallback:
    return 'block';
} // getDefaultDisplayByTag(...)
//
function computeDisplay(o) {
    var oFunction = window.getComputedStyle;
    if (oFunction) {
        var oStyle = window.getComputedStyle(o)
        if ((oStyle) && (oStyle.getPropertyValue)) {
            return oStyle.getPropertyValue('display');
        }
    }
    if (window.currentStyle) {
        return window.currentStyle.display;
    }
    return null; // <-- This is going to be a bad day...
} // computeStyle(...)
//
// This will most probably work:
function ShowHideObject_WillProbablyWork(o, bDisplay, bMaybeRecursive) {
    if ((o == null) || (o == undefined) || (o == document) || (o.tagName == undefined)) return;
    //
    if (bDisplay == null) bDisplay = true
    if (!bDisplay) {
        o.style.display = 'none';
    }
    else {
        // First remove any directly set display:none;
        if ((o.style.display == 'none') || (o.style.display == '')) {
            o.style.display = null;
        }
        //
        var sDisplay = null;
        var sDisplayCurrent = computeDisplay(o);
        var oParent = o.parentNode;
        // Was this element hidden via css?
        if ((sDisplayCurrent == null) || (sDisplayCurrent == 'none')) {
            // We must determing a sensible display value:
            var sTag = o.tagName;
            sDisplay = getDefaultDisplayByTag(sTag);
        } // else: if ((sDisplayCurrent != null) && (sDisplayCurrent != 'none'))
        //
        // Make sure visibility is also on:
        if (sDisplay != null) o.style.display = sDisplay;
        o.style.visibility = true;
        //
        if (bMaybeRecursive) {
            // We should travel up the tree and make sure parent are also displayed:
            ShowHideObject_WillProbablyWork(oParent, true, true);
        }
    } // else: if (!bDisplay) ...
    //
} // ShowHideObject_WillProbablyWork(...)
//
// ... and finally:
function ShowHideId_WillProbablyWork(id, bDisplay, bMaybeRecursive)
    var o = document.getElementById(id);
    ShowHideObject_WillProbablyWork(o, bDisplay, bMaybeRecursive)
} // ShowHideId_WillProbablyWork(...)

Конечно, это можно немного сократить; но как это выглядит в моем источнике.