Reputation: 3451
Looking for some help on how to approach this animation: https://material-design.storage.googleapis.com/publish/material_v_4/material_ext_publish/0B3T7oTWa3HiFZ3BiM1dnR0ZPU1k/animation_meanigfultrans_visualcont.webm
Initial attempts with react router didn't go well, eventually decided I don't need dedicated routes for each open component. Now I am running into positioning issues...
The circle fills up the whole screen, so it needs to be in a div that is 100% x 100% and at 0, 0, but the items in the grid need their own correct positions. Currently I'm using isotope within a react component to layout the grid.
If I change the container div to 0,0 so the circle can scale up, the child divs also move from their original position. The circle needs to take over full screen but the thumbnail image to stay in place (until I tell it to move).
I'm not asking anyone to provide literal code examples, however just asking for a discussion on conceptually how to approach the problem.
Upvotes: 4
Views: 3204
Reputation: 14990
Here is my attempt to create the circle growing animation.
Short explination of what happends:
/*document.addEventListener('"DOMContentLoaded', function() {*/
var spesial = document.getElementsByClassName("spesial");
var container = document.getElementsByClassName("container");
var togglecircle = false;
spesial[0].addEventListener('click', function() {
var circle = document.createElement('div');
circle.className = "circle"
container[0].appendChild(circle);
var size = 0;
if (this.offsetWidth > this.offsetHeight) {
size = container[0].offsetWidth;
} else {
size = container[0].offsetHeight;
}
console.log(this.offsetTop);
circle.style.top = this.offsetTop + (this.offsetHeight / 2) + "px";
circle.style.left = this.offsetLeft + (this.offsetWidth / 2) + "px";
circle.style.width = size * 2 + "px";
circle.style.height = size * 2 + "px";
});
/*});*/
.container {
position: relative;
height: 300px;
background-color: black;
overflow: hidden;
}
.spesial {
z-index: 10;
position: absolute;
top: 50px;
left: 50px;
width: 50%;
height: 150px;
background-color: yellow;
border: 2px solid #888;
cursor: pointer;
}
.circle {
position: absolute;
z-index: 1;
border-radius: 50%;
width: 0px;
height: 0px;
transition: width 3s, height 3s;
background-color: yellow;
transform: translate(-50%, -50%);
}
<div class="container">
<div class="spesial">
<h1>Cool header</h1>
<p>lorem ipsum etc, etc,</p>
</div>
</div>
Upvotes: 3