Reputation: 6522
I have a series of divs on my page. Each div has a background image and is arranged in a grid formation. There are an abitrary number of divs on my page. The page is constrained to a size using <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
I want to be able to click on a div, have it scale to a specific scale, and center.
My markup:
<body id="body">
<div id="container" style="position: relative">
<div id="pack1" class="screenItem cardPack"></div>
<div id="pack2" class="screenItem cardPack"></div>
<div id="pack3" class="screenItem cardPack"></div>
<div id="pack4" class="screenItem cardPack"></div>
</div>
</body>
my css:
#pack1{
margin-left: 20px;
margin-top: 20px;
height: 193px;
width: 127px;
background-image: url(../images/image1.png);
background-size: 100% 100%;
float: left;
clear: both;
-webkit-transition: all 1s ease-in-out;
-moz-transition: all 1s ease-in-out;
-o-transition: all 1s ease-in-out;
-ms-transition: all 1s ease-in-out;
transition: all 1s ease-in-out;
}
#pack2{
margin-right: 20px;
margin-top: 20px;
height: 193px;
width: 127px;
background-image: url(../images/image2.png);
background-size: 100% 100%;
float: right;
-webkit-transition: all 1s ease-in-out;
-moz-transition: all 1s ease-in-out;
-o-transition: all 1s ease-in-out;
-ms-transition: all 1s ease-in-out;
transition: all 1s ease-in-out;
}
#pack3{
margin-left: 20px;
margin-top: 20px;
height: 193px;
width: 127px;
background-image: url(../images/image3.png);
background-size: 100% 100%;
float: left;
clear: both;
-webkit-transition: all 1s ease-in-out;
-moz-transition: all 1s ease-in-out;
-o-transition: all 1s ease-in-out;
-ms-transition: all 1s ease-in-out;
transition: all 1s ease-in-out;
}
#pack4{
margin-right: 20px;
margin-top: 20px;
height: 193px;
width: 127px;
background-image: url(../images/comingSoon.png);
background-size: 100% 100%;
float: right;
-webkit-transition: all 1s ease-in-out;
-moz-transition: all 1s ease-in-out;
-o-transition: all 1s ease-in-out;
-ms-transition: all 1s ease-in-out;
transition: all 1s ease-in-out;
}
#body,
.ui-page {
background-image: url(../images/bg.png);
background-size: auto 100%;
background-repeat: repeat-x;
}
#container {
margin: auto;
width: 310px;
height: 568px;
}
I have a fudge which almost works:
$(cardPack).click(function() {
var left = $(cardPack).position().left;
var top = $(cardPack).position().top;
$(cardPack).css("-webkit-transform", "scale(2.5,2.5)");
$(cardPack).css("-webkit-transform-origin", (3*(left/4)) + " " + (3*(top/4)));
});
But I think that's more of a coincidence and luck. My brain is not working to the point where I can workout where to set the transform-origin
so that the image will end up in the center of the screen, regardless of its start point.
I am happy to consider alternatives to transform-origin
to make this happen.
EDIT: A "not quite acting the same as it does locally" jsfiddle: http://jsfiddle.net/a7Cks/9/
Upvotes: 9
Views: 15252
Reputation: 3522
just for fun, since we are talking about css3, there is pure css solution, using target:
selectiors http://codepen.io/dmi3y/full/keAds, it is bit cleaned up from the initial data
HTML
<div id="container">
<a href="#pack1" id="pack1" class="screenItem cardPack"></a>
<a href="#pack2" id="pack2" class="screenItem cardPack"></a>
<a href="#pack3" id="pack3" class="screenItem cardPack"></a>
<a href="#pack4" id="pack4" class="screenItem cardPack"></a>
</div>
LESS
#pack1{
margin-left: 20px;
margin-top: 20px;
float: left;
clear: both;
&:target {
top: 105px; left: 75px;
margin-left: 0;
margin-top: 0;
}
}
#pack2{
margin-right: 20px;
margin-top: 20px;
float: right;
&:target {
top: 105px; left: -75px;
margin-right: 0;
margin-top: 0;
}
}
#pack3{
margin-left: 20px;
margin-top: 20px;
float: left;
clear: both;
&:target {
top: -105px; left: 75px;
margin-left: 0;
margin-top: 0;
}
}
#pack4{
margin-right: 20px;
margin-top: 20px;
float: right;
&:target {
top: -105px; left: -75px;
margin-right: 0;
margin-top: 0;
}
}
#container {
position: relative;
margin: auto;
width: 310px;
height: 568px;
}
.screenItem {
background: green;
position: relative;
height: 193px;
width: 127px;
-webkit-transition: all 1s ease-in-out;
-moz-transition: all 1s ease-in-out;
-o-transition: all 1s ease-in-out;
-ms-transition: all 1s ease-in-out;
transition: all 1s ease-in-out;
}
:target {
background: red;
z-index: 100;
padding: 10px; // + 20 px dimensions
}
Upvotes: 6
Reputation: 6871
Here you go my good sir.
There's a bug where if you keep clicking while the animation is running it will go again. but I think this is a nice way to do it.
using animate:
$(cardPack).animate({
width: '50%',
height: '50%',
}, 700, function() {
$(cardPack).animate({
left: (contwidth - width * 1.5) / 2,
top: (contheight - (height+height/2) * 1.5) / 2
}, 300);
});
added height/2
to make it center to object middle and not top of object.
Another point is using position:absolute to be able to position the elements . The position:static in the css is redundant.
Upvotes: 3