CSS görüntüleme özelliğini varsayılan değerine sıfırla


172

Display özelliğini varsayılan değeri ile geçersiz kılmak mümkün mü? Örneğin, bir stilde hiçbirine ayarlamazsam ve varsayılanı ile farklı bir şekilde geçersiz kılmak istersem.

Ya da o öğenin varsayılanının ne olduğunu bulmanın ve sonra onu bu şekilde ayarlamanın tek yolu mu? Elemanın genellikle blok, satır içi veya hangisi olduğunu bilmek istemezsiniz ...


5
Artık kullanmak mümkün unset.
dakika


1
Bu soruyu yalnızca ekranın tarayıcı varsayılanlarına sıfırlanmasını soruyor, ancak bu sayfayı ziyaret eden birçok kişi için tarayıcı özelliklerini varsayılan ayarlara geri döndürmek isteyen birçok kişi için şunu biliyorum: .myclass {all: unset; } div {all: unset; } vb.
user1254723

Yanıtlar:


155

Tarayıcının varsayılan stilleri, kaynaklarını burada bulabileceğiniz kullanıcı aracısı stil sayfasında tanımlanır . Ne yazık ki, Basamaklı ve Devralma düzeyi 3 spesifikasyonu , bir stil özelliğini tarayıcı varsayılanına sıfırlamanın bir yolunu önermiyor gibi görünüyor. Bununla birlikte, bunun için bir anahtar kelimeyi Basamaklı ve Kalıtım düzeyi 4'te yeniden sunma planları vardır - çalışma grubu henüz bu anahtar kelime için bir isme yerleşmedi (bağlantı şu anda söylüyor revert, ancak nihai değil). Tarayıcı desteği hakkında bilgi caniuse.comrevert adresinde bulunabilir .

Düzey 3 Spec bir tanıtmak yok iken initialanahtar kelimeyi onun bir özelliğini ayarlayarak, başlangıç değeri o varsayılan değerine resetlemelerin CSS ile tanımlanan , değil tarayıcı tarafından tanımlanan . Başlangıç değeri displayIS inline; bu burada belirtilir . initialAnahtar kelime bu değerin değil, tarayıcı varsayılan ifade eder. Özelliğin kendisi bu notu allmülk altında yapar :

Örneğin, yazar all: initialbir öğeyi belirtirse , basamaklamanın yazar, kullanıcı veya kullanıcı-aracı düzeylerinde hiçbir kural görünmüyormuş gibi tüm mirasları engeller ve tüm özellikleri sıfırlar.

Bu, bir sayfada bulunan ve dış sayfanın stillerini devralmak istemeyen bir "widget'in" kök öğesi için yararlı olabilir. Bununla birlikte, söz konusu öğeye uygulanan herhangi bir "varsayılan" stilin (örneğin display: block, blok öğeleri üzerindeki UA stil sayfasından <div>) da uçacağını unutmayın.

Bu yüzden şu anda saf CSS kullanarak tek yolu tarayıcı varsayılan değerini aramak ve manuel olarak ayarlamaktır sanırım:

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

(Yukarıdakilere bir alternatif olabilir div.foo:not(.bar) { display: inline-block; }, ancak bu geçersiz kılma yerine orijinal seçicinin değiştirilmesini içerir.)


5
Ah, tarayıcılar neden iyi ve kullanışlı şeyleri almak için her zaman bu kadar yavaş olmalı: p Ve kullanıcılar neden bu kadar yavaş yükseltiyor olmalı ... neyse, tam olarak istediğim şey bu!
Svish

1
@Svish: initialAslında ne yaptığını yanlış anladım . Cevabımı güncelledim.
BoltClock

