JSFiddle - React, Tailwind, and code Playground
HTML
<div id="scrollable">
<div id="centered">
</div>
</div>
<div>
<button id="scale3" type="button">
Scale 3
</button>
<button id="scale05" type="button">
Scale 0.5
</button>
</div>
CSS
#centered {
/*background-image: linear-gradient(to bottom,yellow,red);*/
background: url("http://lorempixel.com/200/200/sports/1/");
height: 200px;
transform: scale(1);
transition: transform 1s ease-out;
width: 200px;
}
#scrollable {
align-items: center;
border: 1px solid red;
display: flex;
height: 300px;
justify-content: center;
overflow: auto;
width: 300px;
}
JavaScript
var $div = $("#centered");
var parentDimension = [$div.parent().width(), $div.parent().height()];
var setNewOffset = function(){
// get the current scale:
// thanks to Lea Verou
// http://stackoverflow.com/a/5604199/3586288
var matrixRegex = /matrix\((-?\d*\.?\d+),\s*0,\s*0,\s*(-?\d*\.?\d+),\s*0,\s*0\)/,
matches = $($div).css('transform').match(matrixRegex);
var scaleX = matches[1]; var scaleY = matches[2];
var divPos = $div.position();
console.log($div.position());
// set x-offset:
var currentWidth = $div.width() * scaleX;
var xOff = divPos.left <= 0 ?
0 : (parentDimension[0] - currentWidth)/2;
// set y-offset:
var currentHeight = $div.height() * scaleY;
var yOff = divPos.top <= 0 ?
0 : (parentDimension[1] - currentHeight)/2;
$div.offset({left: xOff, top: yOff});
}
// thanks to Jim Jeffers!
// http://stackoverflow.com/a/9255507/3586288
$("#centered").bind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd", setNewOffset);
$('#scale3').on('click', function () {
$('#centered').css({transform: 'scale(3)'});
});
$('#scale05').on('click', function () {
$('#centered').css({transform: 'scale(0.5)'});
});