• JS控制SVG缩放+鼠标控制事件


    话不多说,直接上代码吧,不行你砍我。。。

    <!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>
  • 相关阅读:
    函数式编程与命令式编程的学习难度比较
    Swfit4.0中JSON与模型原生互转(JSONEncoder/JSONDecoder的使用)
    元类型与类型的区别
    Swift
    swift类型操作规范
    PHP实现执行定时任务的几种思路详解
    基于ThinkPHP与阿里大于的PHP短信验证功能
    laravel中将session由文件保存改为数据库保存
    laravel5.*安装使用Redis以及解决Class 'PredisClient' not found和Fatal error: Non-static method Redis::set() cannot be called statically错误
    Python基础知识汇总
  • 原文地址:https://www.cnblogs.com/zhigu/p/11753637.html
Copyright © 2020-2023  润新知