简体   繁体   English

移动鼠标,但仅在 div 的宽度上

[英]move mouse but only on the width of the div

I just adapted this code to play a sequence of images when you move the mouse on the x axis.当您在 x 轴上移动鼠标时,我刚刚调整了此代码以播放一系列图像。 I have two questions about this code:关于这段代码,我有两个问题:

  • I can't adapt the length to the width of the div, not to the width of the whole window.我不能使长度适应 div 的宽度,而不是适应整个 window 的宽度。
  • There are "flashes" when I move the mouse, I have the impression that it comes from the loading of the images?移动鼠标时有“闪烁”,我的印象是加载图像造成的?

Thanks for your help.谢谢你的帮助。

Live: https://codepen.io/nicolastilly/pen/jOBKxKK直播: https://codepen.io/nicolastilly/pen/jOBKxKK

Code:代码:

var blocWidth;
var imgblock = ['https://assets.codepen.io/265602/frame0.png', 
                'https://assets.codepen.io/265602/frame1.png',
                'https://assets.codepen.io/265602/frame2.png',
                'https://assets.codepen.io/265602/frame3.png',
                'https://assets.codepen.io/265602/frame4.png',
                'https://assets.codepen.io/265602/frame5.png',
                'https://assets.codepen.io/265602/frame6.png',
                'https://assets.codepen.io/265602/frame7.png',
                'https://assets.codepen.io/265602/frame8.png',
                'https://assets.codepen.io/265602/frame9.png',
                'https://assets.codepen.io/265602/frame10.png',
                'https://assets.codepen.io/265602/frame11.png',
                'https://assets.codepen.io/265602/frame12.png',
                'https://assets.codepen.io/265602/frame13.png',
                'https://assets.codepen.io/265602/frame14.png',
                'https://assets.codepen.io/265602/frame15.png',
                'https://assets.codepen.io/265602/frame16.png',
                'https://assets.codepen.io/265602/frame17.png',
                'https://assets.codepen.io/265602/frame18.png',
                'https://assets.codepen.io/265602/frame19.png',
                'https://assets.codepen.io/265602/frame20.png'];

function onMouseMove(e) {
    var x = e.pageX;
    var theimg = imgblock[parseInt(x / blocWidth * imgblock.length)];
    $('.bloc1').css("background-image", "url('" + theimg + "')");
}

function onResize() {
    blocWidth = $('.bloc1').width();
}

function onResize() {
    blocWidth = $(document).width();
}

$(window).on('mousemove', onMouseMove);
$(window).resize(onResize);
onResize();

As for flickering, you can circumvent that by preloading the images至于闪烁,您可以通过预加载图像来规避它

let loaded = 0 ;
imgblock.forEach(url => {
    let img=new Image();
    img.src=url;
    img.onload = onImgLoaded
})

function onImgLoaded() {
    loaded++;
    if (loaded == imgblock.length-1) console.log('all images have pre-loaded');
}

As for the sizing issue, you need to take into account if you're mousing over the target and accounting for the div's left value in your calculations.至于大小问题,您需要考虑是否将鼠标悬停在目标上并在计算中考虑 div 的左值。 Get rid of both these:摆脱这两个:

function onResize() {
    blocWidth = $('.bloc1').width();
}

function onResize() {
    blocWidth = $(document).width();
}

replace with:用。。。来代替:

let blocStartX;
function onResize() {
    let pos = $(".bloc1")[0].getBoundingClientRect()
    console.log(pos)
    blocWidth = pos.width;
    blocStartX = pos.x 
}

Detect the mouseover:检测鼠标悬停:

let isOnDiv = false
$(".bloc1").mouseenter(function(){isOnDiv=true;});
$(".bloc1").mouseleave(function(){isOnDiv=false;});

and add this to the top of your mousemove function:并将其添加到 mousemove function 的顶部:

if (!isOnDiv) return
var x = e.pageX - blocStartX;

https://codepen.io/john-tyner/pen/wvJXXQZ https://codepen.io/john-tyner/pen/wvJXXQZ

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM