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的更多相关文章

  1. Firefox SVG getBBox方法返回'NS_ERROR_FAILURE'错误分析

    在SVG中,我们无法给Text元素设置Width和Height属性,因此无法直接获取Text元素的高和宽.如果想要给Text元素添加背景色,最简单的办法就是在Text元素的下面添加Rect,然后给Re ...

  2. SVG学习备忘录

    最近在写一个基于SVG的前端流程图\拓扑图图形框架. 一些容易忽略的问题备忘如下: 1.JS添加SVG元素需要使用document.createElementNS("http://www.w ...

  3. SVG DOM常用属性和方法介绍

    将以Adobe SVG Viewer提供的属性和方法为准,因为不同解析器对JavaScript以及相关的属性和方法支持的程度不同,有些方法和属性是某个解析器所特有的.SVG支持DOM2标准. 12.2 ...

  4. HTML5的 2D SVG和SVG DOM的学习笔记(1)

    (项目中要使用SVG,只好补充知识了) HTML体系中,最常用的绘制矢量图的技术是SVG和HTML5新增加的canvas元素.这两种技术都支持绘制矢量图和光栅图. 一.SVG概述 可缩放矢量图形(Sc ...

  5. JavaScript对SVG进行操作的相关技术

    原文地址:http://www.ibm.com/developerworks/cn/xml/x-svgscript/   本文主要介绍在 SVG 中通过编程实现动态操作 SVG 图像的知识. SVG ...

  6. 基于HTML5 SVG炫酷文字爆炸特效

    这是一款使用html5 svg.css3和js制作的炫酷文字爆炸特效.该文字特效用SVG path属性将文字路径切割为很多小块,然后使用css3和js在鼠标滑过文字时制作文字爆炸分裂的炫酷效果. 在线 ...

  7. SVG基础以及使用Javascript DOM操作SVG

    SVG 不依赖分辨率 支持事件处理器 最适合带有大型渲染区域的应用程序(比如谷歌地图) 复杂度高会减慢渲染速度(任何过度使用 DOM 的应用都不快) 不适合游戏应用 Canvas 依赖分辨率 不支持事 ...

  8. SVG之文本

    一.文本标签<text> SVG支持直接对文本进行操作,如果我们需要在SVG中使用文本,那么我们需要使用到<text>标签.直接看一个简单的demo. <!DOCTYPE ...

  9. svg绘图工具raphael.js的使用

    1.raphael.js svg画图的开源库,支持IE8+ 官方api: http://dmitrybaranovskiy.github.io/raphael/reference.html Githu ...

随机推荐

  1. CF42A

    题意 给定两个序列 a 和 b. 序列 a 中的各个数之间的比例可以得出一个 x . 当 b 中比例满足 a 中比例,即 \(b_1\):\(b_2\):\(b_3\)-- \(=\) \(a_1\) ...

  2. CentOS 安装TFTP

    1.当然是使用yum安装最直接,一共会安装3个东东tftp.i386tftp-server.i386xinetd.i386[root@localhost CentOS]# yum -y install ...

  3. HTML字体

    字体相关的样式 color 用来设置字体颜色 font-size 字体的大小 和font-size相关的单位 em 相当于当前元素的一个font-size rem 相当于根元素的一个font-size ...

  4. 一篇文章图文并茂地带你轻松学完 JavaScript 继承

    JavaScript 继承 在阅读本文章之前,已经默认你了解了基础的 JavaScript 语法知识,基础的 ES6 语法知识 . 继承种类 简单的继承种类可以分为 构造函数继承 原型链继承 clas ...

  5. SQL中字符串截取函数(SUBSTRING)

    1.left(name,4)截取左边的4个字符 列: SELECT LEFT(201809,4) 年 结果:2018 2.right(name,2)截取右边的2个字符 SELECT RIGHT(201 ...

  6. HDU 6762 Mow (2020 Multi-University Training Contest 1 1012) 半平面交

    Mow 题目链接 分析 将多边形的边向内部缩 r 个单位长度,然后这些边所围成的内部区域,就是圆心的合法范围,该范围也是一个多边形,假设面积是\(a\),周长是\(b\),那么可以知道圆可以覆盖的面积 ...

  7. Codeforces Round #683 (Div. 2, by Meet IT)【ABCD】

    比赛链接:https://codeforces.com/contest/1447 A. Add Candies 题意 \(1\) 到 \(n\) 个袋子里依次有 \(1\) 到 \(n\) 个糖果,可 ...

  8. zoj2112 Dynamic Rankings (主席树 || 树套树)

    The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...

  9. 【bzoj 1190】梦幻岛宝珠(DP)

    这题是在01背包问题的基础上,扩充了重量,需要用时间换空间. 思路: 1.仔细看题,注意到重量wi为a*2^b(a<=10,b<=30),很容易想到要按 b 分开做背包的DP.接下来的重点 ...

  10. 【uva 11572】Unique Snowflakes(算法效率--滑动窗口,3种实现方法)

    题意:求长度为N的序列中,最长的一个无重复元素的连续子序列. 解法:[L,R]每次R++或L++延伸就可以得到答案. 实现:(1)next[],last[]--O(n): 1 #include< ...