最新要闻
- 【世界报资讯】何冰:演员没有理解力就只剩大声说话了
- 合金弹头觉醒前期最强阵容搭配推荐
- 【天天热闻】4999元 机械师推出新款创物者X14笔电:RTX2050 4GB独显
- 当前热讯:小米13/13 Pro/13 Ultra三款机型对比:到底怎么选 一目了然
- 【快播报】暴雪承认《暗黑破坏神4》洗点费用有点贵 但不会改
- 沙尘翻过秦岭入川:局地AQI爆表!成都“躲过一劫”
- 天天短讯!雷军现身比亚迪腾势、仰望展台 用小米13 Ultra狂拍
- 世界热门:工信部:将实施5G规模化应用工程 指导发布5G行业建设指南
- 全球时讯:最新持仓浮出水面:百亿级私募左手AI右手“央国企”
- 滚动:蛇怕什么?
- 环球速递!小米之家人山人海!小米13 Ultra销售火爆
- 今日热搜:广告内容“量身定制”!谷歌计划使用生成式AI推送广告
- 天天热门:女子眼球被摘除,竟是痔疮惹的祸!
- 疯狂育儿模式 长达4年半不吃不喝不挪窝:自虐死亡的章鱼图啥?
- 瑞幸咖啡员工称被罚抄写顾客差评 客服回应:对顾客负责
- 天天观察:AMD YES!史上最强核显Radeon 780M首测:《赛博朋克2077》流畅丝滑
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【环球新要闻】记录-JS简单实现购物车图片局部放大预览效果
(资料图)
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
一、实现效果
二、代码实现
代码不多,先看一下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.js和 package.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
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
关键词:
关注:深度学习--PyTorch维度变换、自动拓展、合并与分割
【环球新要闻】记录-JS简单实现购物车图片局部放大预览效果
创建本地yum仓库
【世界报资讯】何冰:演员没有理解力就只剩大声说话了
合金弹头觉醒前期最强阵容搭配推荐
【天天热闻】4999元 机械师推出新款创物者X14笔电:RTX2050 4GB独显
当前热讯:小米13/13 Pro/13 Ultra三款机型对比:到底怎么选 一目了然
【快播报】暴雪承认《暗黑破坏神4》洗点费用有点贵 但不会改
沙尘翻过秦岭入川:局地AQI爆表!成都“躲过一劫”
天天短讯!雷军现身比亚迪腾势、仰望展台 用小米13 Ultra狂拍
世界热门:工信部:将实施5G规模化应用工程 指导发布5G行业建设指南
全球时讯:最新持仓浮出水面:百亿级私募左手AI右手“央国企”
【天天播资讯】Natasha Preheating(三)
全球新动态:集合 第二天
环球今热点:24道Python面试练习题
Kubesphere-DevOps-记一次流水线排错
新起点!大数据分布式可视化的 DAG 任务调度系统 Taier 正式发布1.4版本
滚动:蛇怕什么?
环球速递!小米之家人山人海!小米13 Ultra销售火爆
今日热搜:广告内容“量身定制”!谷歌计划使用生成式AI推送广告
天天热门:女子眼球被摘除,竟是痔疮惹的祸!
疯狂育儿模式 长达4年半不吃不喝不挪窝:自虐死亡的章鱼图啥?
瑞幸咖啡员工称被罚抄写顾客差评 客服回应:对顾客负责
天天观察:AMD YES!史上最强核显Radeon 780M首测:《赛博朋克2077》流畅丝滑
当前观察:2023年医保新规如何给家人用?医保卡新规2023一家人用可以吗?
全球短讯!k8s介绍与常用命令
我替 OpenAI 实现了 ChatGPT 聊天记录复制功能
天天讯息:ubuntu编译字符设备
今日热门!咨询chatGPT关于c#脚本的方案,全文无任何修改。
天天通讯!GIS在电力管理中的应用
央行:我国不存在长期通缩或通胀的基础
观焦点:新华社权威快报|5G基站超264万个 我国数字化基础不断夯实
天天微动态丨汽车厂商要登月!现代联手科研机构开发探月机器人
当前播报:俄罗斯开发者拿到钱了 显卡超频神器Afterburner恢复更新:等了1年半
环球热消息:斯柯达研发新EA211系列发动机:全新帕萨特、速派等50车搭载
人类最强火箭!SpaceX星舰今晚重新发射:目前系统一切正常
天天热议:宝马MINI的冰淇淋只配老外吃:高管刚表示BMW家在中国
“零工市场”为灵活就业“添翼续航”
“4.5%”彰显中国经济的韧性和活力
“中国车企加速迈向电动化,将国际老牌车企甩在身后”
环球新动态:IDEA编译Spring源码教程
微资讯!使用etcd实现Master的选举功能
Rust 知识积累(6)
当前快播:【Jmeter】Request1输出作为Request2输入-后置处理器
世界热文:详解数据结构中栈的定义和操作
通讯!估值1000亿 消息称国产内存厂商寻求IPO上市:4年前量产首款DDR4芯片
张颂文用小米13 Ultra拍照!网友建议加上水印
【天天时快讯】巴西总统认为电子游戏是垃圾 让年轻人学会暴力杀戮
长达10年维护落幕:微软提醒Office 2013已停止支持
当前速看:郑渊洁称维权生活像吃苍蝇:21年只成功37个商标 还有673个没成
联想刘军:今年将是大客户市场的 “大年”
浑厚悠扬!三号楼的钟声……
每日热议!房玄龄杜如晦被谁重用_房玄龄杜如晦
全球快资讯:springboot 中使用 RabbitMQ 配置使用优先级队列
查看Unity3D中默认的变量名与按键的映射
时隔6年后,我又回到博客园了
环球看点!更新整理了一大波热门免费可用的API大全
微动态丨ChatGPT闲谈——火出圈的为什么是 OpenAI?
新消息丨微软苏菲要换代了!Surface Pro 10/Go 4新品曝光:外形/配置大变
【环球报资讯】最新研究:黄河上游区域性干旱能“算来”
这个火车站客流暴增,原因竟是……
全球信息:雪莲子的功效与副作用 雪莲子的功效与作用及食用方法
世界播报:真我11系列拍摄样张首秀:长焦恐怖 可见月亮纹理
【热闻】没人比我更懂外星人?马斯克:如果找到外星人 我立马发推
环球热资讯!ZV-E10同款传感器:索尼FX10视频机即将发布
环球快资讯:熊孩子躲袋子里玩误被司机碾压 路人合力抬车救援:网友吐槽家长心大
环球速看:一大众轿车高速路恶意别车!S形行驶10公里:官方已介入调查
每日焦点!诺诚健华宣布奥布替尼成为中国首个且唯一获批针对边缘区淋巴瘤的BTK抑制剂
田园变游园
中国联通跌5.6% 民生证券在其年内高点推荐
全球简讯:再获殊荣!华为云GaussDB喜提“科技进步一等奖”
当前最新:开发者必读!常用的二维码生成器 API 推荐
第六章 面向对象编程
当前短讯!【备忘录设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
全球讯息:JavaScript 九九乘法表
每日快看:墨水人_墨水
即时:今日描写冬季的古诗名句_描写冬季的古诗
仙剑系列首款开放世界游戏!《仙剑世界》公布首支预告
每日看点!用科技诠释豪华!一文看懂AITO问界M9有多少硬核“黑科技”
环球信息:西安一极氪001全国首烧?极氪回应:初步排除电池起火
全球最新:价格崩了!全新日产天籁直降4.9万:不到14万可买合资中型轿车
全球快报:上海车展宝马Mini展台被曝区别对待 冰激淋只给外国人免费吃
进程处于临界区是什么状态?进程处于临界区可以调度吗?
iu14D2N.tmp是什么意思?iu14D2N.tmpiu14D2N.tmp可以删除吗?
miui开发版内测和公测哪个好?miui开发版内测更新频率是多长时间?
拆机版单反是什么意思?拆机版单反与套机的区别是什么?
苹果IPAD用哪个助手好?苹果ipad型号大全及价格表
当前速读:后台性能测试规范
世界聚焦:福建省练习题
Oracle 备忘清单_开发速查表分享
环球速讯:我想听张惠妹的歌_渴了 张惠妹演唱歌曲
今热点:蜂巢能源“龙鳞甲汽车电池”亮相:续航超1000km 热失控不起火
全球报道:清热降火 一朵泡一杯!徽春堂金丝皇菊10.9元大促(2袋约50朵)
华为智能驾驶总裁:华为智能驾驶体验明显好于特斯拉
小米13 Ultra京东全版本卖断货!很多米粉跟员工要F码
【天天快播报】加量还减价!小米平板6 Pro预售战报出炉:2023年双平台预售量新高
到2028年AIoT平台市场价值249亿美元
环球速讯:前端跨域解决方案——JSONP
最新消息:系统之家win7纯净版官网下载_系统之家win7纯净版官网
环球焦点!昆明高新区持续优化知识产权创新环境