Скиньте властивість відображення CSS до значення за замовчуванням


172

Чи можливо замінити властивість відображення за замовчуванням? Наприклад, якщо я встановив його "жоден" в одному стилі, і я хочу його замінити на інший за замовчуванням.

Або це єдиний спосіб дізнатися, що таке елемент за замовчуванням, а потім встановити його для цього? Не хотілося б знати, чи елемент зазвичай блокується, вбудовується чи залежно від того, що ...


5
Тепер це можливо використовувати unset.
хвилини


1
Я знаю, що це питання задає лише питання про скидання дисплея до налаштувань браузера, але для багатьох людей, які відвідують цю сторінку, прагнучи скинути всі атрибути назад до стандартних налаштувань браузера: .myclass {all: unset; } div {all: unset; } тощо
користувач1254723

Відповіді:


155

Стилі браузера за замовчуванням визначені в таблиці стилів його агентських агентів, джерела яких ви можете знайти тут . На жаль, специфікація Cascading and Inheritance 3 рівня, схоже, не пропонує способу відновити властивість стилю до стандартного браузера. Однак є плани знову ввести ключове слово для цього на рівні каскадного і спадкового рівня 4 - робоча група просто ще не визначилася з назвою цього ключового слова (посилання на даний момент говорить revert, але воно не є остаточним). Інформацію про підтримку браузера revertможна знайти на сайті caniuse.com .

Хоча специфікація рівня 3 вводить initialключове слово , встановлення властивості для його початкового значення скидає його на значення за замовчуванням, як визначено CSS , а не як визначено браузером . Початкове значення display- inline; це вказано тут . initialКлючове слово відноситься до цього значення, а НЕ браузер по замовчуванням. Специфікація сама робить цю примітку під allвластивістю :

Наприклад, якщо автор вказує all: initialна елемент, він блокує всі успадкування та скидає всі властивості, як ніби правила не з’являються на рівнях автора, користувача чи агента користувача-каскаду.

Це може бути корисно для кореневого елемента "віджета", який міститься на сторінці, який не бажає успадковувати стилі зовнішньої сторінки. Однак зауважте, що будь-який стиль "за замовчуванням", застосований до цього елемента (наприклад, наприклад, display: blockіз таблиці стилів UA на блокових елементах, таких як <div>), також буде видуто.

Тому я здогадуюсь, що єдиний спосіб використання чистого CSS зараз - це пошук за замовчуванням для браузера та встановлення його вручну:

div.foo { display: inline-block; }
div.foo.bar { display: block; }

(Альтернативою вищесказаному було б div.foo:not(.bar) { display: inline-block; }, але це передбачає зміну вихідного селектора, а не переопрацювання.)


5
Ах, чому браузери завжди повинні бути настільки повільними, щоб отримувати корисні та корисні речі: p І чому користувачі повинні так повільно модернізувати ... все одно, це саме те, що я хотів!
Свиш

1
@Svish: Виявляється, я неправильно тлумачив те, що initialнасправді робить. Я оновив свою відповідь.
BoltClock

