Javascript:在没有 Jquery 或插件的情况下放大鼠标悬停

Posted

技术标签:

【中文标题】Javascript:在没有 Jquery 或插件的情况下放大鼠标悬停【英文标题】:Javascript: Zoom in on mouseover WITHOUT Jquery or plugins 【发布时间】:2016-02-22 00:25:17 【问题描述】:

我已经到处找了好几个星期了,但我根本找不到任何东西来告诉我我做错了什么或者如何继续。目标是为带有小图像的产品创建一个类似于亚马逊鼠标悬停放大的功能。

我目前不知道如何继续,但我知道我需要两张图片 - 一张“放大”尺寸,一张“缩小”尺寸。 我没有使用 Jquery- 我无法通过雇主的要求将它或任何插件安装到网站上。我基本上是在要求更难的答案,对此我提前道歉。我必须从头开始做这件事。 警告:我是一名编程学生。随你便。

我有 html 和 CSS 脚本,因为我们这里实际上没有 IDE,所以我在 codecademy 的项目部分执行此操作,否则我必须完全实时编程。你可以找到我的代码here,但我也会在下面发布代码,因为该链接使用程序保存,必然会更改代码。

注意:我最初拥有它是为了让灰色框跟随我的鼠标在相对中心。它在移动时闪烁,但它正在工作。目前虽然决定不这样做,至少在我的工作计算机上。我没有在我的个人电脑上测试过。

编辑:代码在我的 Surface Pro 3 上运行,尽管它确实跟随鼠标离开图像(这是暂时的,我抓到的东西是随机的)。我不确定为什么代码不能在我的工作计算机上运行,​​但很可能是因为它是 Macintosh OSX 版本 10.6.8...

HTML 代码

<!DOCTYPE html>
<html>
<head>
    <link rel='stylesheet' href='style.css'/>
    <script src='script.js'></script>
</head>
<body>

<img id="imgZoom" onmousemove="zoomIn()" onmouseout="zoomOut()" src="http://ginger-mum.com/wp-content/uploads/2015/10/3633-1269758855-0da5042c33400a811a5d766be4579cb8.jpg">
<div id="overlay" onmousemove="zoomIn()"></div>
</body>
</html>

CSS 代码

#imgZoom 
    height: 300;


#overlay 
    visibility: hidden;
    position: absolute;
    left: 0px;
    top: 0px;
    width:20%;
    height:20%;
    padding: 25px;
    border: 5px solid gray;
    background-color: white;
    opacity:0.4;
    text-align:center;
    z-index: 1000;

Javascript 代码

function zoomIn()

    var element = document.getElementById("overlay");
    element.style.visibility = "visible";

    var x = event.clientX;     // Get the horizontal coordinate
    var y = event.clientY;     // Get the vertical coordinate

    element.style.top = y - 80;
    element.style.left = x - 80;


function zoomOut()

    var element = document.getElementById("overlay");
    element.style.visibility = "hidden";

【问题讨论】:

jQuery 不需要安装,就像在 Web 服务器上上传或添加文件一样,或者如果您无法使用 jQuery CDN 或其网站&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0-alpha1/jquery.min.js" type="text/javascript"&gt;&lt;/script&gt;987654325@的 src 插入脚本标签 @CY5 抱歉,我认为 JQuery 需要一些安装,特别是如果你想使用 Bootstrap 之类的东西。在我上学编程的地方,我的大多数老师都警告我们不要依赖 JQuery,因为它更像是一个拐杖而不是一个万无一失的答案——并不是说 JQuery 是一件坏事,只是作为一名学生,我正在努力学习完整的知识方法。我想这主要是我不想使用它的原因,以便我可以学习如何手动操作。我实际上主要是一名视频游戏程序员,所以我通常整天都在做没有助手的难懂的代码 我同意你的看法,因为你正在学习你有权知道事情是如何从那里核心制造出来的,但在未来请记住,如果你可以轻松地在时间限制下工作,那么重新发明***是不好的一些工具,因为你不知道你的东西什么时候会坏 @CY5 哦,绝对,我不反对。他们也警告我们不要这样做。幸运的是,我的雇主也有兴趣看到它自己工作——这更像是一个入门级职位,而且对事情的完成方式非常松懈,所以我正在花时间来理顺工作。当然,以后等我充分了解后,我会使用更快的方法!速度始终是任何行业的关键 【参考方案1】:

