Can't vertically center my logo - css

On my page the top left logo isn't centered. Here's my code:
.header_col1 {
float: left;
width: 20%;
background: #009240;
text-align: center;
position: relative;
}
.header_col1 a { /* my logo */
display: inline-block;
vertical-align: middle;
}
Yet according to articles I've read this technique should work. Why not in this case? I don't want to use absolute positioning because the green area around the logo descreases in size in smaller resolutions and logo must do so too.

Here is one way of doing it.
Apply display: table-cell to the a element wrapping your image and inherit the width and height from the .header-col1 ancestor block.
You can then use vertical-align: middle and text-align: center to get the alignment that you want. Add some left-right padding if you need some white space at the left and right edges.
Finally, to get the image to act responsively, set width: 100% and use vertical-align: top to take care of the white-space-below-the-baseline issue.
.header_col1, .header_col2 {
height: 110px;
}
.header_col1 {
float: left;
width: 20%;
background: #009240 none repeat scroll 0% 0%;
text-align: center;
position: relative;
}
.header_col1 a {
vertical-align: middle;
display: table-cell;
text-align: center;
width: inherit;
height: inherit;
padding: 0 10px; /* optional if you need left/right whitespace */
}
.header_col1 a img {
width: 100%;
vertical-align: top;
}
<div class="header_col1">
<a id="logo" href="#">
<img src="http://placehold.it/262x78">
</a>
</div>

Use the display table magic trick :-)
.header_col1 {
display:table;
}
.header_col1 a { /* my logo */
display: table-cell;
vertical-align: middle;
}

I would center it with transforms.
.header_col1 a { /* my logo */
display: inline-block;
vertical-align: middle;
position: relative;
padding: .5em;
top: 50%;
transform: translateY(-50%);
}
EDIT: Added padding: .5em; to give the logo some breathing room on smaller screens, when the container starts to shrink.

The new hotness would be this;
.header_col1 {
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
}
.header_col1 a { /* my logo */
margin: auto;
}
Note: as time goes by, the vendor prefixes -webkit- -moz- ms- will be not nessacery.
here is a sample: https://jsfiddle.net/w4m50ybd/1/
Bonus: making the image resize to the container is a different question.. however the answer to that is width: 100%; height: auto; in the most simple case.

Try this
.header_col1:before {
content: '';
display: inline-block;
height: 100%;
vertical-align: middle;
margin-right: -0.25em;
}
.header_col1 a {
display: inline-block;
vertical-align: middle;
max-width: 100%;
}
Codepen Demo

You need to set a line-height equal to the height for the .header_col1 for this technique to work:
.header_col1 {
float: left;
width: 20%;
background: #009240;
text-align: center;
position: relative;
line-height: 110px;
}
.header_col1 a { /* my logo */
display: inline-block;
vertical-align: middle;
}
...and the img needs to be a block-element:
.header_col1 a img {
display: block;
}
Edit:
Add this to retain the flexible sizing:
.header_col1 a {
width: 100%;
}
.header_col1 a img {
max-width: 100%;
}

I have added line-height to the anchor tag.
header_col1 a {
display: inline-block;
vertical-align: middle;
line-height: 10;
}

you can use the table display to align a tag vertically and horizontally. This way is the easiest way to align an element. I did test on your page, it worked perfectly.
.header_col1 {
float: left;
width: 20%;
background: #009240;
text-align: center;
position: relative;
display: table;
}
.header_col1 a { /* my logo */
display: table-cell;
text-align: center
vertical-align: middle;
}
or another way is to use padding to center your element.
.header_col1 a {
padding: 16px 0px;
}
To avoid other headache while changing the size of your navigation in other devices and screen resolution, I recommend the first solution.

Related

Floating figure with figcaption matching image width. CSS solution that works in both Firefox and Chrome

