这是我参与更文挑战的第4天,活动详情查看: 更文挑战
在平时的工作中 ,我们可能会遇到需要在SVG图上或是某个DOM上打点的需求,下面实现了在SVG图上打点的功能,如果需要在其他DOM上打点也可以参照此方法。
说一下思路:
一、如何在SVG图片里再插入图片
- 要想在SVG图上打点,首先想着怎么在SVG图片里插入图片,创建一个SVG的image标签
const svgImgDom = document.createElementNS(
'http://www.w3.org/2000/svg',
'image',
);
- 然后引入图片,设置图片的宽高,并添加class,这都可以用setAttributeNS() 来实现
- 之后可以通过appendChild()将带有图片信息的svgImgDom插入到SVG图片中
二、插入图片的位置
- 获取svg图片针对整个窗口的页面偏移量
const svgDom = this.$refs.svgBox;
const svgOffset = {
x: svgDom.getBoundingClientRect().left,
y: svgDom.getBoundingClientRect().top,
};
- svg页面缩放系数
const pageScale = {
x: 752.333 / svgDom.offsetWidth, // svg标签内viewBox的值
y: 430 / svgDom.offsetHeight,
};
3.鼠标偏移量 (缩放页面后正确的鼠标位置)
// 这里 svgDom.offsetWidth/21 和 svgDom.offsetHeight/2.77 宽高相除的比例可以根据实际点位灵调整,
// 有了整个缩放比例,当窗口size更改时也可以自动适用点位的偏移
const mouseOffset = {
x: ((e.pageX + svgDom.offsetWidth/21) - svgOffset.x) * pageScale.x,
y: ((e.pageY + svgDom.offsetHeight/2.77) - svgOffset.y) * pageScale.y,
};
下面是完整的代码
HTML
<div @click="clickPoint" class="svgBox" id="svgBox" ref="svgBox">
<svg id='SVGDom' class='SVGDom' version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="78 205.89 752.333 430" style="enable-background:new 78 205.89 752.333 430;" xml:space="preserve">
</svg>
</div>
JS部分
clickPoint(e) {
const svgDom = this.$refs.svgBox;
const svgOffset = {
x: svgDom.getBoundingClientRect().left,
y: svgDom.getBoundingClientRect().top,
};
const pageScale = {
x: 752.333 / svgDom.offsetWidth, // svg标签内viewBox的值
y: 430 / svgDom.offsetHeight,
};
const mouseOffset = {
x: ((e.pageX + svgDom.offsetWidth/21) - svgOffset.x) * pageScale.x,
y: ((e.pageY + svgDom.offsetHeight/2.77) - svgOffset.y) * pageScale.y,
};
const svgImgDom = document.createElementNS(
'http://www.w3.org/2000/svg',
'image',
);
svgImgDom.setAttributeNS(null, 'height', '50');
svgImgDom.setAttributeNS(null, 'width', '50');
svgImgDom.setAttributeNS(
'http://www.w3.org/1999/xlink',
'href',
require('../../assets/greenPoint.jpeg'),
);
svgImgDom.setAttributeNS(null, 'x', mouseOffset.x);
svgImgDom.setAttributeNS(null, 'y', mouseOffset.y);
svgImgDom.setAttributeNS(null, 'class', 'addPointImgs');
document.getElementById('SVGDom').appendChild(svgImgDom);
// 删除图标
const className = e.target.classList[0];
if (className === 'addPointImgs') {
this.deletePointFun(e);
}
},
// 删除点位
deletePointFun(e) {
const el = e.target;
this.$confirm('确定删除该点位信息吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
this.$message({
type: 'success',
message: '删除成功!',
});
el.remove();
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除',
});
});
},
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!