Reputation: 2126
I have main div which is the position:relative;
and children which is the absolute element.I want to centered them horizontally but there is something strange going on I don't understand.
How can i centered absolute element horizontally with flex? any idea with that ?
body{
background:tomato;
}
.block{
position:relative;
width:700px;
background:white;
padding:10px;
}
.block-item{
width:60px;
height:60px;
position:absolute;
display:flex;
align-items:center;
justify-content:center;
}
.block-item:nth-of-type(1){
left:0;
background:lightgreen;
}
.block-item:nth-of-type(2){
left:5%;
top:25px;
background:lightblue;
}
.block-item:nth-of-type(3){
left:10%;
background:lightgray;
}
<div id="main">
<div class="block">
<div class="block-item"></div>
<div class="block-item"></div>
<div class="block-item"></div>
</div>
</div>
Upvotes: 2
Views: 2394
Reputation: 1751
Update: you can achieve this using margin
as well or position relative
body{
background:tomato;
}
.block{
position:relative;
width:100%;
background:white;
padding:30px 10px 50px 10px;
display:flex;
align-items: center;
justify-content: center;
}
.block-item{
width:60px;
height:60px;
position:relative;
}
.block-item:nth-of-type(1){
background:lightgreen;
left:0;
}
.block-item:nth-of-type(2){
left: -2%;
top: 20px;
background: lightblue;
}
.block-item:nth-of-type(3){
left: -5%;
background:lightgray;
}
<div id="main">
<div class="block">
<div class="block-item"></div>
<div class="block-item"></div>
<div class="block-item"></div>
</div>
</div>
Upvotes: 3
Reputation: 42370
Use position: relative
instead of absolute and add flexbox to block
element. Also adjust left using pixels instead of percentages - see demo below:
body {
background: tomato;
}
.block {
position: relative;
width: 700px;
background: white;
padding: 10px;
display: flex; /* Flexbox here */
justify-content: center;
}
.block-item {
width: 60px;
height: 60px;
/*position: absolute;*/
position: relative;
/*display: flex;
align-items: center;
justify-content: center;*/
}
.block-item:nth-of-type(1) {
left: 0;
background: lightgreen;
}
.block-item:nth-of-type(2) {
left: -20px; /* CHANGED */
top: 25px;
background: lightblue;
}
.block-item:nth-of-type(3) {
left: -50px; /* CHANGED */
background: lightgray;
}
<div id="main">
<div class="block">
<div class="block-item"></div>
<div class="block-item"></div>
<div class="block-item"></div>
</div>
</div>
Upvotes: 1
Reputation: 274374
You don't need absolute position here. You simply need to adjust some margin to achieve this layout:
body {
background: tomato;
}
.block {
background: white;
padding: 10px;
display: flex;
align-items: center;
justify-content: center;
}
.block-item {
width: 60px;
height: 60px;
}
.block-item:nth-of-type(1) {
margin-right: -10px;
background: lightgreen;
}
.block-item:nth-of-type(2) {
margin-right: -10px;
margin-top: 25px;
background: lightblue;
}
.block-item:nth-of-type(3) {
background: lightgray;
}
<div id="main">
<div class="block">
<div class="block-item"></div>
<div class="block-item"></div>
<div class="block-item"></div>
</div>
</div>
Upvotes: 1
Reputation: 3506
Just remove the position:absolute
and use position:relative
and adjust the top left right and center your main div as follow. I hope this solution will be helpful for you.
body {
background: tomato;
}
.block {
max-width: 700px;
position: relative;
padding: 10px;
text-align: center;
background: white;
}
.block-item {
width: 60px;
height: 60px;
position: relative;
display: inline-block;
left: -15px;
margin-bottom: 10px;
}
.block-item:nth-of-type(1) {
left: 0;
background: lightgreen;
}
.block-item:nth-of-type(2) {
background: lightblue;
top: 15px;
}
.block-item:nth-of-type(3) {
background: lightgray;
right: 30px;
left: inherit;
}
<div id="main">
<div class="block">
<div class="block-item"></div>
<div class="block-item"></div>
<div class="block-item"></div>
</div>
</div>
Upvotes: 0
Reputation: 33
You can change css as below.
body{
background:tomato;
}
.block{
position:relative;
width:100%;
background:white;
padding:10px;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
}
.block-item{
width:33%;
height:60px;
margin: 0 auto;
}
.block-item:nth-of-type(1){
left:0;
background:lightgreen;
}
.block-item:nth-of-type(2){
left:5%;
top:25px;
background:lightblue;
}
.block-item:nth-of-type(3){
left:10%;
background:lightgray;
}
and there no change in html
Upvotes: 0
Reputation: 272
.block{
position:relative;
width:700px;
background:white;
padding:10px;
display:flex;
align-items:center;
justify-content:center;
}
Upvotes: 0
Reputation: 184
body{
background:tomato;
}
.block{
position:relative;
width:700px;
background:white;
padding:10px;
}
.block-item{
left: 50%;
transform: translateX(-50%);
width:60px;
height:60px;
position:absolute;
display:flex;
align-items:center;
justify-content:center;
}
.block-item:nth-of-type(1){
background:lightgreen;
}
.block-item:nth-of-type(2){
top:25px;
background:lightblue;
}
.block-item:nth-of-type(3){
background:lightgray;
}
<div id="main">
<div class="block">
<div class="block-item"></div>
<div class="block-item"></div>
<div class="block-item"></div>
</div>
</div>
Upvotes: 0