直接撸代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>js控制SVG缩放</title> </head> <body> <svg id="svg" style="background-color: #FAFAFA;"> <g id="svgPanel"> <g id="grid"></g> <defs> <path id="path1" d="M300,200 a1,1 0 0,0 100,0" /> </defs> <text x="10" y="100" style="fill:green;"> <textPath xlink:href="#path1">啦啦啦啦啦啦啦啦啦啦</textPath> </text> </g> </svg> <button onclick="zoom(1.1)">放大</button> <button onclick="zoom(0.9)">缩小</button> <script type="text/javascript"> var svg = document.getElementById('svg'); var svgPanel = document.getElementById('svgPanel'); var gridSvg = document.getElementById('grid'); var width = 800; // 设置svg整体的宽和高 var height = 400; var gridLength = 20; // 定义网格的大小 svg.setAttribute('width', width); svg.setAttribute('height', height); // 绘制网格 drawGrid(gridSvg, width, height, gridLength); /* * 绘制网络 * @param {Object} svgBackground 绘制网格对象 * @param {Int} winWidth 区域宽度 * @param {Int} winHeight 区域高度 * @param {Int} gridLength 网格大小 */ function drawGrid(svgBackground, winWidth, winHeight, gridLength) { var childs = gridSvg.childNodes; // 删除之前的网格节点,便于绘制 for (var i = childs.length - 1; i>= 0; i--){ svgBackground.removeChild(childs.item(i)); } for (var j = 0,len = Math.ceil(winWidth / gridLength); j < len; j++){ var attrs = { x1 : j * gridLength, y1 : 0, x2 : j * gridLength, y2 : winHeight, stroke : '#add' }; var line = resetSvg('line', attrs); svgBackground.appendChild(line); } for (var k = 0, len2 = Math.ceil(winHeight / gridLength); k <= len2; k++){ var attrs2 = { x1 : 0, y1 : k * gridLength, x2 : winWidth, y2 : k * gridLength, stroke : '#add' }; var line2 = resetSvg('line', attrs2); svgBackground.appendChild(line2) } } /* * js创建svg元素 * @param {String} tag svg的标签名 * @param {Object} svg元素的属性 */ function resetSvg(tag, attrs) { var element = document.createElementNS('http://www.w3.org/2000/svg', tag); for (var g in attrs){ element.setAttribute(g, attrs[g]) } return element; } /* * svg缩放 * {Float} num 收缩的倍数 */ var scale = 1; function zoom(num) { scale *= num; svgPanel.setAttribute('transform', 'scale(' + scale + ')'); drawGrid(gridSvg, width*(1/scale), height*(1/scale), gridLength); } // 绑定鼠标滑轮 if (document.addEventListener){ document.addEventListener('DOMMouseScroll', scrollZoom, false); } window.onmousewheel = document.onmousewhell = scrollZoom; /* * 滑轮滚动处理事件,向上滚动放大 * {Object} e 事件对象 */ function scrollZoom(e) { e = e || window.event; // e.detail用来兼容FireFox e.wheelDelta>0 || e.detail>0?zoom(1.1):zoom(0.9); } </script> </body> </html>