问答详情
源自:6-3 mask标签创建蒙版

星星这章实现不了

代码实现不了效果

提问者:笨蛋笨蛋z 2016-06-06 17:10

个回答

  • 初级_前端
    2016-08-19 10:10:07

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <title>Title</title>
       <style>
    html,body{width: 100%;height: 100%;background:#001122; }
       </style>
    </head>
    <body>

    <svg width="100%" height="100%" viewBox="-960 -540 1920 1080" preserveAspectRatio="xMidYMid slice">
       <defs>
           <polygon id="star" points="0 -10 2 -2 10 0 2 2 0 10 -2 2 -10 0 -2 -2" fill="white"> </polygon>
       </defs>
       <g id="real">
           <g id="star-group"> </g>
           <g id="moon-group">
               <mask id="moon-mask">
                   <circle r="100" cx="-250" cy="-150" fill="white"></circle>
                   <circle r="100" cx="-200" cy="-200" fill="black"></circle>
               </mask>
               <circle r="100" cx="-250" cy="-150" fill="white" mask="url(#moon-mask)"></circle>
           </g>
           <g id="light-tower" transform="translate(250,0)">
               <defs>
                   <linearGradient id="tower" x1="0" y1="0" x2="1" y2="0">
                       <stop offset="0" stop-color="#999"></stop>
                       <stop offset="1" stop-color="#333"></stop>
                   </linearGradient>
                   <radialGradient id="light" cx="0.5" cy="0.5" r="0.5">
                       <stop offset="0" stop-color="rgba(255,255,255,.8)"></stop>
                       <stop offset="1" stop-color="rgba(255,255,255,0)"></stop>
                   </radialGradient>
                   <clipPath id="light-clip">
                       <polygon points="0 0 -400 -15 -400 15" fill="rgba(255,0,0,0.5)">
                           <animateTransform
    attributeName="transform"
    attributeTpye="XML"
    type="rotate"
    from="0"
    to="360"
    dur="10s"
    repeatCount="indefinite"
    >
                           </animateTransform>
                       </polygon>
                       <circle cxc="0" cy="0" r="2"></circle>
                   </clipPath>
               </defs>
               <polygon points="0 0 5 50 -5 50" fill="url(#tower)"></polygon>
               <ellipse cx="0" cy="0" rx="300"ry="100" fill="url(#light)"clip-path="url(#light-clip)"></ellipse>

           </g>

       </g>
       <g id="reflact" transform="translate(0 50)"mask="url(#fading)">
           <defs>
                <linearGradient id="fade" x1="0" y1="0" x2="1" y2="0">
                   <stop offset="0" stop-color="rgba(255,255,255,.3)"></stop>
                   <stop offset="0.5" stop-color="rgba(255,255,255,.3)"></stop>
               </linearGradient>
               <mask id="fading">
                 <rect x="-400" y="0" width="800" height="300" fill="url(#fade)"></rect>
               </mask>
           </defs>
           <use xlink:href="#real" transform="scale(1,-1) translate(0 -50)"></use>
       </g>
       <line x1="-400" y1="50" x2="400" y2="50" stroke="white"></line>
    </svg>

    <script>
    var SVG_NS = "http://www.w3.org/2000/svg";
    var XLINK_NS = "http://www.w3.org/1999/xlink";
    var paper = document.querySelector("svg");
    function use(origin){
           var _use = document.createElementNS(SVG_NS,"use");
    _use.setAttributeNS(XLINK_NS,"xlink:href","#"+origin.id);
    return _use;
    }
       function  random(min,max){
           return min + (max - min)*Math.random();
    }
       renderStar();
    function  renderStar(){
           var starRef = document.getElementById("star");
    var starGroup = document.getElementById("star-group");
    var starConut = 500;

    var star;
    while(starConut--){
               star =use(starRef);
    star.setAttribute("opacity",random(0.1,0.4));
    star.setAttribute("transform","translate("+ random(-400,400)+ ","+ random(-300,50)+")" + "scale("+ random(0.1,0.6)+")");
    starGroup.appendChild(star);
    }
       }
    </script>
    </body>
    </html>