Basically I have a floating image, which has some arbitrary size based on the image being loaded (capped to some max-width %), with a caption below. (In the examples, I set a fixed size just for demonstration.)
Initially, I had a problem getting the figcaption to auto-fit to the size of the image above it. I used the display: table-caption style to get that to work in Firefox, but it breaks in Chrome.
<div>
<figure>
<img />
<figcaption>This is some text. This is some text. This is some text. This is some text. This is some text.</figcaption>
</figure>
</div>
div {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
figure {
position: relative;
max-width: 85%;
margin: auto;
display: block;
}
img {
width: 300px;
height: 150px;
background: #000;
}
figcaption {
display: table-caption;
caption-side: bottom;
width: 100%;
}
https://jsfiddle.net/45jk62s8/
In Chrome, for me, the figcaption looks all scrunched up, not the same width as the image.
If I change the figure element to display: table, it works in Chrome but not Firefox.
figure {
display: table;
}
https://jsfiddle.net/45jk62s8/1/
In Firefox, for me, the figure is no longer horizontally centered and the figcaption width is not constrained. I tried width: fit-content but that doesn't work since the figcaption is allowed to run long.
I assume it has something to do with the wrapper div I use to center the figure, but I can't figure out a cross-browser solution to this at the moment. The figure does need to be fixed and centered, such that even if the behind content is scrollable, the figure is always centered in the page.
This CSS seems to create the desired output in Firefox and Chrome. It uses table, table-cell and table-caption for all the components and removes the 100% width on the caption.
div {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
overflow-x: hidden;
overflow-y: auto;
display: flex;
align-items: center;
justify-content: center;
}
figure {
position: relative;
max-width: 85%;
margin: auto;
display: table;
}
img {
width: 300px;
height: 150px;
background: #000;
display: table-cell;
}
figcaption {
display: table-caption;
caption-side: bottom;
}

CSS: Vertical align content of an element

I need to vertical align a span, but the thing that makes this complicated is that this span needs to occupy its whole parent. Something like this jsfiddle
So, the HTML is
<div>
<span>OK</span>
</div>
CSS:
div {
width: 200px;
height: 200px;
background-color: lightgrey;
}
span {
display: block;
width: 100%;
height: 100%;
vertical-align: middle;
}
Is this possible without changing the html ?
UPDATE: Although the below answers are all correct and interesting, I chose the one I actually used to be the correct one!
Tell it to behave like a table:
div {
width: 200px;
height: 200px;
background-color: lightgrey;
display: table;
}
span {
display: table-cell;
text-align: center;
vertical-align: middle;
}
http://jsfiddle.net/9uaE6/2/
div{
/* Internet Explorer 10 */
display:-ms-flexbox;
-ms-flex-pack:start;
-ms-flex-align:center;
/* Firefox */
display:-moz-box;
-moz-box-pack:start;
-moz-box-align:center;
/* Safari, Opera, and Chrome */
display:-webkit-box;
-webkit-box-pack:start;
-webkit-box-align:center;
/* W3C */
display:box;
box-pack:start;
box-align:center;
}
Source:ms-flex
your Updated Fiddle
You could achieve that with a 'ghost' pseudo element
span {
display: block;
width: 100%;
height: 100%;
vertical-align: middle;
text-align: center;
}
span:before {
content: "";
display:inline-block;
vertical-align: middle;
height: 100%;
}
An example : http://jsfiddle.net/9uaE6/11/

pseudo class vertical-align

when I delete the vertical-align in div.content:before selector, the text will pull down and can't show completely, so what's the pseudo class do and why this works?
PS: Is there any other way to implement like the demo shows, namely align the text in the middle and text will begin in a new line if it is too long.
here is the demo: http://jsfiddle.net/yougen/8WhNZ/
html:
<div class="wrapper">
<div class="content">
<span>Mix Color Lace Dress</span>
</div>
</div>
css:
div.wrapper {
position: relative;
width:120px;
}
div.content {
width: 120px;
height: 80px;
text-align: center;
background: rgba(51,51,51,0.5);
}
div.content:before {
content: '';
display: inline-block;
height: 100%;
vertical-align: middle;
margin-right: -0.25em;
}
div.content span {
display: inline-block;
width: 80px;
font-size: 14px;
font-weight: bold;
vertical-align: middle;
color: white;
}
The before pseudo element is just at the left of your real content. Its function is to have a 100% of the height of the container and precisely has a vertical-align: middle to force every element on the same line (in this case, your span) with the same vertical-align: middle to be shown in the middle of the container, although it hasn't the 100% of the height.
This trick is used when you don't know the height of the element that you want to align in the middle. In other cases you can play with vertical margins, for example, but here we need a pseudoelement with a known height (100% of the container).
Look at that: http://jsfiddle.net/7hUqs/
#element-1 {
height: 50px;
background-color: blue;
vertical-align: middle;
}
#element-2 {
height: 100px;
background-color: yellow;
vertical-align: top;
}
#element-3 {
height: 70px;
background-color: green;
vertical-align: middle;
}
#element-4 {
height: 80px;
background-color: pink;
vertical-align: middle;
}
The vertical-align: middle works with the silbing elements that have the same came of vertical-align. All of them, as a block, will be aligned with the other elements of the line and its vertical alignement (in this case, top). And the height of the line is the maximum height of its elements, not the height of the container. A little weird, but this is the thing.
try this
div.content:before {
content:'';
display: inline;
height: 100%;
margin-top:10px;
margin-right: -0.25em;
}
div.content span {
display: inline;
width: 80px;
font-size: 14px;
font-weight: bold;
vertical-align: middle;
color: white;
}
fiddle demo

