Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CSS3 transform property working differently in Internet Explorer

I am using the following CSS to centre a div in the middle of my page:

.someWrapper {     width: 100%;     height: 100%;     position: relative; }  .centredDiv {     width: (some width);     height: (some height)     position: absolute;     top: 50%;     left: 50%;     -webkit-transform: translate(-50%, -50%);       -moz-transform: translate(-50%, -50%);         -ms-transform: translate(-50%, -50%);           -o-transform: translate(-50%, -50%);             transform: translate(-50%, -50%); } 

I have tested this in Chrome, Firefox and Safari and it works as intended. However, in Internet Explorer (testing on IE11), while it does centre the div in the middle of the window, IE seems to think there is still an invisible 'ghost div' 50% across and 50% down which has not been transformed.

This results in a whole bunch of white overflow space and unnecessary scrollbars in the bottom right corner of the screen. If I turn on overflow: hidden, this can fix the issue, but it is not a feasible option in my website.

So why does IE do this and is there an easy way to get around it?

EDIT: The following code illustrates the problem. Open the code in Chrome or Firefox, there is no overflow. Open it in IE (testing in IE11) and you will see overflow causing white space and scroll bars to the bottom and to the right.

<!DOCTYPE HTML>   <html>     <head>      <style>        html, body {          height: 100%;          width: 100%;          margin: 0;          padding: 0;        }         #wrapper {          width: 100%;          height: 100%;          position: relative;        }         #centred {          width: 90%;          height: 90%;          position: absolute;          top: 50%;          left: 50%;          background-color: red;          -webkit-transform: translate(-50%, -50%);          -moz-transform: translate(-50%, -50%);          -ms-transform: translate(-50%, -50%);          -o-transform: translate(-50%, -50%);          transform: translate(-50%, -50%);        }      </style>    </head>  <body>    <div id="wrapper">      <div id="centred">        Hello world!      </div>    </div>  </body> </html>  
like image 616
aadu Avatar asked Nov 18 '14 17:11

aadu


People also ask

Does Internet Explorer support CSS3?

This is another CSS3 technique that, when widely supported, could prove to be a very practical addition to CSS development. Currently, IE and Opera are the only browsers that don't support this feature.

Does IE support transform?

For modern browsers like Firefox, Opera and Webkit based browser support CSS Transform with their vendor-specific prefixes (using -moz-transform , -o-transform and -webkit-transform respectively), but you will not find it on Internet Explorer.

What does the CSS3 transform property do?

The transform CSS property lets you rotate, scale, skew, or translate an element. It modifies the coordinate space of the CSS visual formatting model.

What browser would support the transform property?

Google Chrome CSS3 2D Transforms is partially compatible with prefix -webkit- for Chrome browser 4 to 35. This browser property is supported for Chrome 36 to 67.


1 Answers

Easier Approach

Instead of positioning from the top and left, position instead from the bottom and right. After you've done this, simply change your -50% translations to positive 50%. This will remove the overflow e.g.

.center-center {     position: absolute;     bottom: 50%;     right: 50%;     transform: translate(50%, 50%); } 

You can see these changes in action here: http://jsfiddle.net/bd17gsss/

It's worth noting that this bug is still filed, and our team will still give it the appropriate consideration when time and cycles permit us to do so.

Original Answer

There appears to be a layout bug with position: absolute in this particular demo. It's behaving similar to position: relative when it shouldn't be. I've opened a bug on this issue for the Internet Explorer team to investigate further.

For now, you could switch your position value from absolute to fixed, which appears to render the centered element correctly. This prevents you from having to use a fixed set of dimensions over and over, and instead allows you to use this approach as a general-purpose .modal style class that will center anything it is applied to.

The obvious caveat with this change is that your element is positioned according to the viewport, and no longer the document itself. This will freeze it on the screen effectively.

.modal {     position: fixed;     top: 50%; left: 50%;     background-color: red;     transform: translate(-50%, -50%); } 

To demonstrate the success this approach has with various dimensions, we can cycle through a few example sets and test the rendering of the element to ensure it is properly centered:

(function () {      var xandy,         index = 0,         modal = document.querySelector( ".modal" ),         sizes = [             { x: "50%"  , y: "30%"   },             { x: "400px", y: "288px" },             { x: "25vw" , y: "75vh"  },             { x: "90%"  , y: "90%"   }         ];      setInterval(function changeSize () {         xandy = sizes[ index++ % sizes.length ];         modal.style.width = xandy.x;         modal.style.height = xandy.y;     }, 1000 );  }()); 

The end-result can be viewed online here: http://jsfiddle.net/jonathansampson/c00u5ev8/

like image 189
Sampson Avatar answered Nov 10 '22 03:11

Sampson