I have a container to be the full window height/width. Inside this container I want a form that's vertically & horizontally centered. Below, I also want a piece of copy on the bottom baseline of the container. Similar to the shitty illustration below. Right now I am only able to have them both centered vertically and can't find a nice way to make the bottom copy pin itself to the bottom of the container.
---------
| |
| |
|<form> |
| |
|<copy> |
---------
.container {
background-color: #eee;
height: 100vh;
width: 100vw;
padding: 1em;
display: flex;
text-align: center;
justify-content: center;
flex-direction: column;
}
form {
}
.bot {
align-self: flex-end;
}
<div class="container">
<form>
<input type="text" />
<button type="submit">submit</button>
</form>
<p class="bot">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Omnis quae quisquam neque cupiditate adipisci magnam facilis, distinctio suscipit possimus hic voluptatibus in illo est id alias unde sapiente ab eius.</p>
</div>
The align-items and display property of CSS is used to align items at the end of the container. Approach: The align-items and display property of CSS are used to align items at the end of the container. To align items at the end of the container, we set the align-items value to flex-end and the display value to flex.
Flex Start positions element at the start of the page. Flex End sets the element to the end of the page. Space Around arranges the items evenly but with spaces between them. The spaces will be equal among all the elements inside a flex-box container, but not outside them.
In addition to the initial value of stretch, you can give align-items a value of flex-start , in which case they align to the start of the container and no longer stretch to the height. The value flex-end moves them to the end of the container on the cross axis.
With auto margins you can group or pack flex items together without extra markup, or shift elements around by applying a margin in the opposite direction (as seen in my original answer). In this case, simply set margin: auto
on the form; this will inform the flex container to center the form within all available space remaining:
.flex-container {
display: flex;
flex-direction: column;
text-align: center;
height: 150px;
width: 400px;
background: #e7e7e7;
}
form {
margin: auto;
}
p {
margin: 0;
}
<div class="flex-container">
<form>
<input type="text" />
<button type="submit">submit</button>
</form>
<p class="bot">
Lorem ipsum dolor sit amet
</p>
</div>
See the other answers here for more insight:
In CSS Flexbox, why are there no "justify-items" and "justify-self" properties?
Can't scroll to top of flex item that is overflowing container
A clever way to "pin" a flex child is to give it an auto
margin in the direction opposite of where you want it to go. In your case, you'd want to set
p.bot {
margin-top: auto;
}
and the paragraph will shift to the bottom of the parent flex container. It works pretty well with simple layouts such as this...
html,
body {
margin: 0;
padding: 0;
}
.container {
background-color: #eee;
height: 100vh;
width: 100vw;
display: flex;
text-align: center;
justify-content: center;
flex-direction: column;
position: relative;
}
form {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.bot {
margin-top: auto;
}
<div class="container">
<form>
<input type="text" />
<button type="submit">submit</button>
</form>
<p class="bot">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Omnis quae quisquam neque cupiditate adipisci magnam facilis, distinctio suscipit possimus hic voluptatibus in illo est id alias unde sapiente ab eius.</p>
</div>
Edit Note, I've also made the form
a nested flexbox within the .container
and set it's height to 100%, which is basically doing the same thing. Michael_B has a good explanation in the comments.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With