美文网首页
JS创建SVG标签/SVG使用JS动态生成饼图/SVG动画/VM

JS创建SVG标签/SVG使用JS动态生成饼图/SVG动画/VM

作者: 子心_ | 来源:发表于2019-07-10 09:12 被阅读0次

    JS创建SVG标签

        //SVG矢量图适应不同大小画布只需要将所有点的位置重新计算即可;
        //SVG不能直接使用createElement()来创建节点;
        //createElement()是用来创建HTML命名空间的标签,此函数是JS作者封装了createElementNS()得到的;
        //创建SVG命名空间的line标签,应当使用如下方式
        document.createElementNS('http://www.w3.org.2000/svg','line');
    

    SVG使用JS动态生成饼图

        <!DOCTYPE html>
        <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script>
            function d2a(n){
            return n*Math.PI/180;
            }
            window.onload=function (){
            let oSvg=document.getElementById('svg1');
            let cx=400,cy=300,r=200;
    
            let data=[800, 600, 1200, 3500, 2800, 500];
    
            let sum=0;
            data.forEach(item=>sum+=item);
    
            let now=0;
            data.forEach(item=>{
                let ang=360*item/sum;
                console.log(ang,item,sum);
                let color=Math.floor(Math.random()*16777216).toString(16);
                while(color.length<6)color='0'+color;
                //pie(now, now+ang, `rgb(${Math.floor(Math.random()*256)},${Math.floor(Math.random()*256)},${Math.floor(Math.random()*256)})`);
                pie(now, now+ang, '#'+color);
                now+=ang;
            });
            function pie(ang1, ang2, color){
                let oP=document.createElementNS('http://www.w3.org/2000/svg', 'path');
                oP.style.fill=color;
                oSvg.appendChild(oP);
                let arr=[];
                function getPoint(ang){
                return {
                    x: cx+Math.sin(d2a(ang))*r,
                    y: cy-Math.cos(d2a(ang))*r,
                }
                }
                //#1
                let {x: x1, y: y1}=getPoint(ang1);
                arr.push(`M ${cx} ${cy} L ${x1} ${y1}`);
                //#2
                let {x: x2, y: y2}=getPoint(ang2);
                arr.push(`A ${r} ${r} 0 ${ang2-ang1>=180?1:0} 1 ${x2} ${y2}`);
                //#3
                arr.push('Z');
    
                oP.setAttribute('d', arr.join(' '));
            }
            };
            </script>
        </head>
        <body>
            <svg width="800" height="600" id="svg1"></svg>
        </body>
        </html>
    

    SVG动画

        使用requestAnimationFrame()逐帧动画;
        <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script>
            window.onload=function (){
            let oL1=document.getElementById('l1');
    
            oL1.onmouseover=function (){
                let start=parseInt(oL1.getAttribute('x1'));//获取SVG开始点
                let end=400;//结束点
                let dis=400-start;//过程
                let size=40;//用来当做速度
    
                let count=0;//帧计数器
    
                next();
                function next(){
                    count++;
                    let a=1-count/size;
                    let cur=start+dis*(1-a*a*a);//人工制作先快后慢的速度
                    oL1.setAttribute('x1', cur);//每一帧动画都重新更新一下x1
    
                    if(count<size){//超过指定帧数就不在进行动画
                        requestAnimationFrame(next);
                    }
                }
            };
            };
            </script>
        </head>
        <body>
            <svg id="svg1" width="800" height="600">
            <line id="l1" x1="100" y1="100" x2="400" y2="300" style="stroke:red;stroke-width:20"></line>
            </svg>
        </body>
        </html>
    

    SVG兼容问题,需要使用VML(兼容ie4-ie7)

    使用vml的准备工作:
    1.在HTML标签上加属性xmlns:v="urn:schemas-microsoft-com:vml"
        <html xmlns:v="urn:schemas-microsoft-com:vml">
    2.添加一个样式:
        <style>
            v\:* { behavior: url(#default#VML); }
        </style>
    3.body中的标签全部是v开头
        <v:line from="100,100" to="400,300" strokecolor="red" strokeweight="20" />
    

    SVG兼容问题,raphael.js

    使用这个库,解决前面所有的SVG需求!
    

    扩展

    随机出现color的方法
        1.FFFFFF == 16777215;所以颜色最大不可超过16777216;
        2.数字toString函数可以传进制;
        3.随机完可能是五位数,需要补0;
        var color = Math.floor(Math.random()*16777216).toString(16);
        while(color.length<6)color='0'+color;
    

    相关文章

      网友评论

          本文标题:JS创建SVG标签/SVG使用JS动态生成饼图/SVG动画/VM

          本文链接:https://www.haomeiwen.com/subject/cfvtkctx.html