14
@Svish: CSS, başlangıçta düşündüğüm gibi öğe başına değil, özellik düzeyinde başlangıç ​​değerlerini tanımlar. Bu örnekte, başlangıç ​​değeri a veya a olsun display, her zaman inline( w3.org/TR/CSS21/visuren.html#display-prop ) olur . Bir unsurdur varsayılan olarak HTML e göre değil, CSS, bu yüzden söylemek için tarayıcının UA stil sayfasına kalmış . divspandivdisplay: blockdiv { display: block; }
BoltClock

1
"CSS, başlangıçta düşündüğüm gibi öğe başına değil, özellik düzeyinde başlangıç ​​değerlerini tanımlar." - Aslında inanmak için birkaç kez tekrar okumak zorunda kaldım. (CSS her zaman eleman bağlamında (bir tür) uygulanmış gibi göründüğünden, burada desteklenmemesi öğrenmesi önemsiz bir şey olduğunu düşündürmektedir - kimse mantığı biliyor mu?)
Sz.

1
defaultolarak yeniden adlandırıldı revert.
Oriol

29

Javascript kullanımına izin veriliyorsa , displayözelliği boş bir dizeye ayarlayabilirsiniz . Bu, söz konusu öğenin varsayılan değerini kullanmasına neden olur.

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

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

İşte bir jsbin bağlantısı .

Eğer (geri dönmek için ekranın farklı türleri hakkında endişe gerekmez, çünkü bu güzel block, inline, inline-block, table-cell, vs).

Ancak, javascript gerektirir, bu yüzden sadece bir css çözümü arıyorsanız, o zaman bu sizin için bir çözüm değildir.

Not: Bu satır içi stilleri geçersiz kılar, ancak css'de ayarlanmış stilleri geçersiz kılmaz


11
Bunun yalnızca stil styleilk etapta JavaScript veya satır içi özellik kullanılarak ayarlanmışsa işe yarar . Bu yöntemi kullanarak stil sayfasındaki bir bildirimi geçersiz kılamaz veya kaldıramazsınız.
BoltClock

1
@BoltClock Kabul etmiyorum. İşte söylediklerinizi çürüttüğünü düşündüğüm bir jsfiddle. jsfiddle.net/g45qagt3
thetallweeks

8
Üzgünüm, geçersiz kılma kelimesini kullanmam kafa karıştırıcıydı. Boş dizeye bir stil ayarlamak, yalnızca styleöznitelik veya JavaScript ayarlayıcı aracılığıyla uygulanan bir stili kaldıracak . JS aracılığıyla belirli bir değer ayarlarsanız stil sayfası bildirimini geçersiz kılabilirsiniz, ancak değer olarak boş olarak ayarlanması, hiç ayarlanmamasına eşdeğerdir - stil sayfası bildirimi bozulmadan kalır. Değiştirilmiş kemanı görün: jsfiddle.net/BoltClock/g45qagt3/1
BoltClock

1
Unutulmaya değer, boş dize sadece "ekran" için değil, herhangi bir özellik için çalışır
Artur Beljajev

11

Ayarsız display:

unsetHem Firefox hem de Chrome'da çalışan değeri kullanabilirsiniz .

display: unset;

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

5
unsetile aynı problemlere sahiptir initial. Değeri displayolacak inline. Bkz. Codepen.io/Gidgidonihah/pen/mwWxEq
Gidgidonihah

OP açıkça her eleman için varsayılan değere sıfırlamak ister, örneğin açıklığı satır içi ve bloklamak için bir div. unsetonun özelliklerinden beri bu konuda yardımcı olmaz ve her zaman ekranı sıfırlar inline. Lütfen yanıtınızı güncellemeyi düşünün.
krulik

6

Hayır, genellikle mümkün değildir. Bazı CSS (veya HTML) kodu bir öğedeki bir özellik için bir değer ayarladıktan sonra, bu öğeyi geri almanın ve tarayıcıya varsayılan değerini kullanmasını söylemenin bir yolu yoktur.

Elbette bir özelliği varsayılan değer olmasını beklediğiniz bir değer ayarlamak mümkündür . HTML5 CR'nin Oluşturma bölümünü kontrol ederseniz , çoğunlukla tarayıcıların gerçekte ne yaptığını yansıtırsanız bu oldukça yaygın olabilir .

Yine de cevap “Hayır” dır, çünkü tarayıcılar istedikleri varsayılan değerlere sahip olabilir. Varsayılanlara sıfırlamak istemenin nedenini analiz etmelisiniz; Orijinal Sorun hala çözülebilir olabilir.


5

Eğer siz erişebilir JavaScript , bir unsuru oluşturmak ve bilgisayarlı tarzını okuyabilirsiniz.

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
Görünüşe göre, en azından Chrome'da, hesaplanan stili elde etmek için oluşturulan öğeyi <body> etiketine eklemeniz gerekiyor.
dimplex

4

BoltClock ve John'un cevabı ile ilgili olarak, IE11'i kullanırken kişisel olarak ilk anahtar kelimeyle ilgili sorunlar yaşadım. Chrome'da iyi çalışıyor, ancak IE'de hiçbir etkisi yok gibi görünüyor.

Bu cevaba göre IE ilk anahtar kelimeyi desteklemiyor: Div ekranı: ilk ie10 ve chrome 29'da amaçlandığı gibi çalışmıyor

Burada önerildiği gibi boş ayarlamaya çalıştım: ekrandan sonra normale nasıl geri dönülür: tablo satırı için yok

Bu işe yaradı ve benim senaryom için yeterince iyiydi. Tabii ki gerçek başlangıç ​​değerini ayarlamak için yukarıdaki cevap bulabildiğim tek iyi cevaptır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.