14
@Svish: CSS визначає початкові значення на рівні властивості, а не на елементах, як я вважав спочатку. У цьому прикладі початкове значення displayзавжди inline( w3.org/TR/CSS21/visuren.html#display-prop ), незалежно від того, знаходиться воно на a divчи a span. divЕлемент display: blockза замовчуванням в відповідно до HTML , а не CSS, так що до UA таблиці стилів браузера, щоб сказати div { display: block; }.
BoltClock

1
"CSS визначає початкові значення на рівні властивості, а не на елементах, як я вважав спочатку." - Мені фактично довелося перечитати це кілька разів, щоб повірити. (Оскільки CSS, здається, завжди застосовується в (якомусь) елементі контексту, не підтримуючи його тут, можна зробити щось нетривіальне, щоб дізнатися - хтось знає обґрунтування?)
Sz.

1
defaultбуло перейменовано на revert.
Оріол

29

Якщо використання JavaScript дозволено , ви можете встановити для displayвластивості порожній рядок. Це призведе до використання за замовчуванням для цього конкретного елемента.

var element = document.querySelector('span.selector');

// Set display to empty string to use default for that element
element.style.display = '';

Ось посилання на jsbin .

Це добре , тому що вам не доведеться турбуватися про різні типи дисплея , щоб повернутися до ( block, inline, inline-block, table-cellі т.д.).

Але для цього потрібен javascript, тому якщо ви шукаєте рішення, доступне лише для css, то це не для вас рішення.

Примітка. Це переосмислює стилі вбудованих, але не стилі, встановлені в css


11
Зауважте, що це працює лише в тому випадку, якщо стиль встановлено styleв першу чергу за допомогою JavaScript або вбудованого атрибута. За допомогою цього методу ви не можете змінити або видалити декларацію з таблиці стилів.
BoltClock

1
@BoltClock Я не згоден. Ось jsfiddle, який, на мою думку, спростує те, що ви говорите. jsfiddle.net/g45qagt3
thetallweeks

8
Вибачте, моє вживання слова переохолодити було бентежно. Я маю на увазі встановлення стилю до порожнього рядка, видалить лише стиль, застосований за допомогою styleатрибута або JavaScript-сеттера. Ви все ще можете замінити декларацію таблиці стилів, якщо ви встановите конкретне значення через JS, але встановити його порожнім - це рівнозначно, якщо не встановити його взагалі - декларація стилів залишиться недоторканою. Дивіться модифіковану скрипку: jsfiddle.net/BoltClock/g45qagt3/1
BoltClock

1
Варто зазначити, що порожня рядок працює для будь-якої власності, а не лише для "відображення"
Артур Беляєв

11

Видалити display:

Ви можете використовувати значення, unsetяке працює як у Firefox, так і в Chrome .

display: unset;

.foo     { display: none;  }
.foo.bar { display: unset; }

5
unsetмає ті ж проблеми, що і initial. Значення displayстане inline. Дивіться codepen.io/Gidgidonihah/pen/mwWxEq
Gidgidonihah

ОП очевидно хоче скинути значення за замовчуванням для кожного елемента, наприклад, скинути проміжок в рядок і діва для блокування. unsetне допоможе з цим, оскільки його буде вказано на власність, і завжди скине дисплей до inline. Будь ласка, подумайте над оновленням своєї відповіді.
крулик

6

Ні, це взагалі неможливо. Після того, як якийсь код CSS (або HTML) встановлює значення властивості для елемента, немає можливості скасувати його та наказати браузеру використовувати його значення за замовчуванням.

Звичайно, можна встановити для властивості значення, яке, як ви очікуєте, буде значенням за замовчуванням. Це може працювати досить широко, якщо ви переглянете розділ Візуалізація HTML5 CR, в основному відображаючи, що браузери насправді роблять.

Все ж відповідь - «Ні», оскільки у браузерів можуть бути ті значення, які за замовчуванням їм подобаються. Ви повинні проаналізувати, що було причиною того, що хочете повернутись до значень за замовчуванням; оригінальна проблема все ще може бути розв'язана.


5

Якщо у вас є доступ до JavaScript , ви можете створити елемент і прочитати його обчислений стиль.

function defaultValueOfCssPropertyForElement(cssPropertyName, elementTagName, opt_pseudoElement) {
    var pseudoElement = opt_pseudoElement || null;
    var element = document.createElement(elementTagName);
    document.body.appendChild(element);
    var computedStyle = getComputedStyle(element, pseudoElement)[cssPropertyName];
    element.remove();
    return computedStyle;
}

// Usage:
defaultValueOfCssPropertyForElement('display', 'div'); // Output: 'block'
defaultValueOfCssPropertyForElement('content', 'div', ':after'); // Output: 'none'

1
З'явилося, що вам потрібно фактично додати згенерований елемент до тегу <body>, щоб отримати обчислений стиль, принаймні в Chrome.
dimplex

4

Щодо відповіді BoltClock та Джона, у мене особисто були проблеми з початковим ключовим словом під час використання IE11. Це добре працює в Chrome, але в IE, здається, це не має ефекту.

Відповідно до цієї відповіді IE не підтримує початкове ключове слово: Div-дисплей: початковий не працює за призначенням у ie10 та chrome 29

Я спробував встановити його порожнім замість запропонованого тут: як повернути нормальне значення після відображення: жодне для рядка таблиці

Це спрацювало і було досить добре для мого сценарію. Звичайно, щоб встановити реальне початкове значення, вищевказана відповідь - єдине добре, що я міг знайти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.