广告
返回顶部
首页 > 资讯 > 精选 >JavaScript如何实现购物车图片局部放大预览效果
  • 613
分享到

JavaScript如何实现购物车图片局部放大预览效果

2023-07-05 10:07:22 613人浏览 独家记忆
摘要

这篇文章主要介绍了javascript如何实现购物车图片局部放大预览效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript如何实现购物车图片局部放大预览效果文章都会有所收获,下面我们一起来看看吧

这篇文章主要介绍了javascript如何实现购物车图片局部放大预览效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript如何实现购物车图片局部放大预览效果文章都会有所收获,下面我们一起来看看吧。

代码实现

代码不多,先看一下 HTML 里面结构很简单,初始化 MagnifyingGlass 对象来关联一个 IMG 标签来实现放大。

<!DOCTYPE html><html><head><meta charset="utf-8"></head><style type="text/CSS">*{    padding: 0;    margin: 0;}.clothes {    width: auto;    height: auto;}</style><body><div>    <img id="clothes" class="clothes" src="./clothes.jpg" alt=""></div></body>    <script src="./magnifyingGlass.js"></script><script>    //针对某个标签进行图片放大处理    let magnifyingGlass = new MagnifyingGlass(document.getElementById('clothes'))</script></html>

再看一下 MagnifyingGlass

