当前位置:网站首页>svg+元素js实现在图片上描点成框,并获取相对图片的坐标位置
svg+元素js实现在图片上描点成框,并获取相对图片的坐标位置
2022-08-10 20:19:00 【SunFlower914】
首先大家需要了解下获取到x轴与y轴坐标有哪些方法:
e.offsetX:鼠标相对于事件源的X方向的距离( firfox 不支持)
e.offsetY:鼠标相对于事件源的Y方向的距离( firfox 不支持)
e.clientX:距离浏览器可视区域X方向的距离
e.clientY:距离浏览器可视区域Y方向的距离
e.pageX:鼠标相对于文档X方向的距离( ie678 不支持)
e.pageY:鼠标相对于文档X方向的距离( ie678 不支持)
e.screenX:鼠标距离屏幕X方向的距离
e.screenY:鼠标距离屏幕Y方向的距离(包含浏览器的地址栏)
svg实现效果:
svg代码:
1.结构上,可以将svg与img保持同样大小,通过absolute定位到img上面
<div class="box">
<img src="./plant-1.png" style="width:100%">
<svg id="svg" width="100%" height="100%">
<polyline id="polygon" points="" marker style="fill:transparent; stroke: #e07cc2; stroke-width:3px;">
</polyline>
</svg>
</div>
<button id="back">回退</button>
<button id="clear">清除</button>
2.侦听svg的click事件,通过createSVGPoint方法创建svg坐标对象,计算鼠标点击在svg图片的相对位置,当鼠标点击到第四个点时,通过appendItem将第一个点坐标添加到points中,形成闭合矩形框效果
<script>
const clear = document.getElementById('clear')
const back = document.getElementById('back')
const polygon = document.getElementById('polygon')
let firstPoint = null, index = 0
svg.addEventListener('click', (e) => {
if (index > 4) return;
var point = svg.createSVGPoint();
point.x = e.offsetX;
point.y = e.offsetY;
if (!firstPoint) {
firstPoint = point
}
polygon.points.appendItem(point)
console.log(polygon.points,'polygon.points');
index++
if (index === 4) {
polygon.points.appendItem(firstPoint) && index++
}
console.log(polygon.points, point, 'point');
})
clogging.addEventListener('click', (e) => {
firstPoint && polygon.points.appendItem(firstPoint) && index++
clogging.disabled = true
})
back.addEventListener('click', (e) => {
index-- && polygon.points.removeItem(index)
clogging.disabled = false
})
clear.addEventListener('click', (e) => {
polygon.points.clear()
index = 0
clogging.disabled = false
})
</script>
原生js实现效果:
原生代码:
1.以浏览器文档作为对象确认点的定位位置,计算图片到浏览器可视窗口的位置
相对图片位置 = 到浏览器可视窗口位置 - 图片到浏览器可视窗口位置
x = e.clientX - img.getBoundingClientRect().left + 'px'
<style>
* {
margin: 0;
top: 0;
}
#div {
margin-top: 50px;
}
img {
border: 1px dashed red;
margin-top: 50px;
margin-left: 100px;
}
.dot {
width: 5px;
height: 5px;
position: absolute;
border-radius: 5px;
background-color: red;
}
</style>
</head>
<body>
<div id="div"><img src="./plant-1.png" alt="" id="avater"></div>
<script>
var img = document.getElementById('avater')
var div = document.getElementById('div')
let num = 0
img.addEventListener('click', (e) => {
//这里考虑到用户会竖向滚动页面,所以要实时获取图片到可视窗口位置
let x = e.clientX - img.getBoundingClientRect().left + 'px' //相对于图片的X
let y = e.clientY - img.getBoundingClientRect().top + 'px' //相对于图片的Y
console.log(x,y);
// 页面不超过4个点
num++
if(num>4) {
return;
}
// 鼠标到body距离
let dot = document.createElement('div')
dot.className = 'dot'
// 圆点定位到相对于body的位置
dot.style.left = e.pageX +'px'
dot.style.top = e.pageY+'px'
document.body.append(dot)
})
</script>
</body>
以上两种方法均可以完成记录相对于图片的坐标位置,同时支持回退操作
边栏推荐
- keepalived:故障检测自动修复脚本
- mysql----group by、where以及聚合函数需要注意事项
- The most complete GIS related software in history (CAD, FME, ArcGIS, ArcGISPro)
- 重载和重写
- @Autowired注解 --required a single bean, but 2 were found出现的原因以及解决方法
- MATLAB设计,FPGA实现,联合ISE和Modelsim仿真的FIR滤波器设计
- 电脑如何去掉u盘写保护的状态
- 力扣18-四数之和——双指针法
- whois information collection & corporate filing information
- 2020 ICPC Shanghai Site G
猜你喜欢
一次由groovy引起的fullGC问题排查
爱丁堡大学最新《因果机器学习: 医疗健康与精准医疗应用》2022综述
转铁蛋白(Tf)修饰去氢骆驼蓬碱磁纳米脂质体/香豆素-6脂质体/多柔比星脂质体
QoS Quality of Service Eight Congestion Avoidance
导入FontForge生成字体
- [email protected] NPs纳米酶|碳纳米管负载铂颗粒纳米酶|白血病拮抗多肽修饰的FeOPtPEG复合纳米酶"/>
Pt/CeO2单原子纳米酶|[email protected] NPs纳米酶|碳纳米管负载铂颗粒纳米酶|白血病拮抗多肽修饰的FeOPtPEG复合纳米酶
三子棋的设计和代码
铁蛋白颗粒Tf包载多肽/凝集素/细胞色素C/超氧化物歧化酶/多柔比星(定制服务)
echart 特例-多分组X轴
论文解读(g-U-Nets)《Graph U-Nets》
随机推荐
"Distributed Microservice E-commerce" Topic (1) - Project Introduction
nfs挂载服务器,解决挂载后无法更改用户id,无法修改、写文件,文件只读权限Read-only file system等问题
argparse——命令行参数解析
[Natural Language Processing] [Vector Representation] PairSupCon: Pairwise Supervised Contrastive Learning for Sentence Representation
Transferrin (TF) Modified Paclitaxel (PTX) Liposomes (TF-PTX-LP) | Transferrin (Tf) Modified Curcumin Liposomes
【语义分割】2015-UNet MICCAI
转铁蛋白修饰蛇床子素长循环脂质体/负载三七皂苷R1的PEG-PLGA纳米粒([email protected] NPs)
【二叉树】二叉搜索树的后序遍历序列
mysql----group by、where以及聚合函数需要注意事项
OPPO Enco X2 迎来秋季产品升级 旗舰体验全面拉满
2020 ICPC Shanghai Site G
【SemiDrive源码分析】【MailBox核间通信】51 - DCF_IPCC_Property实现原理分析 及 代码实战
zip文件协议解析
IIC通信协议总结[通俗易懂]
2019河北省大学生程序设计竞赛部分题题解
力扣18-四数之和——双指针法
(十二) findContours函数的hierarchy详解
运维面试题(每日一题)
多功能纳米酶Ag/PANI|柔性衬底纳米ZnO酶|铑片纳米酶|Ag-Rh合金纳米颗粒纳米酶|铱钌合金/氧化铱仿生纳米酶
laya打包发布apk