Water ripple effect on background of website

前端 未结 6 1340
失恋的感觉
失恋的感觉 2021-02-04 02:25

A client has asked me to apply a similar water ripple effect to the background image (and only the background image) on their website.

Considering that this is using a c

相关标签:
6条回答
  • 2021-02-04 03:08

    Try using the script i have posted, it will work just copy and paste it into your code. i have explained with the comments in the code

    (function(){
        var canvas = document.getElementById('c'),
    
            /** @type {CanvasRenderingContext2D} */
            ctx = canvas.getContext('2d'),
            width = 500,
            height = 200,
    
            half_width = width >> 1,
            half_height = height >> 1,
            size = width * (height + 2) * 2,
    
            delay = 30,
            oldind = width,
            newind = width * (height + 3),
    
            riprad = 3,
            ripplemap = [],
            last_map = [],
            ripple,
            texture,
    
            line_width = 20,
            step = line_width * 2, 
            count = height / line_width;
    
        canvas.width = width;
        canvas.height = height;
    
        /*
         * Water ripple demo can work with any bitmap image
         */
        with (ctx) {
            fillStyle = '#a2ddf8';
            fillRect(0, 0, width, height);
    
            fillStyle = '#07b';
            save();
            rotate(-0.785);
            for (var i = 0; i < count; i++) {
                fillRect(-width, i * step, width * 3, line_width);
            }
    
            restore();
        }
    
        texture = ctx.getImageData(0, 0, width, height);
        ripple = ctx.getImageData(0, 0, width, height);
    
        for (var i = 0; i < size; i++) {
            last_map[i] = ripplemap[i] = 0;
        }
    
        /**
         * Main loop
         */
        function run() {
            newframe();
            ctx.putImageData(ripple, 0, 0);
        }
    
        /**
         * Disturb water at specified point
         */
        function disturb(dx, dy) {
            dx <<= 0;
            dy <<= 0;
    
            for (var j = dy - riprad; j < dy + riprad; j++) {
                for (var k = dx - riprad; k < dx + riprad; k++) {
                    ripplemap[oldind + (j * width) + k] += 128;
                }
            }
        }
    
        /**
         * Generates new ripples
         */
        function newframe() {
            var a, b, data, cur_pixel, new_pixel, old_data;
    
            var t = oldind; oldind = newind; newind = t;
            var i = 0;
    
            // create local copies of variables to decrease
            // scope lookup time in Firefox
            var _width = width,
                _height = height,
                _ripplemap = ripplemap,
                _last_map = last_map,
                _rd = ripple.data,
                _td = texture.data,
                _half_width = half_width,
                _half_height = half_height;
    
            for (var y = 0; y < _height; y++) {
                for (var x = 0; x < _width; x++) {
                    var _newind = newind + i, _mapind = oldind + i;
                    data = (
                        _ripplemap[_mapind - _width] + 
                        _ripplemap[_mapind + _width] + 
                        _ripplemap[_mapind - 1] + 
                        _ripplemap[_mapind + 1]) >> 1;
    
                    data -= _ripplemap[_newind];
                    data -= data >> 5;
    
                    _ripplemap[_newind] = data;
    
                    //where data=0 then still, where data>0 then wave
                    data = 1024 - data;
    
                    old_data = _last_map[i];
                    _last_map[i] = data;
    
                    if (old_data != data) {
                        //offsets
                        a = (((x - _half_width) * data / 1024) << 0) + _half_width;
                        b = (((y - _half_height) * data / 1024) << 0) + _half_height;
    
                        //bounds check
                        if (a >= _width) a = _width - 1;
                        if (a < 0) a = 0;
                        if (b >= _height) b = _height - 1;
                        if (b < 0) b = 0;
    
                        new_pixel = (a + (b * _width)) * 4;
                        cur_pixel = i * 4;
    
                        _rd[cur_pixel] = _td[new_pixel];
                        _rd[cur_pixel + 1] = _td[new_pixel + 1];
                        _rd[cur_pixel + 2] = _td[new_pixel + 2];
                    }
    
                    ++i;
                }
            }
        }
    
        canvas.onmousemove = function(/* Event */ evt) {
            disturb(evt.offsetX || evt.layerX, evt.offsetY || evt.layerY);
        };
    
        setInterval(run, delay);
    
        // generate random ripples
        var rnd = Math.random;
        setInterval(function() {
            disturb(rnd() * width, rnd() * height);
        }, 700);
    })();
    <canvas id="c"></canvas>

    0 讨论(0)
  • 2021-02-04 03:08
    .paperButton {
      display: block;
      text-align: center;
      text-decoration: none;
      position: relative;
      overflow: hidden;
      -webkit-transition: all 0.2s ease;
      -moz-transition: all 0.2s ease;
      -o-transition: all 0.2s ease;
      transition: all 0.2s ease;
      z-index: 0;
      cursor:pointer;
    }
    .animate {
      -webkit-animation: ripple 0.65s linear;
      -moz-animation: ripple 0.65s linear;
      -ms-animation: ripple 0.65s linear;
      -o-animation: ripple 0.65s linear;
      animation: ripple 0.65s linear;
    }
     @-webkit-keyframes 
    ripple {  100% {
    opacity: 0;
    -webkit-transform: scale(2.5);
    }
    }
    @-moz-keyframes 
    ripple {  100% {
    opacity: 0;
    -moz-transform: scale(2.5);
    }
    }
    @-o-keyframes 
    ripple {  100% {
    opacity: 0;
    -o-transform: scale(2.5);
    }
    }
    @keyframes 
    ripple {  100% {
    opacity: 0;
    transform: scale(2.5);
    }
    }
    
    
    $(function(){
        var ink, i, j, k;
        $(".paperButton").mousedown(function(e){    
                if($(this).find(".ink").length === 0){
                    $(this).prepend("<span class='ink'></span>");
                }
    
                ink = $(this).find(".ink");
                ink.removeClass("animate");
    
                if(!ink.height() && !ink.width()){
                    i = Math.max($(this).outerWidth(), $(this).outerHeight());
                    ink.css({height: i, width: i});
                }
    
                j = e.pageX - $(this).offset().left - ink.width()/2;
                k = e.pageY - $(this).offset().top - ink.height()/2;
    
                ink.css({top: k+'px', left: j+'px'}).addClass("animate");
    
    });
    });
    
    0 讨论(0)
  • 2021-02-04 03:11

    Have a look on these 2 demos, which i think you can get based to create yours.

    29a.ch and mrdoob

    Hope this helps

    0 讨论(0)
  • 2021-02-04 03:16

    I found a solution for this ,if you upload your photo on https://imgur.com/ then after upload finishes press right click on image then copy image address and put it into your code just like this: background-image: url(https://i.imgur.com/yourphotolink.jpg) NOTE:after copying the link check that your link ends with .jpg or .png if it ends with .jpg?1 delete ?1 so your link ends with .jpg

    i don't know why jquery ripple effect doesn't support ordinary photos but these steps will solve your problem

    0 讨论(0)
  • 2021-02-04 03:25

    For a high performance, WebGL powered solution, take a look at this project:

    jQuery WebGL Ripples

    A demo is available here.

    This technology is not available for everyone in every device yet, though.

    0 讨论(0)
  • 2021-02-04 03:25

    Not sure if you are still looking but this has a good demo/tutorial on the effect: http://code.almeros.com/water-ripple-canvas-and-javascript#.Ukpfe2QY2ok

    Demo is here: http://code.almeros.com/code-examples/water-effect-canvas/#.UkpiQmQY2ol

    0 讨论(0)
提交回复
热议问题