首页>资讯 > 聚焦资讯 > 正文

记录-JS简单实现购物车图片局部放大预览效果

来源:博客园    2023-04-21 01:36:43

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

一、实现效果

二、代码实现

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

<script src="./magnifyingGlass.js"></script><script> //针对某个标签进行图片放大处理 let magnifyingGlass = new MagnifyingGlass(document.getElementById("clothes"))</script>

再看一下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:

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

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

这样跨域问题就解决了。

本文转载于:

https://juejin.cn/post/7201437314693906491

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

关键词:

记录-JS简单实现购物车图片局部放大预览效果

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助一、实现效果二、代码实现代码不多,先看一

创建本地yum仓库_环球百事通

本文分享自天翼云开发者社区《创建本地yum仓库》,作者:zzzzgj;背景有的部署环境不通外网,但希望继续使用

观察:深度学习--PyTorch维度变换、自动拓展、合并与分割

深度学习--PyTorch维度变换、自动拓展、合并与分割一、维度变换1 1view reshape变换​ 这两个方法用法相同

南山区南方科技大学教育集团长源小学招生范围|当前快播

南方科技大学教育集团(南山)长源小学招生范围南方科技大学教育集团(南山)长源小学实行大学区招生,属于

遂宁中考加分政策2023

2023年遂宁中考加分等政策有哪些?1 普通高中①少数民族、归侨、华侨、港澳台籍考生加5分。②现役军人、烈

降价负面影响凸显?特斯拉一季度利润暴跌超20%,官方称营运利润率下降速度依然可控 天天快讯

不过,大幅降价推动高营收的同时,特斯拉在今年一季度的整体盈利能力却明显下降,如净利润、营业利润率、核

[快讯]农银金禄债公布第一季报

CFi CN讯:农银金禄债(基金代码:006758)公布农银汇理金禄债券型证券投资基金2023年第一季度报告。3 1主

每日视讯:十年后,电动车价格再跌一半?

朱江明告诉《中国新闻周刊》,“电动车的迭代速度会比燃油车快得多,电池包将不断降价,电驱重量也在不断下

“五一”出行,深圳至珠海九洲港往返航线将加密航班|精选

为迎接“五一”小长假,满足深珠两地旅客往来需求,深圳航运集团鹏星船务将在“五一”假期期间加密深圳蛇口

天天热文:4月19日省广集团发生1笔大宗交易 成交金额1618.2万元

4月19日省广集团发生大宗交易交易数据如下大宗交易成交价格522元相对当日收盘价折价953成交310万股成交金额

热点在线丨2023山东济宁邹城市事业单位(教育类)招聘备案制180人报名入口

2023济宁邹城市事业单位(教育类)招聘备案制180人报名入口4月24日9时开通,报名时间截止4月26日16:00,为

天天快资讯:2023山东济宁泗水县事业单位(教育类)招聘104人报名入口

2023济宁泗水县事业单位(教育类)招聘104人报名入口4月24日9时开通,报名时间截止4月26日16:00,为了帮助

全球即时:2023山东济宁微山县事业单位(教育类)招聘140人报名入口

2023济宁微山县事业单位(教育类)招聘140人报名入口4月24日9时开通,报名时间截止4月26日16:00,为了帮助

当前关注:浙江检察机关依法对林晓峰涉嫌受贿、滥用职权案提起公诉

绍兴市人民检察院起诉指控:被告人林晓峰利用担任苍南县委常委、组织部部长、副县长,乐清市委副书记、市长

襄阳樊城人民路社区:义剪进社区 便民暖民心

襄阳樊城人民路社区:义剪进社区便民暖民心---4月20日,襄阳市樊城区人民路社区联合绝妙美容美发学校走进小

84消毒液可以往床上喷吗?-全球观察

不能。84消毒剂不能直接喷在床上,其主要成分为次氯酸钠,其分解所释放的氯离子具有漂白、杀菌作用,但也具有

今日热闻!最高购房补贴100万元!北京房山发布引才聚才十一条

涵盖资金奖励、引进落户、住房保障、子女教育、医疗健康等11个方面。

贝壳租房发布省心租10大服务,为宁波市民带来省心租住体验

租房比买房还要“难”?在租房生活中,业主和租客难免会遇到各种各样的烦心琐事。业主怕房子受损,怕收益没

帅丰电器: 浙江帅丰电器股份有限公司2022年度利润分配预案公告

帅丰电器:浙江帅丰电器股份有限公司2022年度利润分配预案公告

三元股份: 三元股份第八届董事会第十二次会议决议公告

三元股份:三元股份第八届董事会第十二次会议决议公告

全球即时:祥源文旅: 第八届董事会第十五次会议决议公告

祥源文旅:第八届董事会第十五次会议决议公告

华电重工: 华电重工:第四届董事会第九次会议决议公告

华电重工:华电重工:第四届董事会第九次会议决议公告

拥抱资本力量 奔赴资本赛道“陕字头”专精特新企业访团走进深交所 世界今热点

4月12日至14日,在陕西股权交易中心主办、西安高新金融控股集团有限公司金融数据板块旗下西安高新区金服投

“五一”酒店订单量大增 酒店一线岗位人员紧缺

以往酒店行业在经历了春节之后会进入传统的淡季,但今年市场呈现出“淡季不淡”的特点。随着整体经济和消费

2023年4月20日鸡蛋价格偏强而行

2023年4月20日鸡蛋价格偏强而行4月20日讯,当前我国在产蛋鸡存栏整体仍偏低,库存不大,供应上仍能提供支撑

即时:恭喜孙颖莎!邱贻可立功!国际乒联官宣喜讯,陈梦王曼昱懂了

北京时间4月20日,WTT澳门冠军赛激战正酣,孙颖莎在首轮比赛中3--0横扫马特洛娃晋级女单16强。在上一站新乡

每日快看:美媒再度发文披露美国政府监听联合国秘书长古特雷斯,外交部回应

【环球时报-报道记者白云怡】美国媒体近日再度发文披露,美国政府监听联合国秘书长古特雷斯同各国领导人及

环球要闻:三峡水利(600116.SH):一季度发电量同比下降主要系水电站所处流域来水量减少所致

格隆汇4月19日丨有投资者通过上证E互动向三峡水利提问,“23年一季度的天气难道比22年三季度还要干旱吗。23

信安世纪(688201.SH):在企业领域主要包含电信运营商、大型央国企、华为技术等

格隆汇4月19日丨有投资者向信安世纪提问客户行业分布上,企业重要包含哪些。信安世纪回复在企业领域,主要

综合资讯

+更多

热点资讯

+更多
股票MA指标怎么看?股票的量比是什么意思?
股票MA指标怎么看?1、平均线从下跌中逐渐趋于平稳,而股价从平均线,下方突破,称为黄金进行交叉,表明企业可能有上涨趋势发展即将学习开始 [详细]

Copyright @ 2008-2020  www.43710.com   All Right Reserved Powered by 财经情报网 版权所有

财经情报网   联系邮箱:562 66 29@qq.com

网站备案:沪ICP备2020036824号-12