JavaScript&;CSS:如何在CSS翻译开始和结束之间记录div的位置
基本上,我需要为在帧/容器中随机移动的三个球执行碰撞和反弹动画,放置方式与下图类似 为了检查球是否与任何物体碰撞,我需要使用javascript在css的translate状态下跟踪div的每个位置。 使用JavaScript&;CSS:如何在CSS翻译开始和结束之间记录div的位置,javascript,html,css,angular,Javascript,Html,Css,Angular,基本上,我需要为在帧/容器中随机移动的三个球执行碰撞和反弹动画,放置方式与下图类似 为了检查球是否与任何物体碰撞,我需要使用javascript在css的translate状态下跟踪div的每个位置。 使用getBoundingClientRect()我将只获得div的最终位置,但在使用css translate时,我需要跟踪/记录div后面路径的每个点 我将使用纯角度动画,我不打算为此任务添加额外的jQuery 这是我在浏览器控制台上尝试的一个示例演示,它可以帮助我随机移动球,但有时它们会重
getBoundingClientRect()
我将只获得div的最终位置,但在使用css translate时,我需要跟踪/记录div后面路径的每个点
我将使用纯角度动画,我不打算为此任务添加额外的jQuery
这是我在浏览器控制台上尝试的一个示例演示,它可以帮助我随机移动球,但有时它们会重叠,当球碰到容器边缘或另一个球的表面时,我需要反弹
函数getRandomInt(最小值、最大值){
返回Math.floor(Math.random()*(max-min+1))+min;
}
var anim2=document.getElementsByClassName(“animation1”)[0];
var anim1=document.getElementsByClassName(“animation2”)[0];
var anim4=document.getElementsByClassName(“animation3”)[0];
函数动作(){
var randomNumMin1=getRandomInt(-100100);
var randomNumMin2=getRandomInt(-100100);
var randomNumMin3=getRandomInt(-100100);
var randomNumMax1=getRandomInt(-100100);
var randomNumMax2=getRandomInt(-100100);
var randomNumMax3=getRandomInt(-100100);
var num1=`translate(${randomNumMin1}px,${randomNumMax1}px)`;
var num2=`translate(${randomNumMin2}px,${randomNumMax2}px)`;
var num4=`translate(${randomNumMin3}px,${randomNumMax3}px)`;
anim1.style.transition='all 3s';
anim1.style.transform=num1;
anim2.style.transition='all 3s';
anim2.style.transform=num2;
anim4.style.transition='all 3s';
anim4.style.transform=num4;
}
行动()
var interval=setInterval(()=>{
行动()
},3000)
[class*=动画]{
宽度:50px;
高度:50px;
背景:红色;
边界半径:50%;
}
您可能可以执行类似轮询的操作,以检查两个球是否相互碰撞/相交
function collides(ball1, ball2){
var obj1 = ball1.getBoundingClientRect();
var obj2 = ball2.getBoundingClientRect();
if (obj1.left < obj2.left + obj2.width && obj1.left + obj1.width > obj2.left &&
obj1.top < obj2.top + obj2.height && obj1.top + obj1.height > obj2.top) {
// change transform / reverse etc.
}
else{
// not collided yet
}
}
函数冲突(ball1,ball2){
var obj1=ball1.getBoundingClientRect();
var obj2=ball2.getBoundingClientRect();
如果(obj1.leftobj2.left&&
obj1.topobj2.top){
//变换/反转等。
}
否则{
//还没有碰撞
}
}
getBoundingClientRect()方法返回元素的大小及其相对于视口的位置。
因此,基本上,您需要使用JS而不是CSS为球设置动画,并在每个动画帧上检测碰撞。因此,您的代码应该如下所示:
const balls=[{
$el:document.getElementsByClassName(“animation1”)[0],
r:25,//球半径
vs:0.1,//以每帧像素为单位的速度
},
{
$el:document.getElementsByClassName(“动画2”)[0],
r:25,//球半径
vs:0.3,//以每帧像素为单位的速度
},
{
$el:document.getElementsByClassName(“动画3”)[0],
r:25,//球半径
vs:0.5,//以每帧像素为单位的速度
}
];
函数集合(ball1,ball2){
常数a=ball1.r+ball2.r;
常数dx=ball1.$el.offsetLeft-ball2.$el.offsetLeft;
const dy=ball1.$el.offsetTop-ball2.$el.offsetTop;
返回a>Math.sqrt((dx**2)+(dy**2));
}
函数tick(){
//换位
balls.forEach((ball)=>{
ball.$el.style.y+=ball.vs;
});
//检测碰撞
for(设i=0;i
[class*=动画]{
宽度:50px;
高度:50px;
背景:红色;
边界半径:50%;
}
您好,您的解决方案对我来说很好,让我试试。顺便说一句,我更新了一点问题。@Ankitkumarsing这只是一种常见的方法。基本上,您有一些实体列表,甚至可能是管理器,在每个屏幕帧上,您都在执行一些计算或只是应用一个状态(如果您在tick函数之外的某个地方更改它,例如,在某些setTimeout回调或用户交互中)