鼠标滑过文字跟随效果

2020-11-27  本文已影响0人  zkzhengmeng

1.鼠标滑动文字跟随效果,可自定义文字

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <title>Canvas文字跟随特效</title>
        <style type="text/css">
            html,
            body {
                width: 100%;
                height: 100%;
                margin: 0px;
                overflow: hidden;
                &:hover {
                    span {
                        display: none;
                    }
                }
            }
            
            canvas {
                cursor: crosshair;
            }
            
            span {
                font-family: 'Georgia', cursive;
                font-size: 40px;
                position: fixed;
                top: 50%;
                left: 50%;
                color: #000;
                margin-top: -40px;
                margin-left: -200px;
            }
        </style>
    </head>

    <body>
        <canvas id='canvas'></canvas>
        <span id='info'>Click and drag to draw!<span>


    <script type="text/javascript">
        
        var position = {x: 0, y: window.innerHeight/2};
        var counter = 0;
        var minFontSize = 3;
        var angleDistortion = 0;
        var letters = "我是一只小鸟,在天空自由自在的翱翔!";
        
        var canvas;
        var context;
        var mouse = {x: 0, y: 0, down: false}
        
        function init() {
            canvas = document.getElementById( 'canvas' );
            context = canvas.getContext( '2d' );
            canvas.width = window.innerWidth;
            canvas.height = window.innerHeight;
              
            canvas.addEventListener('mousemove', mouseMove, false);
            canvas.addEventListener('mousedown', mouseDown, false);
            canvas.addEventListener('mouseup',   mouseUp,   false);
            canvas.addEventListener('mouseout',  mouseUp,  false);  
            
            window.onresize = function(event) {
                canvas.width = window.innerWidth;
                canvas.height = window.innerHeight;
            }
        }
        
        function mouseMove ( event ){
            mouse.x = event.pageX;
            mouse.y = event.pageY;
            draw();
        }
        function mouseDown( event ){
            mouse.down = true;
            position.x = event.pageX;
            position.y = event.pageY;
            document.getElementById('info').style.display = 'none';
        }
        
        function mouseUp( event ){
            canvas.width = canvas.width; 
        }
    
        function draw() {
            if ( mouse.down ) {
                var d = distance( position, mouse );
                var fontSize = minFontSize + d/2;
                var letter = letters[counter];
                var stepSize = textWidth( letter, fontSize );
                if (d > stepSize) {
                    var angle = Math.atan2(mouse.y-position.y, mouse.x-position.x);
                    context.font = fontSize + "px Georgia";    
                    context.save();
                    context.translate( position.x, position.y);
                    context.rotate( angle );
                    context.fillText(letter,0,0);
                    context.restore();
                    counter++;
                    if (counter > letters.length-1) {
                        counter = 0;
                    }
                    //console.log (position.x + Math.cos( angle ) * stepSize)
                    position.x = position.x + Math.cos(angle) * stepSize;
                    position.y = position.y + Math.sin(angle) * stepSize;
            
                }
            }     
        }
        
        function distance( pt, pt2 ){
          
            var xs = 0;
            var ys = 0;
         
            xs = pt2.x - pt.x;
            xs = xs * xs;
         
            ys = pt2.y - pt.y;
            ys = ys * ys;
         
            return Math.sqrt( xs + ys );
        }
        
        function textWidth( string, size ) {
            context.font = size + "px Georgia";
          
            if ( context.fillText ) {
                return context.measureText( string ).width;
            } else if ( context.mozDrawText) {
                return context.mozMeasureText( string );
            }
         };
        
        init();

    </script>
</body>
</html>
上一篇下一篇

猜你喜欢

热点阅读