您可以通过在鼠标悬停时播放背景位置来做到这一点,只需在鼠标悬停时移动背景位置DEMO

function zoomIn(event) 
  var element = document.getElementById("overlay");
  element.style.display = "inline-block";
  var img = document.getElementById("imgZoom");
  var posX = event.offsetX ? (event.offsetX) : event.pageX - img.offsetLeft;
  var posY = event.offsetY ? (event.offsetY) : event.pageY - img.offsetTop;
  element.style.backgroundPosition = (-posX * 4) + "px " + (-posY * 4) + "px";



function zoomOut() 
  var element = document.getElementById("overlay");
  element.style.display = "none";
#overlay 
  border: 1px solid black;
  width: 200px;
  height: 200px;
  display: inline-block;
  background-image: url('https://via.placeholder.com/400.png');
  background-repeat: no-repeat;
<img id="imgZoom"   onmousemove="zoomIn(event)" onmouseout="zoomOut()" src="https://via.placeholder.com/200.png">
<div id="overlay" onmousemove="zoomIn(event)"></div>

【讨论】:

这看起来棒极了,我也试试看。到目前为止我收到的两个选项都很棒! 我尝试了你的代码@CY5,但我在图像底部得到了一个正方形,并且缩放后的图像是静态的,并且显示了实际图像的右上角。 这对我很有用。既然有这么简单的解决方案,为什么还要购买一些在线工具呢?谢谢。 伙计们,如果您的缩放图像中心位置与您的鼠标光标位置不对应,那么您必须将'4' in (-posX * 4) + "px " + (-posY * 4) + "px"; 替换为其他适合您的数字。就我而言,例如,那些 0.5 和 0.8。 另外,如果您需要修改图片的缩放比例,可以在overlay css中添加background-size: 250%;。百分比越大,缩放比例越大。【参考方案2】:

这对我有用:(这是JSFiddle)

#imgZoom 
    height: 300;

img#imgZoom:hover 
    position: relative;
    -webkit-transform: scale(1.5);
    -ms-transform: scale(1.5);
    -o-transform: scale(1.5);
    transform: scale(1.5);
    z-index: 1000;

您也可以添加这个以获得很酷的过渡效果:

* 
    -webkit-transition: all 0.5s ease-in-out;
    -moz-transition: all 0.5s ease-in-out;
    -ms-transition: all 0.5s ease-in-out;
    -o-transition: all 0.5s ease-in-out;
    transition: all 0.5s ease-in-out;

*此外,您不仅可以对图像应用相同的逻辑,还可以对 div 应用相同的逻辑。

【讨论】:

我现在就试试看! 如果你想现场观看,我添加了一个 JSFiddle。 这非常有用。除了它拒绝在我的末端过渡之外,它看起来非常漂亮,实际上可能就是我所需要的。我会由我的雇主来管理这个,看看他是怎么想的!谢谢! 这是我在堆栈中见过的最好的解决方案。太棒了!【参考方案3】:

function zoomIn(event) 
  var element = document.getElementById("overlay");
  element.style.display = "inline-block";
  var img = document.getElementById("imgZoom");
  var posX = event.offsetX ? (event.offsetX) : event.pageX - img.offsetLeft;
  var posY = event.offsetY ? (event.offsetY) : event.pageY - img.offsetTop;
  element.style.backgroundPosition = (-posX * 4) + "px " + (-posY * 4) + "px";



function zoomOut() 
  var element = document.getElementById("overlay");
  element.style.display = "none";
#overlay 
  border: 1px solid black;
  width: 100px;
  height: 100px;
  display: inline-block;
  background-image: url('http://ginger-mum.com/wp-content/uploads/2015/10/3633-1269758855-0da5042c33400a811a5d766be4579cb8.jpg');
  background-repeat: no-repeat;
<img id="imgZoom"   onmousemove="zoomIn(event)" onmouseout="zoomOut()" src="http://ginger-mum.com/wp-content/uploads/2015/10/3633-1269758855-0da5042c33400a811a5d766be4579cb8.jpg">
<div id="overlay" onmousemove="zoomIn(event)"></div>

【讨论】:

【参考方案4】:

试试这个

window.addEventListener("load", imageZoom("my-image"));

