Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript进行鼠标悬停移动_Javascript_Jquery_Css - Fatal编程技术网

使用JavaScript进行鼠标悬停移动

使用JavaScript进行鼠标悬停移动,javascript,jquery,css,Javascript,Jquery,Css,我试图实现(使用webflow构建)在元素上悬停时的动画和交互,但无法实现。我在这里找到了,但当我试图用悬停函数重构它时,我仍然无法使它工作 这是我试过的 // Maximum offset for image var maxDeltaX = 50, maxDeltaY = 50, viewportWidth = 0, viewportHeight = 0, mouseX = 0,

我试图实现(使用webflow构建)在元素上悬停时的动画和交互,但无法实现。我在这里找到了,但当我试图用悬停函数重构它时,我仍然无法使它工作

这是我试过的

// Maximum offset for image
        var maxDeltaX = 50,
            maxDeltaY = 50,
            viewportWidth = 0,
            viewportHeight = 0,
            mouseX = 0,
            mouseY = 0,
            translateX = 0,
            translateY = 0;
        // Bind mousemove event to document
        jQuery('.image-content-right').on('mousemove', function(e) {
            // Get viewport dimensions
            viewportWidth = document.documentElement.clientWidth,
                viewportHeight = document.documentElement.clientHeight;
            // Get relative mouse positions to viewport
            // Original range: [0, 1]
            // Should be in the range of -1 to 1, since we want to move left/right
            // Transform by multipling by 2 and minus 1
            // Output range: [-1, 1]
            mouseX = e.pageX / viewportWidth * 2 - 1,
            mouseY = e.pageY / viewportHeight * 2 - 1;
            // Calculate how much to transform the image
            translateX = mouseX * maxDeltaX,
            translateY = mouseY * maxDeltaY;
            jQuery('.cyan').css('transform', 'translate(' + translateX + 'px, ' + translateY + 'px)');
            jQuery('.small-cyan').css('transform', 'translate(' + translateX + 'px, ' + translateY + 'px)');
            jQuery('.small-darktangirine').css('transform', 'translate(' + translateX + 'px, ' + translateY + 'px)');
        }).hover(function() {
            jQuery('.cyan').css('transform', 'translate(' + translateX + 'px, ' + translateY + 'px)');
            jQuery('.small-cyan').css('transform', 'translate(' + translateX + 'px, ' + translateY + 'px)');
            jQuery('.small-darktangirine').css('transform', 'translate(' + translateX + 'px, ' + translateY + 'px)');
        })

它有点笨重,没有我想要实现的那么平滑,而且我希望它在不悬停时返回到其原始位置。

我不太确定,考虑到它实际上取决于jQuery本身执行其事件的频率,您将如何做更多的工作来使该函数更加平滑。现在,也许我会考虑把JQuery事件声明中的所有代码分割成它们各自的函数。这将使您的工作更轻松、更干净:)

使其返回到您在保存每个元素的原始未翻译位置之前的位置,或者,您可以将每个翻译保存到计数变量中,然后在元素未聚焦后“撤消”翻译

比如:


考虑到jQuery本身执行其事件的频率,我不太确定您将如何做更多的工作来使该函数更加平滑。现在,也许我会考虑把JQuery事件声明中的所有代码分割成它们各自的函数。这将使您的工作更轻松、更干净:)

使其返回到您在保存每个元素的原始未翻译位置之前的位置,或者,您可以将每个翻译保存到计数变量中,然后在元素未聚焦后“撤消”翻译

比如:


通过webflow的外观和感觉(如果我正确理解了您的目标),您希望能够在悬停区域内以最大延迟/Y的速度移动对象。如果是这样的话,您的数学需要一些调整:您需要定义一个原点(最有可能是移动对象的中心),并将原点周围的悬停区域规格化为[-1,1]。将对象放置在悬停框的死点可以简化计算。我在一个片段中发布了代码,但它应该在整个页面上运行,因为坐标计算不正确。有趣的是,如果我在上运行它,它在Chrome上会像预期的那样工作,但在Safari上不会。为了避免这个问题,您应该将所有内容包装在父div中,并计算相对于父div的坐标

