Изменить элемент отображения не возвращается к стандартным значениям стиля 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(...)
Конечно, это можно немного сократить; но как это выглядит в моем источнике.