Ответ 1
Ключ состоит в том, чтобы переместить маржу по формуле. Существует небольшое "покачивание", которое раздражает во время перехода, если оно плавает.
ДОПОЛНИТЕЛЬНЫЕ ДОПОЛНИТЕЛЬНЫЕ ВАРИАНТЫ
Вариант 1: расширяется в пространстве, зарезервированном вокруг него http://jsfiddle.net/xcWge/14/:
#square {
width: 10px;
height: 10px;
margin: 100px; /*for centering purposes*/
background: blue;
-webkit-transition: width 1s, height 1s, margin 1s;
-moz-transition: width 1s, height 1s, margin 1s;
-ms-transition: width 1s, height 1s, margin 1s;
transition: width 1s, height 1s, margin 1s;
}
#square:hover {
width: 100px;
height: 100px;
margin: 55px; /* inital margin - ((intial margin - width (or height))/2) */
}
Вариант 2: расширяется над элементами вокруг него http://jsfiddle.net/xcWge/18/:
#square {
width: 10px;
height: 10px;
margin: 0; /*for centering purposes*/
background: blue;
-webkit-transition: width 1s, height 1s, margin 1s;
-moz-transition: width 1s, height 1s, margin 1s;
-ms-transition: width 1s, height 1s, margin 1s;
transition: width 1s, height 1s, margin 1s;
}
#square:hover {
width: 110px;
height: 110px;
margin: -50px; /* inital margin - ((intial margin - width (or height))/2) */
}
Вариант 3: расширяет элементы перед потоком и перемещает элементы после него http://jsfiddle.net/xcWge/22/:
#square {
width: 10px;
height: 10px;
margin: 0;
position: relative;
top: 0;
left: 0;
background: blue;
-webkit-transition: width 1s, height 1s, top 1s, left 1s, margin 1s;
-moz-transition: width 1s, height 1s, top 1s, left 1s, margin 1s;
-ms-transition: width 1s, height 1s, top 1s, left 1s, margin 1s ;
transition: width 1s, height 1s, top 1s, left 1s, margin 1s;
}
#square:hover {
width: 110px;
height: 110px;
top: -50px; /* inital top- (intial top-height)/2) */
left: -50px; /* inital left- (intial left-width)/2) */
margin-right: -50px;
margin-bottom: -50px;
}