const page=document.getElementById(“页面id”);
const area=document.getElementById(“区域id”);
const-box=document.getElementById(“框id”);
//我们想把物体最多移动50像素
常量maxDeltaX=50;
常数maxDeltaY=50;
让pageBox=page.getBoundingClientRect();
让pageTopLeft={
x:pageBox.x,
y:pageBox.y
};
设areaBox=area.getBoundingClientRect();
让区域范围={
w:areaBox.width/2.0,
h:areaBox.height/2.0
};
设boxBox=box.getBoundingClientRect();
设原点={
x:boxBox.x+(boxBox.width/2.0),
y:boxBox.y+(boxBox.height/2.0)
};
//乘数允许悬停区域范围内的完全增量位移
设multX=maxDeltaX/areaRange.w;
设multY=maxDeltaY/areaRange.h;
area.addEventListener(“mousemove”,onMove);
区域。添加的事件列表(“mouseleave”,onLeave);
addEventListener(“resize”,onResize);
//鼠标坐标是从包装器的左上角计算出来的,它们与对象中心的距离是标准化的
函数onMove(e){
设dx=((e.clientX-pageTopLeft.x)-transformOrigin.x));
设dy=((e.clientY-pageTopLeft.y)-transformOrigin.y));
box.style.transform=“translate3d”(+(dx*multX)+“px”,+(dy*multY)+“px,0)”;
/*
//或者你也可以添加一些奇特的旋转,哈哈
让旋转度=数学atan2(dy,dx)*(180/数学π);
让rotationString=“旋转(“+rotationDeg+”deg)”;
box.style.transform=“translate3d”(+(dx*multX)+“px”,+(dy*multY)+“px,0)”+旋转字符串;
*/
}
函数onLeave(e){
box.style.transform=“translate3d(0,0,0)”;
}
函数onResize(e){
//重新定义所有“let”变量
}
*{
保证金:0;
填充:0;
}
.第页{
位置:相对位置;
宽度:100%;
高度:100vh;
背景色:#ddd;
显示:网格;
放置项目:中心;
}
.悬停区{
位置:相对位置;
宽度:50%;
身高:100%;
背景色:#888;
}
.盒子{
位置:绝对位置;
左:计算(50%-25px);
顶部:calc(50%-25px);
宽度:50px;
高度:50px;
边界半径:25px;
背景图像:线性梯度(45度,#000,#aaa);
变换:translate3d(0,0,0);
过渡:均为0.2s;
改变:转变;
}

根据webflow的外观和感觉(如果我正确理解了您的目标),您希望能够在悬停区域内以最大速度/Y移动您的对象。如果是这样的话,您的数学需要一些调整:您需要定义一个原点(最有可能是移动对象的中心),并将原点周围的悬停区域规格化为[-1,1]。将对象放置在悬停框的死点可以简化计算。我在一个片段中发布了代码,但它应该在整个页面上运行,因为坐标计算不正确。有趣的是,如果我在上运行它,它在Chrome上会像预期的那样工作,但在Safari上不会。为了避免这个问题,您应该将所有内容包装在父div中,并计算相对于父div的坐标

const page=document.getElementById(“页面id”);
const area=document.getElementById(“区域id”);
const-box=document.getElementById(“框id”);
//我们想把物体最多移动50像素
常量maxDeltaX=50;
常数maxDeltaY=50;
让pageBox=page.getBoundingClientRect();
让pageTopLeft={
x:pageBox.x,
y:pageBox.y
};
设areaBox=area.getBoundingClientRect();
让区域范围={
w:areaBox.width/2.0,
h:areaBox.height/2
function animateElementOnMouseMove() {
   // your translate code
}
function animateElementOnMouseHover() {
   // your initial hover animation code
}
$('.image-content-right').on('mousemove', animateElementOnMouseMove)
                         .on('hover', animateElementOnMouseHover);

var elementTranslateCountX = 0;
var elementTranslateCountY = 0;

// ON TRANSLATE
elementTranslateCountX += translateX;
elementTranslateCountY += translateY;