class MagnifyingGlass {    // 需要放大的图片    imgEl    // 放大预览视图    magnifyingGlassView    // 区域小图    smallcanvas    // 保存原图的像素值    originalPiexls = []    // 截流定时器    interceptionTimer = null    constructor(el){        if(el.tagName == 'IMG'){            this.imgEl = el            this.listenerImgLoadSucceeded()        }    }        // 监听图片加载完成    async listenerImgLoadSucceeded(){        if(!this.imgEl.complete){            await new Promise((resolve)=>{            this.imgEl.onload = resolve        })    }        // 添加鼠标事件    this.addMouseEvent()        // 创建一个放大预览视图        this.createMagnifyingGlassView()    }    // 创建一个放大预览视图    createMagnifyingGlassView(){        if(this.magnifyingGlassView){            this.magnifyingGlassView.remove()        }        this.magnifyingGlassView = document.createElement('canvas')        this.magnifyingGlassView.style.cssText = 'position: fixed;background:aliceblue;left:0;top:0;pointer-events:none;display:none'        this.magnifyingGlassView.setAttribute('width',`${200}px`)        this.magnifyingGlassView.setAttribute('height',`${200}px`)        let body = document.getElementsByTagName('body')[0]        body.appendChild(this.magnifyingGlassView)    }    // 添加鼠标事件    addMouseEvent(){        // 添加鼠标滑过事件        this.addMouseMoveToImageEl()        // 鼠标滑出事件        this.addMouseLeaveToImageEl()    }    // 添加鼠标滑过事件    addMouseMoveToImageEl(){        this.imgEl.onmousemove = (event)=>{            let x = event.clientX + this.getElementPosition(this.imgEl).left + 20            let y = event.clientY + this.getElementPosition(this.imgEl).top + 20            let position = { x, y }            // 截流            this.interceptionFunc(()=>{                // 修改放大视图位置                this.changeMagnifyingGlassViewPosition(position)                // 获取需要放大的像素                this.getNeedMasgnifyingGlassPiexl({clientX: (event.clientX - this.getElementPosition(this.imgEl).left),clientY: (event.clientY - this.getElementPosition(this.imgEl).top)})            })        }    }    //截流    interceptionFunc(cb){        if(this.interceptionTimer){            return        }        this.interceptionTimer = setTimeout(() => {            cb()            this.interceptionTimer = null        }, 20);    }    // 鼠标滑出事件    addMouseLeaveToImageEl(){        this.imgEl.onmouseleave = ()=>{            // 移除放大框            this.magnifyingGlassView.style.display = 'none'        }    }    // 修改放大视图位置    changeMagnifyingGlassViewPosition(position){        this.magnifyingGlassView.style.left = position.x + 'px'        this.magnifyingGlassView.style.top = position.y + 'px'        this.magnifyingGlassView.style.display = 'block'    }    // 获取元素在屏幕的位置    getElementPosition(element){        var top = element.offsetTop        var left = element.offsetLeft        var currentParent = element.offsetParent;        while (currentParent !== null) {            top += currentParent.offsetTop            left += currentParent.offsetLeft            currentParent = currentParent.offsetParent        }        return {top,left}    }        // 保存原像素(操作像素点时候用)    async getOriginalPiexls(){        if(this.originalPiexls.length == 0){            var image = new Image();            image.src = this.imgEl.src;            // 等待IMG标签加载完成后保存像素值            await new Promise((resolve)=>{                image.onload = resolve            })            let width = image.width            let height = image.height            let canvas = document.createElement('canvas')            canvas.setAttribute('width',`${width}px`)            canvas.setAttribute('height',`${height}px`)            var ctx = canvas.getContext("2d")            ctx.fillStyle = ctx.createPattern(image, 'no-repeat');            ctx.fillRect(0, 0, width, height);            try {                //保存像素                this.originalPiexls = ctx.getImageData(0,0,width,height)            } catch (error) {                console.log(error)            }        }    }    // 获取需要放大的像素    async getNeedMasgnifyingGlassPiexl(event){        //获取原始像素        this.getOriginalPiexls()        //如果像素为空,不进行操作        if(this.originalPiexls.length == 0){            return        }        //获取待放大IMG的宽度,用来计算像素        let imageWidth = this.imgEl.offsetWidth        //获取当前鼠标点的范围        let diffusionLength = 100        //鼠标触点        let mouseX = event.clientX        let mouseY = event.clientY        //规定区域的上下、左右宽度        let sepX = parseInt(diffusionLength)        let sepY = parseInt(diffusionLength)        // 需要开始的点        let startPoint = {x:(mouseX - parseInt(sepX / 2.0)),y:(mouseY - parseInt(sepY / 2.0))}        // 需要结束的点        let endPoint = {x:(mouseX + parseInt(sepX / 2.0)),y:(mouseY + parseInt(sepY / 2.0))}        // 最终要展示的像素集合(乘以4是单一像素值宽度)        let finallyOriginalPiexls = new Uint8ClampedArray(sepX * sepY * 4)        let currentIndex = 0        //操作像素        for(let i = startPoint.y;i < endPoint.y;i++){            for(let j = startPoint.x; j < endPoint.x;j++){                for(let k = 0;k < 4;k++){                    let index = (i * imageWidth + j) * 4 + k                    if(index > 0 && index < this.originalPiexls.data.length){                    // 超过宽度部分需要进行其他色值填充                    if(j < imageWidth){                        finallyOriginalPiexls[currentIndex] = this.originalPiexls.data[index]                    } else {                        finallyOriginalPiexls[currentIndex] = 199                    }                    } else {                        finallyOriginalPiexls[currentIndex] = 199                    }                    currentIndex += 1                }            }        }                //先绘制一个100*100单位长的小图        if(!this.smallCanvas){            this.smallCanvas = document.createElement('canvas')            this.smallCanvas.setAttribute('width',`${diffusionLength}px`)            this.smallCanvas.setAttribute('height',`${diffusionLength}px`)        }        let smallCtx = this.smallCanvas.getContext("2d")        //初始化ImageData        let finallyImageData = new ImageData(finallyOriginalPiexls,sepX,sepY)        // 当前范围内需要放大的像素        smallCtx.putImageData(finallyImageData,0,0,0,0,diffusionLength,diffusionLength)        let url = this.smallCanvas.toDataURL('image/jpeg',1)                //将小图绘制到200*200的预览图上        var image = new Image();        image.src = url;        await new Promise((resolve)=>{            image.onload = resolve        })        var magnifyingGlassCtx = this.magnifyingGlassView.getContext("2d")        magnifyingGlassCtx.drawImage(image, 0,0,200,200);    }}

上面的就是全部逻辑,实现方法肯定不是最优的,但是其中可以联想到通过像素点的操作实现任意效果。

获取像素信息跨域问题怎么解决

可以启动一个 node 本地服务,首先见一个包含 index.jspackage.json 的入口文件的文件夹。

package.json 内容如下:

{    "name": "youname",    "version": "1.0.0",    "description": "description",    "main": "index.js",    "scripts": {    "test": "node ./index.js"    },    "author": "wsl",    "license": "ISC",    "dependencies": {        "express": "^4.17.3",        "express-static": "^1.2.6",        "Http": "^0.0.1-security"    }}

index.js 内容如下:

var express = require('express')var app = express()var http = require('http').Server(app)//公共页面访问设置app.use(express.static('www'))//开启服务http.listen(3000,function(){    console.log('开始了')})

终端执行 npm install 后再执行启动服务命令 node ./index.js

JavaScript如何实现购物车图片局部放大预览效果

注意将前端文件放在目录里 www 文件夹下

JavaScript如何实现购物车图片局部放大预览效果

这样跨域问题就解决了。

关于“JavaScript如何实现购物车图片局部放大预览效果”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“JavaScript如何实现购物车图片局部放大预览效果”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: JavaScript如何实现购物车图片局部放大预览效果

本文链接: https://www.lsjlt.com/news/350997.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript实现购物车图片局部放大预览效果
    目录一、实现效果二、代码实现三、获取像素信息跨域问题怎么解决四、总结与思考一、实现效果 二、代码实现 代码不多,先看一下 HTML 里面结构很简单,初始化 MagnifyingGl...
    99+
    2023-03-07
    JavaScript图片局部放大预览效果 JavaScript图片局部放大 JavaScript图片放大
  • JavaScript如何实现购物车图片局部放大预览效果
    这篇文章主要介绍了JavaScript如何实现购物车图片局部放大预览效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript如何实现购物车图片局部放大预览效果文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • vue3怎么使用useMouseInElement实现图片局部放大预览效果
    本文小编为大家详细介绍“vue3怎么使用useMouseInElement实现图片局部放大预览效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue3怎么使用useMouseInElement实现图片局部放大预览效果”文章能帮助大家解决...
    99+
    2023-07-05
  • vue3使用useMouseInElement实现图片局部放大预览效果实例代码
    目录1、首先要安装@vueuse/core2、实现过程如下:3、使用:在其他的.vue文件中导入组件即可使用4、效果如下:总结1、首先要安装@vueuse/core npm i @v...
    99+
    2023-03-19
    vue图片预览放大缩小 vue点击图片放大 vue实现文件预览功能
  • javascript如何实现购物车效果
    这篇文章将为大家详细讲解有关javascript如何实现购物车效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。javascript实现购物车效果的方法:1...
    99+
    2022-10-19
  • vue如何实现图片预览放大以及缩小效果
    这篇文章主要介绍了vue如何实现图片预览放大以及缩小效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue如何实现图片预览放大以及缩小效果文章都会有所收获,下面我们一起来看看吧。vue图片预览放大以及缩小在v...
    99+
    2023-07-05
  • Vue实现图片预览效果实例(放大、缩小、拖拽)
    前言 这张图是显示的图片放大的一个预览情况,这里是参考预览操作实现的一个背景为黑色的部分,上层的图片可实现滚轮放大或者点击上部的放大镜图标进行放大,代码是基于Ant Design V...
    99+
    2022-11-12
  • jQuery如何实现鼠标滑过预览图片大图效果
    这篇文章将为大家详细讲解有关jQuery如何实现鼠标滑过预览图片大图效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。需求是这样的:  鼠标移动的图片上,同时显...
    99+
    2022-10-19
  • JS+HTML5如何实现上传图片预览效果
    这篇文章给大家分享的是有关JS+HTML5如何实现上传图片预览效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。示例代码如下:<!DOCTYPE HTML>...
    99+
    2022-10-19
  • 如何用CSS3实现对图片的放大效果
    这篇文章主要讲解了“如何用CSS3实现对图片的放大效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用CSS3实现对图片的放大效果”吧! ...
    99+
    2022-10-19
  • jQuery如何实现上传图片前预览效果功能
    这篇文章将为大家详细讲解有关jQuery如何实现上传图片前预览效果功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。效果如图:代码如下:<!doctype ...
    99+
    2022-10-19
  • 微信小程序如何实现选择图片和放大预览图片功能
    这篇文章给大家分享的是有关微信小程序如何实现选择图片和放大预览图片功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。视频中,老师也是看着官方文档,为学生们讲解,微信提供了系统的方...
    99+
    2022-10-19
  • 如何通过纯CSS实现图片的缩放放大效果
    在现代网页设计中,图片的缩放放大效果常常被使用。通过CSS,我们可以轻松地实现这一效果,而无需使用JavaScript或其他编程语言。本文将介绍如何使用纯CSS来实现图片的缩放放大效果,并提供具体的代码示例。实现图片的缩放放大效果可以使用C...
    99+
    2023-10-21
    放大 CSS 缩放
  • CSS如何实现图片列表悬停放大效果
    小编给大家分享一下CSS如何实现图片列表悬停放大效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!代码如下:<!DOCTY...
    99+
    2022-10-19
  • js如何实现图片放大缩小计时器效果
    小编给大家分享一下js如何实现图片放大缩小计时器效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!知识要点var fn=setI...
    99+
    2022-10-19
  • layui如何实现表格内放置图片并点击放大效果
    这篇文章主要为大家展示了“layui如何实现表格内放置图片并点击放大效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“layui如何实现表格内放置图片并点击放大...
    99+
    2022-10-19
  • 如何基于jQuery插件jqzoom实现的图片放大镜效果
    这篇文章主要介绍如何基于jQuery插件jqzoom实现的图片放大镜效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!jqzoom插件实现图片放大镜效果。图1.1jqzoom插件实现...
    99+
    2022-10-19
  • JS如何实现点击缩略图整屏居中放大图片效果
    这篇文章将为大家详细讲解有关JS如何实现点击缩略图整屏居中放大图片效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。需要实现的效果图:今天开发的时候,遇到要点击缩略图之后...
    99+
    2022-10-19
  • 如何使用input type=file选择图片并且实现预览效果的实例
    这篇文章主要介绍了如何使用input type=file选择图片并且实现预览效果的实例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。通过&l...
    99+
    2022-10-19
  • CSS如何实现鼠标移入时图片的放大效果及缓慢过渡效果
    小编给大家分享一下CSS如何实现鼠标移入时图片的放大效果及缓慢过渡效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!transform:scale()可以实现按比例放大或者缩小功能。transition可以设置动画执行的时...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作