Equal height columns and vertical align image in column?

Was wondering if anyone can show me best way to vertically align my image in image col and have the column equal in height to the text col?
CSS
*{padding:0;margin:0;}
.col{
width: 50%;
float: left;
height: 100%;
}
.col-text {
background: silver;
}
.col-img {
background: red;
display: inline-block;
text-align: center;
}
.col-img img {
display: inline-block;
vertical-align: middle;
}
.cf:after{
content:"";
display:table;
clear:both;
}
}
JSFiddle http://jsfiddle.net/LUpmG/1/
This is my version: http://jsfiddle.net/LUpmG/2/
In short, you need to get rid of floats, use display: table-cell, and apply vertical-align: middle to the container.

How to align a <div> to the middle (horizontally/width) of the page [duplicate]

This question already has answers here:
How can I horizontally center an element?
(133 answers)
Closed 4 years ago.
I have a div tag with width set to 800 pixels. When the browser width is greater than 800 pixels, it shouldn't stretch the div, but it should bring it to the middle of the page.
<body>
<div style="width:800px; margin:0 auto;">
centered content
</div>
</body>
position: absolute and then top:50% and left:50% places the top edge at the vertical center of the screen, and the left edge at the horizontal center, then by adding margin-top to the negative of the height of the div, i.e., -100 shifts it above by 100 and similarly for margin-left. This gets the div exactly in the center of the page.
#outPopUp {
position: absolute;
width: 300px;
height: 200px;
z-index: 15;
top: 50%;
left: 50%;
margin: -100px 0 0 -150px;
background: red;
}
<div id="outPopUp"></div>
Flexbox solution is the way to go in/from 2015. justify-content: center is used for the parent element to align the content to the center of it.
HTML
<div class="container">
<div class="center">Center</div>
</div>
CSS
.container {
display: flex;
justify-content: center;
}
Output
.container {
display: flex;
justify-content: center;
}
.center {
width: 400px;
padding: 10px;
background: #5F85DB;
color: #fff;
font-weight: bold;
font-family: Tahoma;
}
<div class="container">
<div class="center">Centered div with left aligned text.</div>
</div>
Do you mean that you want to center it vertically or horizontally? You said you specified the height to 800 pixels, and wanted the div not to stretch when the width was greater than that...
To center horizontally, you can use the margin: auto; attribute in CSS. Also, you'll have to make sure that the body and html elements don't have any margin or padding:
html, body { margin: 0; padding: 0; }
#centeredDiv { margin-right: auto; margin-left: auto; width: 800px; }
<div></div>
div {
display: table;
margin-right: auto;
margin-left: auto;
}
To make it also work correctly in Internet Explorer 6 you have to do it as follows:
HTML
<body>
<div class="centered">
centered content
</div>
</body>
CSS
body {
margin: 0;
padding: 0;
text-align: center; /* !!! */
}
.centered {
margin: 0 auto;
text-align: left;
width: 800px;
}
Div centered vertically and horizontally inside the parent without fixing the content size
Here on this page is a nice overview with several solutions, too much code to share here, but it shows what is possible...
Personally I like this solution with the famous transform translate -50% trick the most. It works well for both fixed (% or px) and undefined height and width of your element.
The code is as simple as:
HTML:
<div class="center"><div>
CSS:
.center {
position: absolute;
left: 50%;
top: 50%;
-moz-transform: translate(-50%, -50%); /* Firefox */
-ms-transform: translate(-50%, -50%); /* IE 9 */
-webkit-transform: translate(-50%, -50%); /* Safari and Chrome*/
-o-transform: translate(-50%, -50%); /* Opera */
transform: translate(-50%, -50%);
/* optional size in px or %: */
width: 100px;
height: 100px;
}
Here a fiddle that shows that it works
You can also use it like this:
<div style="width: 60%; margin: 0px auto;">
Your contents here...
</div>
Simply use the center tag just after the body tag, and end the center tag just before body ends:
<body>
<center>
... Your code here ...
</center>
</body>
This worked for me with all the browsers I have tried.
This can be easily achieved via flex container.
.container{
width: 100%;
display: flex;
height: 100vh;
justify-content: center;
}
.item{
align-self: center;
}
Preview Link
Add this class to the div you want centered (which should have a set width):
.marginAutoLR
{
margin-right:auto;
margin-left:auto;
}
Or, add the margin stuff to your div class, like this:
.divClass
{
width:300px;
margin-right:auto;
margin-left:auto;
}
Use the CSS flex property: http://jsfiddle.net/cytr/j7SEa/6/show/
body { /* Centered */
display: box;
flex-align: center;
flex-pack: center;
}
Some other pre-existing setups from older code that will prevent div page centering L&R are:
Other classes hidden in external stylesheet links.
Other classes embedded in something like an img (like for older external CSS print format controls).
Legend code with IDs and/or CLASSES will conflict with a named div class.
Centering without specifying div width:
body {
text-align: center;
}
body * {
text-align: initial;
}
body div {
display: inline-block;
}
This is something like <center> tag does, except:
all direct inline childs elements (eg. <h1>) of <center> will also positioned to center
inline-block element can have different size (comapred to display:block setting) according to browser defaults
Use the below code for centering the div box:
.box-content{
margin: auto;
top: 0;
right: 0;
bottom: 0;
left: 0;
position: absolute;
width: 800px;
height: 100px;
background-color: green;
}
<div class="box-content">
</div>
If you have some regular content, and not only one line of text, the only possible reason I know is to calculate margin.
Here is an example:
HTML
<div id="supercontainer">
<div id="middlecontainer">
<div class="common" id="first">first</div>
<div id="container">
<div class="common" id="second">second</div>
<div class="common" id="third">third</div>
</div>
</div>
</div>
CSS
body {
margin: 0;
padding: 0;
}
.common {
border: 1px solid black;
}
#supercontainer {
width: 1200px;
background: aqua;
float: left;
}
#middlecontainer {
float: left;
width: 104px;
margin: 0 549px;
}
#container {
float: left;
}
#first {
background: red;
height: 102px;
width: 50px;
float: left;
}
#second {
background: green;
height: 50px;
width: 50px;
}
#third {
background: yellow;
height: 50px;
width: 50px;
}
So, #supercontainer is your "whole page" and its width is 1200px.
#middlecontainer is div with content of your site; it's width 102px. In case the width of content is known, you need to divide the page's size to 2, and subtract half of content's width from the result:
1200 / 2 - (102 / 2) = 549;
Yes, I'm also seeing that this is der grosse fail of CSS.
.middle {
margin:0 auto;
text-align: center;
}
/* it brings div to center */
parent {
position: relative;
}
child {
position: absolute;
left: 50%;
transform: translateX(-50%);
}
<parent>
<child>
</child>
</parent>
Use justify-content and align-items to horizontally and vertically align a div
https://developer.mozilla.org/de/docs/Web/CSS/justify-content
https://developer.mozilla.org/en/docs/Web/CSS/align-items
html,
body,
.container {
height: 100%;
width: 100%;
}
.container {
display: flex;
align-items: center;
justify-content: center;
}
.mydiv {
width: 80px;
}
<div class="container">
<div class="mydiv">h & v aligned</div>
</div>
body, html {
display: table;
height: 100%;
width: 100%;
}
.container {
display: table-cell;
vertical-align: middle;
}
.container .box {
width: 100px;
height: 100px;
background: red;
margin: 0 auto;
}
http://jsfiddle.net/NPV2E/
"width:100%" for the "body" tag is only for an example. In a real project you may remove this property.
Simple http://jsfiddle.net/8pd4qx5r/
html {
display: table;
height: 100%;
width: 100%;
}
body {
display: table-cell;
vertical-align: middle;
}
.content {
margin: 0 auto;
width: 260px;
text-align: center;
background: pink;
}
This also works in Internet Explorer, but auto margins do not.
.centered {
position: absolute;
display: inline-block;
left: -500px;
width: 1000px;
margin: 0 50%;
}
If your center content is deep inside other divs then only margin can save you. Nothing else. I face it always when not using a framework like Bootstrap.
In my case, the phone screen size is unknown, and here is what I did.
HTML
<div class="loadingImg"></div>
CSS
.loadingImg{
position: fixed;
top: 0px;
left: 0px;
z-index: 9999999;
border: 0;
background: url('../images/loading.gif') no-repeat center;
background-size: 50px 50px;
display: block;
margin: 0 auto;
-webkit-border-radius: 50px;
border-radius: 50px;
}
JavaScript (before you need to show this DIV)
$(".loadingImg").css("height",$(document).height());
$(".loadingImg").css("width",$(document).width());
$(".loadingImg").show();
<body>
<div style=" display: table; margin: 250 auto;">
In center
</div>
</body>
If you want to change the vertical position, change the value of 250 and you can arrange the content as per your need. There is no need to give the width and other parameters.
For some reason, none of the previous answers worked for me really. This is what worked for me and it works across browsers as well:
.center {
text-align: center;
height: 100%;
/* Safari, Opera, and Chrome */
display: -webkit-box;
-webkit-box-pack: center;
-webkit-box-align: center;
/* Firefox */
display: -moz-box;
-moz-box-pack: center;
-moz-box-align: center;
/* Internet Explorer 10 */
display: -ms-flexbox;
-ms-flex-pack: center;
-ms-flex-align: center;
}
Get the width of the screen.
Then make margin left 25%
Make margin right 25%
In this way the content of your container will sit in the middle.
Example: suppose that container width = 800px;
<div class='container' width='device-width' id='updatedContent'>
<p id='myContent'></p>
<contents></contents>
<contents></contents>
</div>
if ($("#myContent").parent === $("updatedContent"))
{
$("#myContent").css({
'left': '-(device-width/0.25)px';
'right': '-(device-width/0.225)px';
});
}

Resources