using flexbox to get pinterest or jQuery masonry layout - php
Wanted to know if it is possible to get the same type of design layout as pinterest or jQuery masonry using only the new flexbox layout. Here is as far as I got it:
.flex-container {
display: -webkit-flex;
display: flex;
-webkit-flex-flow: row wrap;
flex-flow: row wrap;
}
.item {
width: 220px;
height: 250px;
margin: 10px auto;
padding: 0;
background: #ccc;
}
.item:nth-child(3n+2) {
background: #aaa;
height: 400px;
}
and the HTML I am just using a PHP loop to create 12 items
<?php
for ($i=0; $i<=11; $i++) {
echo '<div class="item"></div>';
}
?>
It is entirely possible.
Thanks to #leopld's original answer, I was able to create one that does not depend on a fixed height.
By making the flex container position: absolute or position: fixed, you are able to get it to fill the available space dynamically.
Link to the Codepen: http://codepen.io/anon/pen/Jpnyj?editors=110. I included all the vendor prefixes you'd need at this time.
Markup
<div class="wrapper">
<div class="box box-red"></div>
<div class="box box-blue"></div>
<div class="box box-pink"></div>
<div class="box box-purple"></div>
<div class="box box-green"></div>
<div class="box box-yellow"></div>
<div class="box box-brown"></div>
<div class="box box-red"></div>
<div class="box box-blue"></div>
<div class="box box-pink"></div>
<div class="box box-purple"></div>
<div class="box box-green"></div>
<div class="box box-purple"></div>
<div class="box box-green"></div>
<div class="box box-yellow"></div>
<div class="box box-blue"></div>
<div class="box box-pink"></div>
<div class="box box-purple"></div>
<div class="box box-green"></div>
<div class="box box-yellow"></div>
<div class="box box-red"></div>
<div class="box box-brown"></div>
<div class="box box-blue"></div>
<div class="box box-red"></div>
<div class="box box-green"></div>
<div class="box box-yellow"></div>
<div class="box box-brown"></div>
</div>
Styles
body {
background: black;
}
.wrapper {
position: absolute;
width: 100%;
height: 100%;
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-flow: column wrap;
-ms-flex-flow: column wrap;
flex-flow: column wrap;
-webkit-box-align: stretch;
-webkit-align-items: stretch;
-ms-flex-align: stretch;
align-items: stretch;
-webkit-align-content: stretch;
-ms-flex-line-pack: stretch;
align-content: stretch;
}
.box {
margin: 5px;
-webkit-box-flex: 0;
-webkit-flex: 0 1 auto;
-ms-flex: 0 1 auto;
flex: 0 1 auto;
}
.box-red {
height: 100px;
background: red;
}
.box-blue {
height: 120px;
background: blue;
}
.box-pink {
height: 144px;
background: pink;
}
.box-purple {
height: 250px;
background: purple;
}
.box-green {
height: 200px;
background: green;
}
.box-yellow {
height: 20px;
background: yellow;
}
.box-brown {
height: 290px;
background: brown;
}
CSS3's columns will get you pretty close to that layout. (Note that support in non-recent browsers may be poor, and the spec may change in the future.) The other example didn't work with FF, but this one does:
HTML:
<div id="wrapper">
<div id="cols">
<div class="item">
<img src="http://placekitten.com/400/700?image=1" />
<p>0) Craft beer farm-to-table.</p>
</div>
<div class="item">
<img src="http://placekitten.com/400/450?image=2" />
<p>1) Mollit wolf veniam, leggings art party semiotics Brooklyn High Life sustainable occaecat Banksy actually.</p>
</div>
[more items]
</div>
</div>
CSS:
h1, h2, ul, p { margin: 1rem; }
#wrapper {
width: 900px;
margin: 20px auto;
padding: 10px;
outline: solid black 1px;
background-color: gainsboro;
}
#cols {
-webkit-column-count: 3;
-webkit-column-gap: 10px;
-moz-column-count: 3;
-moz-column-gap: 10px;
column-count: 3;
column-gap: 10px;
}
.item {
display: inline-block;
background: #FEFEFE;
margin: 0;
-webkit-column-break-inside: avoid;
-moz-column-break-inside: avoid;
column-break-inside: avoid;
padding: 10px;
}
.item img {
width: 100%;
border-bottom: 1px solid black;
padding-bottom: 10px;
margin-bottom: 5px;
}
.item p {
font-size:small;
margin: 0;
}
Or play with the full example.
Update: To my knowledge, there is no way of doing this with Flexbox. Flexbox is more concerned with horizontal layout, not vertical. I would be happy to be proven wrong, but that’s what I’ve gathered from my limited experience with it. If you want to learn more, the best article I’ve found on the matter is this: http://css-tricks.com/snippets/css/a-guide-to-flexbox/ (Yes, of course it’s Chris Coyier. How’d you ever guess?)
In any case, even if you can do it with Flexbox it would be a bit of a hack, because that isn’t what Flexbox is for. There’s a much cleaner way of doing it with CSS3 columns. Here’s an example.
Browser support isn't the greatest though: http://caniuse.com/#search=column%20layout Even this example doesn't seem to support Firefox, although I haven't a clue why, since FF does indeed support the respective properties, according to CanIUse.
So, a summary and TLDR: it's an admirable idea, doing this in pure CSS, but for most practical purposes is impossible at the moment. You would probably be better to go with JQuery Masonry
You can actually do it without any greater hassle using flexbox. The only drawback is that you have to specify an absolute height for the wrapper, in order to make the content of it actually wrap. Otherwise it would all be laid out along one great, never ending column.
The HTML:
<div class="wrapper">
<div class="red"></div>
<div class="blue"></div>
<div class="pink"></div>
<div class="purple"></div>
<div class="green"></div>
<div class="yellow"></div>
<div class="brown"></div>
</div>
The (unprefixed) CSS:
.wrapper {
background: black;
display: flex;
flex-flow: column wrap;
height: 450px;
align-items: center;
}
.wrapper > div {
height: 100px;
margin: 5px;
width: 100px;
}
.wrapper > :nth-child(3n+2) {
border: 2px solid white;
height: 300px;
}
I made a JS Fiddle as well, so you can see the result directly.
In a nutshell however, the trick is to use flex-direction: column in combination with flex-wrap: wrap and a fixed height for the wrapper.
I have to add, though - this seems like just the scenario that the CSS columns spec was written for, so KatieK's solution might be a better way to go. Above all, one doesn't need to specify a fixed height for the wrapper when using CSS columns instead of flexbox.
Related
Having problems centering a textbox in CSS
I have the following code in PHP: <div class="col-lg-4 col-sm-6"> <br> <a class="portfolio-box"> <div class="project-category">test-category</div> <img class="img-fluid" src="assets/img/portfolio/5.jpg" alt="" /> <div class="portfolio-box-caption"> <div class="br"></div> <div class="project-category text-white-50">test-category</div> <div class="project-name">test-name</div> <div class="br"></div> <div class="project-description">test-description</div> <div class="br"></div> </div> </a> </div> This code creates the following box: The respective CSS code looks like this: #portfolio .container-fluid .portfolio-box .portfolio-box-caption, #portfolio .container-sm .portfolio-box .portfolio-box-caption, #portfolio .container-md .portfolio-box .portfolio-box-caption, #portfolio .container-lg .portfolio-box .portfolio-box-caption, #portfolio .container-xl .portfolio-box .portfolio-box-caption { display: flex; align-items: center; justify-content: center; flex-direction: column; width: 95%; height: auto; position: absolute; bottom: 0; text-align: center; opacity: 0; color: #fff; background: #963d32; transition: opacity 0.25s ease; padding-left: 40px; padding-right: 30px; padding-top: 15px; padding-bottom: 15px; } #portfolio .img-fluid { max-width: 95%; height: auto; } However - no matter what I do - the textbox over the picture (as you can see in the picture above) is never perfectly centered. How can I center the textbox over the picture? Best
Changing the margin-left to 2.5% solved the problem for me. Thank you very much #bartholomew
How do I stack two landscape pictures on top of each other with a portrait picture on the side?
link to example Getting the black portrait box is easy, but how do I create something like the two red boxes right on top of each other? I know one solution is to export the two landscapes with the gap as one image and put it in as a portrait but I'd prefer to not do it like that.
This is a start for you. .row { display: flex; } .row div { width: 50%; } div { margin: 20px; } img { width:100% } <div class="container"> <div class="row"> <div class="first"> <img src="https://placehold.it/400x800/ccc/666?text=" class="img-responsive" alt=""> </div> <div class="two"> <img src="https://placehold.it/400x400/ccc/666?text=" class="img-responsive" alt=""> <img src="https://placehold.it/400x400/ccc/666?text=" class="img-responsive" alt=""> </div> </div> </div>
<div class="main"> <div class="flexbox"> <div class="row"><img src="https://via.placeholder.com/150"/> </div> <div class="row image-wrapper"> <div class="col"><img src="https://via.placeholder.com/150"></div> <div class="col"><img src="https://via.placeholder.com/150"></div> </div> <div> </div> .main { width: 500px; } .flexbox { width: 100%; display: flex; flex-wrap: wrap; } .col { width: 100%; height: 250px; box-sizing: border-box; padding: 10px; } .col img { background: red; width: 100%; height: 100%; } .row { width: 50%; height: 500px; padding: 10px; box-sizing: border-box; } .row img { background: black; width: 100%; height: 100%; } .row.image-wrapper { padding: 0; } https://codepen.io/stargroup0075/pen/ExjMPXK
How do you create a grid dynamically in PHP?
I'm trying to create a mini-message board. I am using divs for each of the messages but I want to organise the divs in a grid. The grid should be flexible and responsive meaning that the number of columns and rows should dynamically change as the screen size does. This is what I have done so far but it does not seem to work: <div class="grid-container"> <?php while($row = $result->fetch_assoc() ){ display($row['name'],$row['date'],$row['message']); } } function display($name, $date, $message){ echo '<div class="flip-card grid-item"> <div class="flip-card-inner"> <div class="flip-card-front"> <p class="message">'.$message.'</p> </div> <div class="flip-card-back"> <h1 class="nameTitle"> '.$name.'</h1> <p class="dateTitle">'.$date.'</p> </div> </div> </div>'; } ?> </div> I know that the code for the displaying the information from the database works because the divs do appear. It's just they don't appear in a grid. Thanks in advance for help!
I would recommend you FlexBox. .body{ height: 100vh; } .column-wrapper { height: inherit; display: flex; flex-flow: row wrap; justify-content: space-around; } .column { background: tomato; padding: 5px; width: 200px; height: 150px; margin-top: 10px; line-height: 150px; color: white; font-weight: bold; font-size: 3em; text-align: center; } </style> A simple example here: https://jsfiddle.net/04yxfwLg/1/ The trick is using justify-content to space-around More on flexbox can be found on this amazing article.
Footer moving and sticking on lower resolutions
I'm trying to build a page with a footer. It looks fine in 1600x900, but as soon as I scale down the footer moves to dead center and won't budge. Any suggestions would be appreciated #Container{ width: 100%; height: 100%; position: absolute; } #Banner_Container { position:relative; width: 100%; padding-bottom: 0.2%; } #Banner { color: #FF7538; font-style: oblique; font-family: Courier New; line-height: 1; float: left; } #Index { width: 80%; background: rgba(250, 250, 250, 0.9); border: 10px solid #ED9121; border-style: outset; padding-top: 2%; float:left; padding-bottom: 2%; position: absolute; margin-top: 30%; min-width: 10%; max-width: 80%; } #nav { position: absolute; margin: 0; font-family: 'Roboto Condensed'; width: 15%; float: right; border: 5px solid #ED9121; border-style: inset; margin-top: 35%; margin-left: 82%; min-width: 5%; max-width: 20%; } #footer{ width: 100%; height: 50px; position: absolute; margin-top: 110%; } I was requested to do this in PHP index.php <?php echo "<div id='Container'>"; include("banner.php"); include("navbar.php"); include("intro.php"); include("footer.php"); echo"</div>"; ?> So I have it separated like this intro.php <?php echo "<div id='Index'> <div id='Info'> <img align='left' src='images/stock1.jpg'/> <h2 align='left'>Welcome to East End Dental</h2> <p>Ipsum</p><br><br><br><br><br><br><br><br><br><br> <img align='right' src='images/stock2.jpg'/><br> <h2 align='left'>Quality Guarantee</h2> <p>Ipsum</p><br><br><br><br><br><br><br><br><br><br><br><br> <div id='summary1'> <center><h2>Our Dental Services</h2> <img src='images/stock3.jpg'/></center> <p>Ipsum<br><br></p> </div> <div id='summary2'> <center><h2>Meet the Staff</h2> <a href='staff.php'><img src='images/stock4.jpg'/></a </center> <p>Ipsum.</p> </div> <div id='summary1'> <center><h2>Contact Us Today</h2> <img src='images/stock5.jpg'/></center> <p>Ipsum</p><br><br> </div> </div> </div>"; ?> footer.php <?php echo" <div id='footer'> <center> <p>Company Name 2016<br/> Designed by <a href='mailto:email#gmail.com'>Name</a></p> <a href='index.php'>Home</a> | <a href='services.php'>Services</a> | <a href='cerec.php'>CEREC®</a> | <a href='staff.php'>Staff</a> | <a href='contact.php'>Contact</a> </center> </div>"; ?>
The problem is that you have the footer's margin-top set to 110% which will cause the footer to move around at different screen sizes. Percentage-based values are relative and change depending upon the parent container. I made a JSFiddle to show what this looks like with your code. The problem is faithfully reproducible by resizing the web browser. To begin to fix this change your footer CSS. If you wanted a sticky/persistent footer that should would look something like this: #footer{ width: 100%; height: 50px; position: absolute; bottom: -50px; } I made a JSFiddle showing the solution so you can see this in action. This should address the footer floating to another location when the browser window resizes or is shown on a different device. If you want the footer to just be at the bottom of the page and not stick there you would make this modification to the CSS: #footer{ width: 100%; height: 50px; display: block; clear: both; } This will just make sure the footer stays at the bottom of the content within the page and doesn't appear on the side of the previous element. Since you didn't specify if you were going for a stick footer I'm putting this in just to cover this other scenario. In any case, hopefully this is the info you need to move forward on your website.
how to center a div on a page [duplicate]
How can I horizontally center a <div> within another <div> using CSS? <div id="outer"> <div id="inner">Foo foo</div> </div>
With flexbox it is very easy to style the div horizontally and vertically centered. #inner { border: 0.05em solid black; } #outer { border: 0.05em solid red; width:100%; display: flex; justify-content: center; } <div id="outer"> <div id="inner">Foo foo</div> </div> To align the div vertically centered, use the property align-items: center. Other Solutions You can apply this CSS to the inner <div>: #inner { width: 50%; margin: 0 auto; } Of course, you don't have to set the width to 50%. Any width less than the containing <div> will work. The margin: 0 auto is what does the actual centering. If you are targeting Internet Explorer 8 (and later), it might be better to have this instead: #inner { display: table; margin: 0 auto; } It will make the inner element center horizontally and it works without setting a specific width. Working example here: #inner { display: table; margin: 0 auto; border: 1px solid black; } #outer { border: 1px solid red; width:100% } <div id="outer"> <div id="inner">Foo foo</div> </div>
If you don't want to set a fixed width on the inner div you could do something like this: #outer { width: 100%; text-align: center; } #inner { display: inline-block; } <div id="outer"> <div id="inner">Foo foo</div> </div> That makes the inner div into an inline element that can be centered with text-align.
The best approaches are with CSS3. The old box model (deprecated) display: box and its properties box-pack, box-align, box-orient, box-direction etc. have been replaced by flexbox. While they may still work, they are not recommended to be used in production. #outer { width: 100%; /* Firefox */ display: -moz-box; -moz-box-pack: center; -moz-box-align: center; /* Safari and Chrome */ display: -webkit-box; -webkit-box-pack: center; -webkit-box-align: center; /* W3C */ display: box; box-pack: center; box-align: center; } #inner { width: 50%; } <div id="outer"> <div id="inner">Foo foo</div> </div> According to your usability you may also use the box-orient, box-flex, box-direction properties. The modern box model with Flexbox #outer { display: flex; flex-direction: row; flex-wrap: wrap; justify-content: center; align-items: center; } Read more about centering the child elements CSS Box Model Module Level 3 Box model (CSS2) box-align on MDN And this explains why the box model is the best approach: Why is the W3C box model considered better?
#centered { position: absolute; left: 50%; margin-left: -100px; } <div id="outer" style="width:200px"> <div id="centered">Foo foo</div> </div> Make sure the parent element is positioned, i.e., relative, fixed, absolute, or sticky. If you don't know the width of your div, you can use transform:translateX(-50%); instead of the negative margin. With CSS calc(), the code can get even simpler: .centered { width: 200px; position: absolute; left: calc(50% - 100px); } The principle is still the same; put the item in the middle and compensate for the width.
I've created this example to show how to vertically and horizontally align. The code is basically this: #outer { position: relative; } and... #inner { margin: auto; position: absolute; left:0; right: 0; top: 0; bottom: 0; } And it will stay in the center even when you resize your screen.
Some posters have mentioned the CSS 3 way to center using display:box. This syntax is outdated and shouldn't be used anymore. [See also this post]. So just for completeness here is the latest way to center in CSS 3 using the Flexible Box Layout Module. So if you have simple markup like: <div class="box"> <div class="item1">A</div> <div class="item2">B</div> <div class="item3">C</div> </div> ...and you want to center your items within the box, here's what you need on the parent element (.box): .box { display: flex; flex-wrap: wrap; /* Optional. only if you want the items to wrap */ justify-content: center; /* For horizontal alignment */ align-items: center; /* For vertical alignment */ } .box { display: flex; flex-wrap: wrap; /* Optional. only if you want the items to wrap */ justify-content: center; /* For horizontal alignment */ align-items: center; /* For vertical alignment */ } * { margin: 0; padding: 0; } html, body { height: 100%; } .box { height: 200px; display: flex; flex-wrap: wrap; justify-content: center; align-items: center; border: 2px solid tomato; } .box div { margin: 0 10px; width: 100px; } .item1 { height: 50px; background: pink; } .item2 { background: brown; height: 100px; } .item3 { height: 150px; background: orange; } <div class="box"> <div class="item1">A</div> <div class="item2">B</div> <div class="item3">C</div> </div> If you need to support older browsers which use older syntax for flexbox here's a good place to look.
If you don't want to set a fixed width and don't want the extra margin, add display: inline-block to your element. You can use: #element { display: table; margin: 0 auto; }
Centering a div of unknown height and width Horizontally and vertically. It works with reasonably modern browsers (Firefox, Safari/WebKit, Chrome, Internet & Explorer & 10, Opera, etc.) .content { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); } <div class="content">This works with any content</div> Tinker with it further on Codepen or on JSBin.
Set the width and set margin-left and margin-right to auto. That's for horizontal only, though. If you want both ways, you'd just do it both ways. Don't be afraid to experiment; it's not like you'll break anything.
It cannot be centered if you don't give it a width. Otherwise, it will take, by default, the whole horizontal space.
CSS 3's box-align property #outer { width: 100%; height: 100%; display: box; box-orient: horizontal; box-pack: center; box-align: center; }
The way I usually do it is using absolute position: #inner{ left: 0; right: 0; margin-left: auto; margin-right: auto; position: absolute; } The outer div doesn't need any extra properties for this to work.
I recently had to center a "hidden" div (i.e., display:none;) that had a tabled form within it that needed to be centered on the page. I wrote the following jQuery code to display the hidden div and then update the CSS content to the automatic generated width of the table and change the margin to center it. (The display toggle is triggered by clicking on a link, but this code wasn't necessary to display.) NOTE: I'm sharing this code, because Google brought me to this Stack Overflow solution and everything would have worked except that hidden elements don't have any width and can't be resized/centered until after they are displayed. $(function(){ $('#inner').show().width($('#innerTable').width()).css('margin','0 auto'); }); <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="inner" style="display:none;"> <form action=""> <table id="innerTable"> <tr><td>Name:</td><td><input type="text"></td></tr> <tr><td>Email:</td><td><input type="text"></td></tr> <tr><td>Email:</td><td><input type="submit"></td></tr> </table> </form> </div>
For Firefox and Chrome: <div style="width:100%;"> <div style="width: 50%; margin: 0px auto;">Text</div> </div> For Internet Explorer, Firefox, and Chrome: <div style="width:100%; text-align:center;"> <div style="width: 50%; margin: 0px auto; text-align:left;">Text</div> </div> The text-align: property is optional for modern browsers, but it is necessary in Internet Explorer Quirks Mode for legacy browsers support.
Use: #outerDiv { width: 500px; } #innerDiv { width: 200px; margin: 0 auto; } <div id="outerDiv"> <div id="innerDiv">Inner Content</div> </div>
Another solution for this without having to set a width for one of the elements is using the CSS 3 transform attribute. #outer { position: relative; } #inner { position: absolute; left: 50%; transform: translateX(-50%); } The trick is that translateX(-50%) sets the #inner element 50 percent to the left of its own width. You can use the same trick for vertical alignment. Here's a Fiddle showing horizontal and vertical alignment. More information is on Mozilla Developer Network.
Chris Coyier who wrote an excellent post on 'Centering in the Unknown' on his blog. It's a roundup of multiple solutions. I posted one that isn't posted in this question. It has more browser support than the Flexbox solution, and you're not using display: table; which could break other things. /* This parent can be any width and height */ .outer { text-align: center; } /* The ghost, nudged to maintain perfect centering */ .outer:before { content: '.'; display: inline-block; height: 100%; vertical-align: middle; width: 0; overflow: hidden; } /* The element to be centered, can also be of any width and height */ .inner { display: inline-block; vertical-align: middle; width: 300px; }
I recently found an approach: #outer { position: absolute; left: 50%; } #inner { position: relative; left: -50%; } Both elements must be the same width to function correctly.
For example, see this link and the snippet below: div#outer { height: 120px; background-color: red; } div#inner { width: 50%; height: 100%; background-color: green; margin: 0 auto; text-align: center; /* For text alignment to center horizontally. */ line-height: 120px; /* For text alignment to center vertically. */ } <div id="outer" style="width:100%;"> <div id="inner">Foo foo</div> </div> If you have a lot of children under a parent, so your CSS content must be like this example on fiddle. The HTML content look likes this: <div id="outer" style="width:100%;"> <div class="inner"> Foo Text </div> <div class="inner"> Foo Text </div> <div class="inner"> Foo Text </div> <div class="inner"> </div> <div class="inner"> </div> <div class="inner"> </div> <div class="inner"> </div> <div class="inner"> </div> <div class="inner"> Foo Text </div> </div> Then see this example on fiddle.
Centering only horizontally In my experience, the best way to center a box horizontally is to apply the following properties: The container: should have text-align: center; The content box: should have display: inline-block; Demo: .container { width: 100%; height: 120px; background: #CCC; text-align: center; } .centered-content { display: inline-block; background: #FFF; padding: 20px; border: 1px solid #000; } <div class="container"> <div class="centered-content"> Center this! </div> </div> See also this Fiddle! Centering both horizontally & vertically In my experience, the best way to center a box both vertically and horizontally is to use an additional container and apply the following properties: The outer container: should have display: table; The inner container: should have display: table-cell; should have vertical-align: middle; should have text-align: center; The content box: should have display: inline-block; Demo: .outer-container { display: table; width: 100%; height: 120px; background: #CCC; } .inner-container { display: table-cell; vertical-align: middle; text-align: center; } .centered-content { display: inline-block; background: #FFF; padding: 20px; border: 1px solid #000; } <div class="outer-container"> <div class="inner-container"> <div class="centered-content"> Center this! </div> </div> </div> See also this Fiddle!
Flexbox display: flex behaves like a block element and lays out its content according to the flexbox model. It works with justify-content: center. Please note: Flexbox is compatible all browsers exept Internet Explorer. See display: flex not working on Internet Explorer for a complete and up to date list of browsers compatibility. #inner { display: inline-block; } #outer { display: flex; justify-content: center; } <div id="outer"> <div id="inner">Foo foo</div> </div> Text-align: center Applying text-align: center the inline contents are centered within the line box. However since the inner div has by default width: 100% you have to set a specific width or use one of the following: display: block display: inline display: inline-block #inner { display: inline-block; } #outer { text-align: center; } <div id="outer"> <div id="inner">Foo foo</div> </div> Margin: 0 auto Using margin: 0 auto is another option and it is more suitable for older browsers compatibility. It works together with display: table. #inner { display: table; margin: 0 auto; } <div id="outer"> <div id="inner">Foo foo</div> </div> Transform transform: translate lets you modify the coordinate space of the CSS visual formatting model. Using it, elements can be translated, rotated, scaled, and skewed. To center horizontally it require position: absolute and left: 50%. #inner { position: absolute; left: 50%; transform: translate(-50%, 0%); } <div id="outer"> <div id="inner">Foo foo</div> </div> <center> (Deprecated) The tag <center> is the HTML alternative to text-align: center. It works on older browsers and most of the new ones but it is not considered a good practice since this feature is obsolete and has been removed from the Web standards. #inner { display: inline-block; } <div id="outer"> <center> <div id="inner">Foo foo</div> </center> </div>
This method also works just fine: div.container { display: flex; justify-content: center; /* For horizontal alignment */ align-items: center; /* For vertical alignment */ } For the inner <div>, the only condition is that its height and width must not be larger than the ones of its container.
The easiest way: #outer { width: 100%; text-align: center; } #inner { margin: auto; width: 200px; } <div id="outer"> <div id="inner">Blabla</div> </div>
Flex have more than 97% browser support coverage and might be the best way to solve these kind of problems within few lines: #outer { display: flex; justify-content: center; }
If width of the content is unknown you can use the following method. Suppose we have these two elements: .outer -- full width .inner -- no width set (but a max-width could be specified) Suppose the computed width of the elements are 1000 pixels and 300 pixels respectively. Proceed as follows: Wrap .inner inside .center-helper Make .center-helper an inline block; it becomes the same size as .inner making it 300 pixels wide. Push .center-helper 50% right relative to its parent; this places its left at 500 pixels wrt. outer. Push .inner 50% left relative to its parent; this places its left at -150 pixels wrt. center helper which means its left is at 500 - 150 = 350 pixels wrt. outer. Set overflow on .outer to hidden to prevent horizontal scrollbar. Demo: body { font: medium sans-serif; } .outer { overflow: hidden; background-color: papayawhip; } .center-helper { display: inline-block; position: relative; left: 50%; background-color: burlywood; } .inner { display: inline-block; position: relative; left: -50%; background-color: wheat; } <div class="outer"> <div class="center-helper"> <div class="inner"> <h1>A div with no defined width</h1> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br> Duis condimentum sem non turpis consectetur blandit.<br> Donec dictum risus id orci ornare tempor.<br> Proin pharetra augue a lorem elementum molestie.<br> Nunc nec justo sit amet nisi tempor viverra sit amet a ipsum.</p> </div> </div> </div>
You can do something like this #container { display: table; width: <width of your container>; height: <height of your container>; } #inner { width: <width of your center div>; display: table-cell; margin: 0 auto; text-align: center; vertical-align: middle; } This will also align the #inner vertically. If you don't want to, remove the display and vertical-align properties;
Here is what you want in the shortest way. JSFIDDLE #outer { margin - top: 100 px; height: 500 px; /* you can set whatever you want */ border: 1 px solid# ccc; } #inner { border: 1 px solid# f00; position: relative; top: 50 % ; transform: translateY(-50 % ); }
You can use display: flex for your outer div and to horizontally center you have to add justify-content: center #outer{ display: flex; justify-content: center; } or you can visit w3schools - CSS flex Property for more ideas.
Well, I managed to find a solution that maybe will fit all situations, but uses JavaScript: Here's the structure: <div class="container"> <div class="content">Your content goes here!</div> <div class="content">Your content goes here!</div> <div class="content">Your content goes here!</div> </div> And here's the JavaScript snippet: $(document).ready(function() { $('.container .content').each( function() { container = $(this).closest('.container'); content = $(this); containerHeight = container.height(); contentHeight = content.height(); margin = (containerHeight - contentHeight) / 2; content.css('margin-top', margin); }) }); If you want to use it in a responsive approach, you can add the following: $(window).resize(function() { $('.container .content').each( function() { container = $(this).closest('.container'); content = $(this); containerHeight = container.height(); contentHeight = content.height(); margin = (containerHeight - contentHeight) / 2; content.css('margin-top', margin); }) });
One option existed that I found: Everybody says to use: margin: auto 0; But there is another option. Set this property for the parent div. It works perfectly anytime: text-align: center; And see, child go center. And finally CSS for you: #outer{ text-align: center; display: block; /* Or inline-block - base on your need */ } #inner { position: relative; margin: 0 auto; /* It is good to be */ }