html - Inline-Flex messes with vertical align -
having inline item next inline-flex nested flex box messes vertical alignment (it ignores top margin), 1 solution found put ::before in inline-flex item, i'm not sure why fixes it.
the first 1 ignores top margin on label, top margin works on second one, because of ::before.
label { margin: 20px 5px 0 0; } .input-container { display: inline-flex; } .with-before::before { content: ''; } .buttons { display: flex; flex-direction: column; } <div> <label>top margin ignored:</label> <div class="input-container"> <div class="buttons"> <button><</button> <button>></button> </div> <input type="text"/> </div> </div> <br/> <div> <label>top margin works:</label> <div class="input-container with-before"> <div class="buttons"> <button><</button> <button>></button> </div> <input type="text"/> </div> </div>
the label element inline-level default. such, ignores vertical margins (and padding , height).
8.3 margin properties:
margin-top,margin-right,margin-bottom,margin-left, ,margin[
margin-top,margin-bottom] have no effect on non-replaced inline elements.
however, inline-level elements subject vertical-align property, , default value baseline, means align vertically per inline content, such images, inputs or text.
you can override behavior value, such bottom.
label { margin: 20px 5px 0 0; vertical-align: bottom; } .input-container { display: inline-flex; } button { display: flex; flex-direction: column; } <div> <label>top margin ignored:</label> <div class="input-container"> <div class="buttons"> <button><</button> <button>></button> </div> <input type="text" /> </div> </div> <br/> <div> <label>top margin works:</label> <div class="input-container with-before"> <div class="buttons"> <button><</button> <button>></button> </div> <input type="text" /> </div> </div> as how ::before pseudo-element "fixes" problem, here 2 comments / observations:
adding
::beforepseudo-element does not top margin work. if remove margin, you'll see label still aligned bottom pseudo.i think pseudo – when empty – shifts label down because establishes new baseline container. however, if add content (i tried
content: "x"), label shifts right top.
i'm pretty sure related shifting baseline. again, override baseline value in vertical-align bottom, middle or top.
more information:
Comments
Post a Comment