Đặt lại thuộc tính hiển thị CSS về giá trị mặc định


172

Có thể ghi đè thuộc tính hiển thị với giá trị mặc định của nó không? Ví dụ: nếu tôi đã đặt nó thành không theo một kiểu và tôi muốn ghi đè nó theo một kiểu khác với mặc định của nó.

Hoặc là cách duy nhất để tìm ra mặc định của phần tử đó là gì và sau đó đặt nó thành phần tử đó? Muốn biết không phải phần tử thường là khối, nội tuyến hay bất cứ ...


5
Bây giờ có thể sử dụng unset.
phút


1
Tôi biết câu hỏi này chỉ hỏi về việc hiển thị được đặt lại thành mặc định của trình duyệt nhưng đối với nhiều người sẽ truy cập trang này để tìm cách đặt lại tất cả các thuộc tính trở lại mặc định của trình duyệt, hãy sử dụng: .myclass {all: unset; } div {tất cả: chưa đặt; } v.v.
user1254723

Câu trả lời:


155

Các kiểu mặc định của trình duyệt được xác định trong biểu định kiểu tác nhân người dùng, các nguồn mà bạn có thể tìm thấy ở đây . Thật không may, thông số cấp 3 Cascading và thừa kế không xuất hiện để đề xuất cách đặt lại thuộc tính kiểu về mặc định của trình duyệt. Tuy nhiên, có kế hoạch giới thiệu lại một từ khóa cho từ khóa này trong Cascading và thừa kế cấp 4 - nhóm làm việc chỉ đơn giản là chưa đặt tên cho từ khóa này (liên kết hiện nói revert, nhưng nó chưa phải là cuối cùng). Thông tin về hỗ trợ trình duyệt revertcó thể được tìm thấy trên caniuse.com .

Mặc dù thông số kỹ thuật cấp 3 giới thiệu một initialtừ khóa , việc đặt thuộc tính thành giá trị ban đầu sẽ đặt lại nó thành giá trị mặc định như được xác định bởi CSS , không được xác định bởi trình duyệt . Giá trị ban đầu displayinline; điều này được chỉ định ở đây . Các initialtừ khóa liên quan đến giá trị đó, không phải là trình duyệt mặc định. Các thông số kỹ thuật làm cho ghi chú này dưới alltài sản :

Ví dụ: nếu một tác giả chỉ định all: initialtrên một phần tử, nó sẽ chặn tất cả các kế thừa và đặt lại tất cả các thuộc tính, như thể không có quy tắc nào xuất hiện ở cấp độ tác giả, người dùng hoặc tác nhân người dùng của tầng.

Điều này có thể hữu ích cho phần tử gốc của một "widget" được bao gồm trong một trang, không muốn kế thừa các kiểu của trang bên ngoài. Tuy nhiên, lưu ý rằng mọi kiểu "mặc định" được áp dụng cho phần tử đó (chẳng hạn như display: blocktừ biểu định kiểu UA trên các phần tử khối như <div>) cũng sẽ bị xóa bỏ.

Vì vậy, tôi đoán cách duy nhất ngay bây giờ khi sử dụng CSS thuần là tìm kiếm giá trị mặc định của trình duyệt và đặt thủ công theo cách đó:

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

(Một thay thế cho ở trên sẽ là div.foo:not(.bar) { display: inline-block; }, nhưng điều đó liên quan đến việc sửa đổi bộ chọn ban đầu thay vì ghi đè.)


5
À, tại sao các trình duyệt luôn phải quá chậm để có được những thứ tốt và hữu ích: p Và tại sao người dùng phải nâng cấp quá chậm ... dù sao, đó chính xác là những gì tôi muốn!
Svish

1
@Svish: Hóa ra tôi hiểu sai những gì initialthực sự làm. Tôi đã cập nhật câu trả lời của mình.
BoltClock

14
@Svish: CSS xác định các giá trị ban đầu ở cấp thuộc tính, không phải trên cơ sở từng yếu tố như tôi nghĩ ban đầu. Trong ví dụ này, giá trị ban đầu displayluôn là inline( w3.org/TR/CSS21/visuren.html#display-prop ), bất kể đó là trên a divhay a span. Một divphần tử display: blocktheo mặc định theo HTML chứ không phải CSS, do đó, tùy thuộc vào biểu định kiểu UA của trình duyệt div { display: block; }.
BoltClock

1
"CSS xác định các giá trị ban đầu ở cấp thuộc tính, không dựa trên cơ sở từng yếu tố như tôi nghĩ ban đầu." - Tôi thực sự đã phải đọc lại một vài lần để tin nó. (Vì CSS dường như luôn được áp dụng trong (một số loại) bối cảnh phần tử, không hỗ trợ nó ở đây gợi ý một cái gì đó không tầm thường để học - có ai biết lý do không?)
Sz.

1
defaultđã được đổi tên thành revert.
Oriol

29

Nếu sử dụng javascript được cho phép , bạn có thể đặt thuộc displaytính thành một chuỗi trống. Điều này sẽ khiến nó sử dụng mặc định cho thành phần cụ thể đó.

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

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

Đây là một liên kết đến một jsbin .

Điều này thật tuyệt vì bạn không phải lo lắng về các loại màn hình khác nhau để hoàn nguyên (block , inline, inline-block, table-cell, vv).

Nhưng, nó yêu cầu javascript, vì vậy nếu bạn đang tìm kiếm một giải pháp chỉ css, thì đây không phải là giải pháp cho bạn.

Lưu ý: Điều này ghi đè các kiểu nội tuyến, nhưng không phải các kiểu được đặt trong css


11
Lưu ý rằng điều này chỉ hoạt động nếu kiểu được đặt bằng JavaScript hoặc stylethuộc tính nội tuyến ở vị trí đầu tiên. Bạn không thể ghi đè hoặc xóa khai báo khỏi biểu định kiểu bằng phương thức này.
BoltClock

1
@BoltClock Tôi không đồng ý. Đây là một jsfiddle mà tôi nghĩ từ chối những gì bạn đang nói. jsfiddle.net/g45qagt3
thetallweek

8
Xin lỗi, việc sử dụng từ ghi đè của tôi là khó hiểu. Ý tôi là đặt kiểu cho chuỗi trống sẽ chỉ xóa kiểu được áp dụng thông qua stylethuộc tính hoặc bộ cài đặt JavaScript. Bạn vẫn có thể ghi đè một khai báo biểu định kiểu nếu bạn đặt một giá trị cụ thể thông qua JS, nhưng đặt nó thành trống tương đương với việc không đặt nó ở tất cả - khai báo biểu định kiểu sẽ vẫn còn nguyên. Xem fiddle đã sửa đổi: jsfiddle.net/BoltClock/g45qagt3/1
BoltClock

1
Điều đáng chú ý, chuỗi trống đó hoạt động cho bất kỳ thuộc tính nào, không chỉ là "hiển thị"
Artur Beljajev

11

unset display:

Bạn có thể sử dụng giá trị unsethoạt động trong cả Firefox và Chrome .

display: unset;

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

5
unsetcó những vấn đề tương tự như initial. Giá trị của displayý chí sẽ trở thành inline. Xem codepen.io/Gidgidonihah/pen/mwWxEq
Gidgidonihah

OP rõ ràng muốn đặt lại về mặc định cho mỗi phần tử, ví dụ: đặt lại span thành nội tuyến và div để chặn. unsetsẽ không giúp với điều đó vì mỗi thuộc tính của nó và sẽ luôn đặt lại màn hình inline. Hãy xem xét cập nhật câu trả lời của bạn.
krulik

6

Không, nói chung là không thể. Khi một số mã CSS (hoặc HTML) đặt giá trị cho một thuộc tính trên một phần tử, không có cách nào để hoàn tác nó và báo cho trình duyệt sử dụng giá trị mặc định của nó.

Tất nhiên có thể đặt thuộc tính một giá trị mà bạn mong đợi là giá trị mặc định. Điều này có thể làm việc khá rộng rãi nếu bạn đánh dấu vào Rendering phần của HTML5 CR, chủ yếu phản ánh những gì các trình duyệt thực sự làm.

Tuy nhiên, câu trả lời là không có bản quyền vì các trình duyệt có thể có bất kỳ giá trị mặc định nào họ thích. Bạn nên phân tích lý do của việc muốn đặt lại về mặc định là gì; các gốc vấn đề vẫn có thể giải quyết được.


5

Nếu bạn có quyền truy cập vào JavaScript , bạn có thể tạo một phần tử và đọc kiểu tính toán của nó.

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
Xuất hiện, bạn phải thực sự nối phần tử được tạo vào thẻ <body> để có được kiểu tính toán, ít nhất là trong Chrome.
lúm đồng tiền

4

Liên quan đến câu trả lời của BoltClock và John, cá nhân tôi đã gặp vấn đề với từ khóa ban đầu khi sử dụng IE11. Nó hoạt động tốt trong Chrome, nhưng trong IE dường như không có tác dụng.

Theo câu trả lời này, IE không hỗ trợ từ khóa ban đầu: Div display: ban đầu không hoạt động như dự định trong eg10 và chrome 29

Tôi đã thử đặt nó trống thay vì như được đề xuất ở đây: làm thế nào để trở lại bình thường sau khi hiển thị: không có gì cho hàng của bảng

Điều này đã làm việc và đủ tốt cho kịch bản của tôi. Tất nhiên để đặt giá trị ban đầu thực sự, câu trả lời trên là câu trả lời tốt duy nhất tôi có thể tìm thấy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.