Недавно смотрел на эту проблему и попытался:
HTML:
<body>
<div id="my-div"></div>
</body>
CSS:
#my-div {
position: absolute;
height: 100px;
width: 100px;
left: 50%;
top: 50%;
background: red;
transform: translate(-50%, -50%);
-webkit-transform: translate(-50%, -50%);
-moz-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
}
Вот скрипка:
http://jsfiddle.net/sTcp9/6/
Это работает даже при использовании «ширина / высота: авто» вместо фиксированных размеров.
Протестировано на последних версиях Firefox, Chrome и IE (* gasp *).