1. 程式人生 > >js操作svg整體縮放

js操作svg整體縮放

首先我們先建立一個svg整體佈局,程式碼如下:

<!DOCTYPE html>
<html>
<head>
    <title>js操作svg實現整體縮放</title>
    <meta charset="utf-8">
</head>
<body>
    <svg id="svg" style="background:#FAFAFA;">
        <g id="svgPanel">
            <g id="grid"></g>
<circle fill="red" r="50" cx="100" cy="100"></circle> </g> </svg> <button onclick="zoom(1.1)">放大</button> <button onclick="zoom(0.9)">縮小</button> </body> </html>

js程式碼來控制svg整體的大小並且利用svg來繪製背景網格:

<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} winHeigth 區域高度 * @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 i = 0, len = Math.ceil(winWidth / gridLength); i <= len; i++) { var attrs = { x1: i * gridLength, y1: 0, x2: i * gridLength, y2: winHeight, stroke: "#ddd" }; var line = resetSVG("line", attrs); svgBackground.appendChild(line); }; for (var i = 0, len = Math.ceil(winHeight / gridLength); i <= len; i++) { var attrs = { x1: 0, y1: i * gridLength, x2: winWidth, y2: i * gridLength, stroke: "#ddd" }; var line = resetSVG("line", attrs); svgBackground.appendChild(line); }; } /** * 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 k in attrs) { element.setAttribute(k, attrs[k]); } return element; } /** * svg放縮 * {Float} num 放縮的倍數 */ function zoom(num){ scale *= num; svgPanel.setAttribute("transform","scale("+scale+")"); } </script>

這樣我們就可以實現svg的整體放縮了,如下圖:

整體放縮圖片

當我們縮小時,背景網格也跟著縮小而不能填充整個畫板,這不是我們想要的,做一下改動,修改zoom函式如下:

/**
 * svg放縮
 * {Float} num 放縮的倍數
 */
function zoom(num){
    scale *= num;
    svgPanel.setAttribute("transform","scale("+scale+")");
    drawGrid(gridSvg,width*(1/scale),height*(1/scale),gridLength);
}

每次放縮都重繪svg網格,這樣就可以了:

重繪svg網格

然後我們繫結滑鼠滑輪事件來實現縮放,程式碼如下:


//繫結滑鼠滑輪事件
if(document.addEventListener){                                
    document.addEventListener('DOMMouseScroll',scrollZoom,false);
}
window.onmousewheel=document.onmousewheel=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);
}

效果如下:
滑輪滾動縮放

示例下載:點選這裡