SVG & getBBox
SVG & getBBox
https://developer.mozilla.org/en-US/docs/Web/API/SVGGraphicsElement/getBBox
const paths = [...svgDOM.querySelectorAll('path')];
paths.sort((p1, p2) => {
let bbox1 = p1.getBBox();
let bbox2 = p2.getBBox();
// area size ???
return bbox1.width * bbox1.height > bbox2.width * bbox2.height ? -1 : 1;
});

demo

https://codepen.io/xgqfrms/pen/dyPxWmx
<?xml version="1.0" encoding="UTF-8"?>
<svg width="503px" height="201px" viewBox="0 0 503 201" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53 (72520) - https://sketchapp.com -->
<title>Untitled</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Group" stroke="#979797">
<path d="M4.38721467,1.4235713 C59.7165062,1.54698994 115.052053,0.918023607 170.375089,1.79382724 C227.433418,2.69710179 249.992895,63.9728163 239.941091,114.442228 C235.910943,134.677325 212.350177,157.135741 196.017797,167.282477 C164.156433,187.076828 70.6314282,142.459532 58.182101,137.795924 C38.324153,130.356993 31.9738723,115.324132 23.3896517,95.5788692 C9.10509367,62.7217974 3.34577363,43.8445274 1.25793506,10.0733803 L4.38721467,1.4235713 Z" id="Path"></path>
<path d="M472.25,76.3671875 C449.049028,101.903828 427.709436,153.150454 449.261719,185.628906 C459.747498,201.430568 500.227095,209.243672 501.375,181.515625 C502.37375,157.390456 502.225265,133.208983 501.375,109.078125 C500.481543,83.7214536 481.523964,92.0067994 466.945312,77.5078125" id="Path-2" fill="#D65252"></path>
</g>
</g>
</svg>
const addSVG = (svg) => {
this.bgSVG = svg;
// 插入 svg
let div = document.createElement('div');
div.innerHTML = svg;
let styleTag = div.querySelectorAll('style')[0];
if (styleTag) {
Style.parse(styleTag.innerHTML);
}
let polygons = Array.prototype.slice.apply(div.querySelectorAll('polygon'))
let polylines = Array.prototype.slice.apply(div.querySelectorAll('polyline'))
let paths = Array.prototype.slice.apply(div.querySelectorAll('path'))
let rects = Array.prototype.slice.apply(div.querySelectorAll('rect'))
let texts = Array.prototype.slice.apply(div.querySelectorAll('text'))
paths.sort((p1, p2) => {
let bbox1 = p1.getBBox()
let bbox2 = p2.getBBox()
return bbox1.width * bbox1.height > bbox2.width * bbox2.height ? -1 : 1
}).forEach((p) => {
let result = []
let pathData = p.getAttribute('d');
// STEP1: path to points
let points = pathDataToPolys(pathData, {tolerance: 1, decimals: 1})[0];
console.log(`points`, points);
// debugger;
result = points.map(p => new Point(p[0], p[1]));
// result = points.map((p) => {
// log(p[0], p[1])
// return new Point(p[0], p[1])
// })
// STEP2: points to polygons
let polygon = new Polygon(result);
let fill = Polygon.getFillColorFromNode(p);
polygon.fill = fill;
// 存储 Features
if (result.length) {
this.$store.dispatch('addFeature', polygon);
}
})
polygons.forEach((p) => {
let polygon = Polygon.fromSVG(p)
this.$store.dispatch('addFeature', polygon)
})
polylines.forEach((p) => {
let polygon = Polygon.fromSVG(p)
this.$store.dispatch('addFeature', polygon)
})
// 存储 texts
texts.forEach((text) => {
var transform = text.getAttribute('transform')
var matrixTransform = transform && transform.match(/^matrix\(([^)se]+)\)$/i)
matrixTransform = matrixTransform && matrixTransform[1]
var transformX = matrixTransform ? +matrixTransform.split(' ')[4] : 0
var transformY = matrixTransform ? +matrixTransform.split(' ')[5] : 0
var x = +text.getAttribute('x')
var y = +text.getAttribute('y')
if (x === 0 && y === 0) {
var tspan = text.getElementsByTagName('tspan')[0]
if (tspan) {
x = +tspan.getAttribute('x')
y = +tspan.getAttribute('y')
}
}
this.$store.dispatch('addText', {
text: text.textContent.trim(),
coordinate: new Point(transformX + x, transformY + y)
})
})
rects.forEach((r) => {
let polygon = Polygon.fromRect(r)
this.$store.dispatch('addFeature', polygon)
})
};
SVG & getBBox的更多相关文章
- Firefox SVG getBBox方法返回'NS_ERROR_FAILURE'错误分析
在SVG中,我们无法给Text元素设置Width和Height属性,因此无法直接获取Text元素的高和宽.如果想要给Text元素添加背景色,最简单的办法就是在Text元素的下面添加Rect,然后给Re ...
- SVG学习备忘录
最近在写一个基于SVG的前端流程图\拓扑图图形框架. 一些容易忽略的问题备忘如下: 1.JS添加SVG元素需要使用document.createElementNS("http://www.w ...
- SVG DOM常用属性和方法介绍
将以Adobe SVG Viewer提供的属性和方法为准,因为不同解析器对JavaScript以及相关的属性和方法支持的程度不同,有些方法和属性是某个解析器所特有的.SVG支持DOM2标准. 12.2 ...
- HTML5的 2D SVG和SVG DOM的学习笔记(1)
(项目中要使用SVG,只好补充知识了) HTML体系中,最常用的绘制矢量图的技术是SVG和HTML5新增加的canvas元素.这两种技术都支持绘制矢量图和光栅图. 一.SVG概述 可缩放矢量图形(Sc ...
- JavaScript对SVG进行操作的相关技术
原文地址:http://www.ibm.com/developerworks/cn/xml/x-svgscript/ 本文主要介绍在 SVG 中通过编程实现动态操作 SVG 图像的知识. SVG ...
- 基于HTML5 SVG炫酷文字爆炸特效
这是一款使用html5 svg.css3和js制作的炫酷文字爆炸特效.该文字特效用SVG path属性将文字路径切割为很多小块,然后使用css3和js在鼠标滑过文字时制作文字爆炸分裂的炫酷效果. 在线 ...
- SVG基础以及使用Javascript DOM操作SVG
SVG 不依赖分辨率 支持事件处理器 最适合带有大型渲染区域的应用程序(比如谷歌地图) 复杂度高会减慢渲染速度(任何过度使用 DOM 的应用都不快) 不适合游戏应用 Canvas 依赖分辨率 不支持事 ...
- SVG之文本
一.文本标签<text> SVG支持直接对文本进行操作,如果我们需要在SVG中使用文本,那么我们需要使用到<text>标签.直接看一个简单的demo. <!DOCTYPE ...
- svg绘图工具raphael.js的使用
1.raphael.js svg画图的开源库,支持IE8+ 官方api: http://dmitrybaranovskiy.github.io/raphael/reference.html Githu ...
随机推荐
- codevs 1344 模拟退火
1344 线型网络 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamo 题目描述 Description 有 N ( <=20 ) 台 PC 放在机房内 ...
- Grafana部署监控docker服务
Grafana部署监控docker服务 一.使用InfluxDB+cAdvisor+Grafana配置Docker监控 1.1Docker监控组件 1.2cAdvisor: 1.3Docker监控安装 ...
- 将一个 JavaBean 对象转化为一个 Map
package com.loan.modules.common.util; import java.beans.BeanInfo; import java.beans.IntrospectionExc ...
- KVM (虚拟化网络管理)
vlan:https://www.cnblogs.com/du-z/p/10802786.html trunk:https://www.cnblogs.com/du-z/p/10804773.html ...
- 9. Linux用户身份和能力
root 拥有最高的系统所有权,能够管理系统的各项功能,如添加/删除用户.启动/关闭服务进程.开启/禁用硬件设备等.以root 管理员的身份工作时不会受到系统的限制 在Linux 系统中,UID 有唯 ...
- 使用两个FIFO完成流水操作
一.设计目标 写一个FIFO控制器,控制器里有两个FIFO,输入的数据由串行接收模块(uart_rx_module)送来,一共有86行86列的数据,按0.1.2行,1.2.3行,直到最后83.84.8 ...
- 腾讯云TcaplusDB获新加坡MTCS最高等级安全认证
近日,经过国际权威认证机构DNV GL的全面评估审核,TcaplusDB获得了新加坡多层云安全(以下简称"MTCS")T3级最高等级认证,这标志着TcaplusDB全面满足了新加坡 ...
- Redis-第七章节-持久化
目录 概述 RDB AOF 如何选择持久化机制 1.概述 Redis 是内存数据库,如果不能将内存中的数据保存到磁盘中,那么一旦服务器进程退出,服务器的数据库数据也会消失,所以Redis提供了持久化的 ...
- 【奇淫巧技】Bypass阿里云注入
序言 我:摸鱼一时爽,一直摸鱼一时爽啊:relieved:大佬:还摸鱼,快来搞个注入.我:... 拿到数据包 GET /wxapp.php?i=undefined&t=undefined&am ...
- python内置常量是什么?
摘要:学习Python的过程中,我们会从变量常量开始学习,那么python内置的常量你知道吗? 一个新产品,想熟悉它,最好的办法就是查看说明书! 没错,Python也给我们准备了这样的说明书--Pyt ...