function imageZoom(imgID) 
    let img, lens, result, cx, cy;
    img = document.getElementById(imgID);
    result = document.getElementById("my-result");
    lens = document.querySelector(".img-zoom-lens");
    cx = result.offsetWidth / lens.offsetWidth;
    cy = result.offsetHeight / lens.offsetHeight;
    result.style.backgroundImage = "url('" + img.src + "')";
    result.style.backgroundSize = (img.width * cx) + "px " + (img.height * cy) + "px";
    lens.addEventListener("mousemove", moveLens);
    img.addEventListener("mousemove", moveLens);
    lens.addEventListener("touchmove", moveLens);
    img.addEventListener("touchmove", moveLens);
    function moveLens(e) 
        let pos, x, y;
        e.preventDefault();
        pos = getCursorPos(e);
        x = pos.x - (lens.offsetWidth / 2);
        y = pos.y - (lens.offsetHeight / 2);
        if (x > img.width - lens.offsetWidth) x = img.width - lens.offsetWidth;
        if (x < 0) x = 0;
        if (y > img.height - lens.offsetHeight) y = img.height - lens.offsetHeight;
        if (y < 0) y = 0;
        lens.style.left = x + "px";
        lens.style.top = y + "px";
        result.style.backgroundPosition = "-" + (x * cx) + "px -" + (y * cy) + "px";
    
    function getCursorPos(e) 
        let a, x = 0, y = 0;
        e = e || window.event;
        a = img.getBoundingClientRect();
        x = e.pageX - a.left;
        y = e.pageY - a.top;
        x = x - window.pageXOffset;
        y = y - window.pageYOffset;
        return x : x, y : y;
    


// Function to change Images
(function () 
  let originalImg = document.querySelector("#my-image");
  let galleryImg = document.querySelector(".img-gallery").children;

  for(let i = 0; i < galleryImg.length; i++) 
    galleryImg[i].onclick = function() 
      originalImg.setAttribute("src", this.getAttribute("src"));
      imageZoom("my-image");
    ;
  
)();
* 
  box-sizing: border-box;
  font-family: sans-serif;


.img-container 
  position: relative;
  display: flex;
  justify-content: space-between;


.img-zoom-lens 
  position: absolute;
  border: 3px solid rgb(0, 126, 255);
  background-color: rgba(0, 126, 255, .2);
  width: 40px;
  height: 40px;


#my-image 
  max-width: 50%;
  height: 300px;


.img-zoom-result 
  border: 1px solid #f1f1f1;
  width: 300px;
  height: 300px;


.img-gallery 
  margin: 16px 0;


.img-gallery img 
  display: inline-block;
  cursor: pointer;
  width: 110px;
  height: 110px;
  border: 1px solid #ccc;
  padding: 4px;
  margin-right: 8px;


.img-gallery img:active 
  box-shadow: 0 0 0.1rem 0.1rem rgba(38,143,255,.5);


.img-gallery img:focus 
  box-shadow: 0 0 0.1rem 0.1rem rgba(38,143,255,.5);
<h1>Create an Image Zoom</h1>

<div class="img-container">
  <div class="img-zoom-lens"></div>
  <img id="my-image" src="https://parrot-tutorial.com/images/carousel_red3.jpg">
  <div id="my-result" class="img-zoom-result"></div>
</div>

<p>Choose more images:</p>
<div class="img-gallery">
    <img src="https://parrot-tutorial.com/images/avatar.jpg">
    <img src="https://parrot-tutorial.com/images/bottleship.jpg">
    <img src="https://parrot-tutorial.com/images/toxic.jpg">
</div>

参考:Create an Image Zoom

【讨论】:

以上是关于Javascript:在没有 Jquery 或插件的情况下放大鼠标悬停的主要内容,如果未能解决你的问题,请参考以下文章

JQuery 插件,Javascript - 如何仅为 JQuery 插件全局变量或 json 对象创建并在函数级别更改此(变量、对象)

如何创建一个 jQuery 函数(一个新的 jQuery 方法或插件)?

使用 jQuery 插件自动格式化结构化数据(电话、日期)(或无法使用原生 JavaScript)

如何在 JavaScript 中获取查询字符串值?

如何在 JavaScript 中获取查询字符串值?

如何在 JavaScript 中获取查询字符串值?