'How to reset margin-bottom to its default value
I'd like to be able to set the margin-bottom
of an element to its default value.
Consider the following example in which there are h1
elements which have their respective margin-bottom
style properties set to 0:
h1 {
border: 1px solid red;
margin-bottom: 0;
}
p {
margin: 0;
}
<h1>First Heading</h1>
<p>Paragraph</p>
<h1 id="normal-margin">Second Heading</h1>
<p>Paragraph</p>
How can I reset the margin-bottom value of #normal-margin
to its initial, default value? Obviously using initial
won't work, as the initial value of margin-bottom
is 0.
I realise in this trivial example I can simply add :not(#normal-margin)
to the style definition of h1
to fix the issue. I would however like a solution which would “undo” the margin and reset it to its initial value.
I’m thinking that I’m going to have to hard-code values into the CSS, which to me seems a bit cheap. Is that the only solution to this problem?
Solution 1:[1]
I think the property you're looking for is unset
.
unset
resets the property to its inherited value if it inherits from its parent or to its initial value if not. Via - Mozilla Docs
jsFiddle: http://jsfiddle.net/AndrewL32/65sf2f66/58/
div {
border: medium solid green;
margin: 10px 0px;
}
h2 {
margin-bottom:10px;
}
/* but make those in the sidebar use the value of the 'color' property (initial value) */
h2.specialHeader {
margin-bottom: unset;
}
<div><h2>Normal Header</h2></div>
<div><h2 class="specialHeader">Special Header</h2></div>
Browser Support:
Chrome: > v.41
FireFox: > v.27
Edge: > v.13
Opera: > v.28
Safari: > v9.1
IE: Not Supported
Solution 2:[2]
Currently it's not possible. In some future, use the revert
keyword
As explained in 7.3. Explicit Defaulting, there are 4 diferent defaulting behaviors:
initial
sets a property to its initial value.In the case of
margin-*
, that's0
.inherit
sets a property to the value of the parent element (or to the initial value for the root element).unset
behaves asinherit
for inherited properties, and asinitial
otherwise.margin-*
are not inherited, so it would produce0
.The behavior of
revert
depends on the origin of the declaration- For user-agent origin, it behaves as
unset
- For user origin, it rolls back the cascade to the user-agent level, so that the specified value is calculated as if no author-level or user-level rules were specified for the property.
- For author origin, it rolls back the cascade to the user level, so that the specified value is calculated as if no author-level rules were specified for the property.
- For user-agent origin, it behaves as
So the behavior you want is revert
's one, i.e.
- The user-agent adds some margin to
h1
elements - One of your (author) declarations removes that margin
revert
rolls back that to the margin defined by the user-agent
Note revert
is a recent addition to the CSS Cascading and Inheritance Level 4 spec, which is still only a draft. Therefore, browsers don't support it yet.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 |