用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - javascript代码库

搜狗搜索引擎 中秋LOGO“镜花水月”(canvas特效)

2012-09-29 作者: 小蜜锋举报

[javascript]代码库

//function sogouWater(){
var WAVE_RESOLUTION = 1, WIDTH_IMG = 400, HEIGHT_IMG = 150, SIZE=WIDTH_IMG*HEIGHT_IMG, FORE_WIDTH = 191, FORE_HEIGHT = 149, FSIZE = FORE_WIDTH*FORE_HEIGHT, TOTAL_IMAGES = 11, LOGO_LEFT = 60;
function waterModel(){
    var width = WIDTH_IMG/WAVE_RESOLUTION,
    height = HEIGHT_IMG/WAVE_RESOLUTION,
    size = width*height, buffer0 = [], buffer1 = [], i, j, tmp, animating = false;
 
    for (i = 0; i < size; i++){
        buffer0.push(0);
        buffer1.push(0);
    }
 
    this.nextStep = function(){
        if (!animating){
            return null;
        }
        for(i=width+1;i<size-width-1;i+=2){
            for(j=1;j<width-1;j++,i++){
                buffer0[i] = (buffer0[i]+buffer0[i+1]+buffer0[i-1]+buffer0[i-width]+buffer0[i+width])/5;
            }
        }
        animating = false;
        for(i=width+1;i<size-width-1;i+=2){
            for(j=1;j<width-1;j++,i++){
                buffer1[i] = ((buffer0[i-1] + buffer0[i+1] + buffer0[i+width] + buffer0[i-width])/2-buffer1[i])*0.9;
                if (!animating && (buffer1[i] > 0.03 || buffer1[i] < -0.03)){
                    animating = true;
                }
            }
        }
        tmp = buffer0;
        buffer0 = buffer1;
        buffer1 = tmp;
        return buffer0;
    }
 
    this.touch = function(x, y, z){
        if(x < 2 || x > width-2 || y < 1 || y > height-2)
        return;
        animating = true;
        var i = x+y*width;
        buffer0[i] += z;
        buffer0[i-1] -= z;
    }
 
    return this;
}
function autoTouch(){
    if(drawCount % 7 == 1){
        var x = Math.round(Math.random()*400), y = Math.round(Math.random()*150);
        wm.touch(x,y,100);
    }
}
 
function drawFrame(){
    if(enAutoTouch){
        autoTouch();
        drawCount++;
    }
    if (texture){
        if (alpha > 0){
            texture = getTexture(curImage, nextImage, alpha);
            alpha -= 20;
        }
        else{
            if (curImage != nextImage){
                if(curImage == 0){
                    fadeIn();
                    pb('pv', 'sharetag');
                }
                if(nextImage == 0){
                    fadeOut();
                }
                alpha = 0;
                curImage = nextImage;
                texture = getTexture(curImage);
                mouseDown = 0;
                movedTime = 0;
            }
        }
 
        var bf = wm.nextStep(), dimage = dctx.getImageData(0, 0, WIDTH_IMG, HEIGHT_IMG), data = dimage.data, reflect_i, i,
        refraction, xPix, yPix;
        if (bf != null){
            for(i=0; i < SIZE; i++){
                strength = bf[i];
                refraction = Math.round(bf[i]*100);
                xPix = (i%WIDTH_IMG) + refraction;
                yPix = parseInt(i/WIDTH_IMG) + refraction;
                if(xPix < 0) xPix = 0;
                if(yPix < 0) yPix = 0;
                if(xPix > WIDTH_IMG-1) xPix = WIDTH_IMG-1;
                if(yPix > HEIGHT_IMG-1) yPix = HEIGHT_IMG-1;
                reflect_i = ((yPix * WIDTH_IMG) + xPix);
 
                strength *= 0.1;
                strength += 1.0;
 
 
                data[i*4] = texture.data[reflect_i*4];
                data[i*4+1] = texture.data[reflect_i*4+1];
                data[i*4+2] = texture.data[reflect_i*4+2]
                data[i*4+3] = texture.data[reflect_i*4+3];
            }
            dctx.putImageData(dimage, 0,0);
        }
        else{
            dctx.putImageData(texture, 0,0);
            enAutoTouch = true;
        }
    }
    setTimeout(drawFrame, 50);
}
 
function makeForeGroundAlpha(data, imgid, imgid2, alpha){
    fctx.clearRect(0, 0, FORE_WIDTH, FORE_HEIGHT);
    fctx.drawImage(foreground, (imgid%2)*FORE_WIDTH , parseInt(imgid/2)*FORE_HEIGHT, FORE_WIDTH, FORE_HEIGHT, 0, 0, FORE_WIDTH, FORE_HEIGHT);
    fctx2.clearRect(0, 0, FORE_WIDTH, FORE_HEIGHT);
    fctx2.drawImage(foreground, (imgid2%2)*FORE_WIDTH , parseInt(imgid2/2)*FORE_HEIGHT, FORE_WIDTH, FORE_HEIGHT, 0, 0, FORE_WIDTH, FORE_HEIGHT);
    var fdata = fctx.getImageData(0, 0, FORE_WIDTH, FORE_HEIGHT), fdata2 = fctx2.getImageData(0, 0, FORE_WIDTH, FORE_HEIGHT), i, j, idx;
    for (i = 0; i < FSIZE; i++){
        idx = parseInt(i/FORE_WIDTH)*WIDTH_IMG+i%FORE_WIDTH+LOGO_LEFT;
        if (fdata.data[i*4] > 0 && fdata2.data[i*4] > 0){
            fdata.data[i*4] = parseInt((fdata2.data[i*4]*(255-alpha)+fdata.data[i*4]*alpha)/255);
            fdata.data[i*4+1] = parseInt((fdata2.data[i*4+1]*(255-alpha)+fdata.data[i*4+1]*alpha)/255);
            fdata.data[i*4+2] = parseInt((fdata2.data[i*4+2]*(255-alpha)+fdata.data[i*4+2]*alpha)/255);
        }
        else if (fdata.data[i*4] > 0){
            fdata.data[i*4] = parseInt((data[idx*4]*(255-alpha)+fdata.data[i*4]*alpha)/255);
            fdata.data[i*4+1] = parseInt((data[idx*4+1]*(255-alpha)+fdata.data[i*4+1]*alpha)/255);
            fdata.data[i*4+2] = parseInt((data[idx*4+2]*(255-alpha)+fdata.data[i*4+2]*alpha)/255);
        }
        else if (fdata2.data[i*4] > 0){
            fdata.data[i*4] = parseInt((data[idx*4]*(alpha)+fdata2.data[i*4]*(255-alpha))/255);
            fdata.data[i*4+1] = parseInt((data[idx*4+1]*(alpha)+fdata2.data[i*4+1]*(255-alpha))/255);
            fdata.data[i*4+2] = parseInt((data[idx*4+2]*(alpha)+fdata2.data[i*4+2]*(255-alpha))/255);
        }
        else{
            fdata.data[i*4] = data[idx*4];
            fdata.data[i*4+1] = data[idx*4+1];
            fdata.data[i*4+2] = data[idx*4+2];
        }
        fdata.data[i*4+3] = 255;
    }
    ctx.putImageData(fdata, LOGO_LEFT,0);
}
 
function getTexture(imgid, nimgid, alpha) {
    ctx.clearRect(0, 0, WIDTH_IMG, HEIGHT_IMG);
    ctx.drawImage(background, 0 ,0, WIDTH_IMG, HEIGHT_IMG);
    if (alpha && nimgid >= 0){
        makeForeGroundAlpha(ctx.getImageData(0, 0, WIDTH_IMG, HEIGHT_IMG).data, imgid, nimgid, alpha)
    }
    else{
        ctx.drawImage(foreground, (imgid%2)*FORE_WIDTH , parseInt(imgid/2)*FORE_HEIGHT, FORE_WIDTH, FORE_HEIGHT, LOGO_LEFT, 0, FORE_WIDTH, FORE_HEIGHT);
    }
    return ctx.getImageData(0, 0, WIDTH_IMG, HEIGHT_IMG);
}
 
function changeTexture(tt){
    if (curImage != nextImage){
        return;
    }
    if(tt==1){
     
        pb('pv', 'clickpic');
    }
    if(tt==2){
        pb('pv','slidepic');
    }
    var i;
    if (imageshowed == TOTAL_IMAGES){
        imageshowed = 0;
        imageGroup = [];
        for (i = 0; i < TOTAL_IMAGES; i++){
            imageGroup.push(0);
        }
        nextImage = 0;
    }
    else{
        if (imageshowed < 4){
            i = parseInt(Math.random()*4);
            while (imageGroup[i]){
                i = (i+1)%4;
            }
 
        }
        else{
            i = parseInt(Math.random()*(TOTAL_IMAGES-4))+4;
            while (imageGroup[i]){
                i = (i+1)%(TOTAL_IMAGES-4)+4;
            }
        }
        imageGroup[i] = 1;
        nextImage = i+1;
        imageshowed++;
    }
    if (curImage != nextImage){
    // console.log([tt, curImage, nextImage, imageshowed,
    // -999].concat(imageGroup));
        alpha = 255;
    }
}
 
function imageLoaded(){
    loaded++;
    if (loaded < 2){
        return;
    }
 
    texture = getTexture(0);
 
    var timer, timer1;
    dcanvas.addEventListener("mousedown", function(e){
        enAutoTouch = false;
        mouseDown++;
        clearTimeout(timer1);
        if (mouseDown > 1){
            changeTexture(1);
        }
        else{
            timer1 = setTimeout(changeTexture(1), 1500);
        }
        var x = (e.clientX - logo.offsetLeft) + document.body.scrollLeft + document.documentElement.scrollLeft;
        var y = (e.clientY - logo.offsetTop) + document.body.scrollTop + document.documentElement.scrollTop;
        wm.touch(x, y, 100);
    }, false);
 
 
    dcanvas.addEventListener("mousemove", function(e){
        enAutoTouch = false;
        clearTimeout(timer);
        timer = setTimeout(function(){
            movedTime = 0;
        }, 500);
        if (movedTime){
            if ((new Date().getTime()) - movedTime > 1000){
                changeTexture(2);
            }
        }
        else{
            movedTime = new Date().getTime();
        }
        var x = (e.clientX - logo.offsetLeft) + document.body.scrollLeft + document.documentElement.scrollLeft;
        var y = (e.clientY - logo.offsetTop) + document.body.scrollTop + document.documentElement.scrollTop;
        wm.touch(x, y, 100);
    }, false);
     
    dcanvas.addEventListener("mouseover", function(e){
        if(mouseoverCount == 0){
            pb('pv', 'water');
            mouseoverCount++;
        }
    });
    dcanvas.addEventListener("mouseout", function(e){
        if(mouseoverCount > 0){
            pb('pv', 'water');
        }
    });
}
 
    function setOpacity(ev, v){
        ev.filters ? ev.style.filter = 'alpha(opacity=' + v + ')' : ev.style.opacity = v / 100;
    }
    
    function fadeIn(speed, opacity){
        var elem = document.getElementById('sogou_share');
        speed = speed || 20;
        opacity = opacity || 100;
        elem.style.display = 'block';
        setOpacity(elem, 0);
        var val = 0;
        (function(){
            setOpacity(elem, val);
            val += 5;
            if (val <= opacity) {
                setTimeout(arguments.callee, speed)
            }
        })();
    }
    function fadeOut(speed, opacity){
        var elem = document.getElementById('sogou_share');
        speed = speed || 20;
        opacity = opacity || 0;
        var val = 100;
        (function(){
            setOpacity(elem, val);
            val -= 5;
            if (val >= opacity) {
                setTimeout(arguments.callee, speed);
            }else if (val < 0) {
                elem.style.display = 'none';
            }
        })();
    }
 
var $ = function(ele){
    return document.getElementById(ele);
}
 
var bind =function(elem, evt, func){
    if (elem){
        return elem.addEventListener?elem.addEventListener(evt,func,false):elem.attachEvent("on"+evt,func);
    }
}
 
$('sogou_share_sina').onclick = shareresult;
$('sogou_share_qq').onclick = shareresult;
$('sogou_share_sohu').onclick = shareresult;
 
var contentAll = ['','我在搜狗搜索首页玩#镜花水月#,拨动水面,月亮倒影变成了“广寒宫”,关于月宫传说都是真的吗?… @搜狗搜索,来测测你在中秋节的内心想法吧: ', '我在搜狗搜索首页玩#镜花水月#,拨动水面,月亮倒影变成了“灯笼”,我是个怀旧的人… @搜狗搜索,来测测你在中秋节的内心想法吧:', '我在搜狗搜索首页玩#镜花水月#,拨动水面,月亮倒影变成了“一只玉兔”,看来我是个充满幻想的人… @搜狗搜索,来测测你在中秋节的内心想法吧:', '我在搜狗搜索首页玩#镜花水月#,拨动水面,“家书一封”,杜甫曾说“露从今夜白,月是故乡明”,我真的想家了… @搜狗搜索,来测测你在中秋节的内心想法吧:', '我在搜狗搜索首页玩#镜花水月#,拨动水面,月亮倒影变成了“莲蓉蛋黄月饼”,请吃货们慢慢转发吧… @搜狗搜索,来测测你在中秋节的内心想法吧:', '我在搜狗搜索首页玩#镜花水月#,拨动水面,月亮倒影变成了“菊花”,啊!… @搜狗搜索,来测测你在中秋节的内心想法吧:', '我在搜狗搜索首页玩#镜花水月#,拨动水面,月亮倒影变成了“大闸蟹”,请顶级吃货们默默转发吧… @搜狗搜索,来测测你在中秋节的内心想法吧:''我在搜狗搜索首页玩#镜花水月#,拨动水面,月亮倒影变成了“情侣合影”,亲爱的,中秋快乐… @搜狗搜索,来测测你在中秋节的内心想法吧:''我在搜狗搜索首页玩#镜花水月#,拨动水面,月亮倒影变成了“李白”,囧… @搜狗搜索,来测测你在中秋节的内心想法吧:', '我在搜狗搜索首页玩#镜花水月#,拨动水面,月亮倒影变成了“吴刚”,囧… @搜狗搜索,来测测你在中秋节的内心想法吧:', '我在搜狗搜索首页玩#镜花水月#,拨动水面,月亮倒影变成了“嫦娥”,囧… @搜狗搜索,来测测你在中秋节的内心想法吧:'];
 
var imageAll = ['','yuegong', 'gongdeng', 'yutu', 'mail', 'yuebing', 'juhua', 'xie', 'zhaopian', 'libai', 'wugang', 'change'];
var  imagelink1 = "http://help.sogou.com/logo/midfall/images/", imagelink2 = ".jpg", url = 'http://www.sogou.com/';
// var fixText1 = "我在搜狗搜索首页玩#镜花水月#,月亮的倒影因我干扰而发生变化,变成了", fixText2 = "
// @搜狗搜索。来测测你在中秋节的内心想法吧。";
 
function shareresult(){
     
    if(this.parentNode.filters){
        if(this.parentNode.filters.alpha.opacity!= 100){
            return;
        }
    }
    else if(this.parentNode.style.opacity != 1){
        return;
    }
    var tname = this.id;
    var content = contentAll[curImage];
    var imagelink = [imagelink1, imageAll[curImage], imagelink2].join('');
    if(tname.indexOf('sina')>0){pb("cl", "share_sina");twshare('http://service.weibo.com/share/share.php?url=',url,content,imagelink,615,505);return false;}
    if(tname.indexOf('qq')>0){pb("cl", "share_qq");twshare('http://v.t.qq.com/share/share.php?url=',url,content.replace('@搜狗搜索', '@sogouweb'),imagelink,615,505);return false;}
    if(tname.indexOf('sohu')>0){pb("cl", "share_sohu");
        (function(s,d,e,r,l,p,t,z,c){
            var f='http://t.sohu.com/third/post.jsp?',u=z||"",p=['&url=',e(u),'&title=',e(t||d.title),'&content=',c||'gb2312','&pic=',e(p||'')].join('');
            function a(){
            if(!window.open([f,p].join(''),'mb',['toolbar=0,status=0,resizable=1,width=660,height=470,left=',(s.width-660)/2,',top=',(s.height-470)/2].join('')))u.href=[f,p].join('');};
            if(/Firefox/.test(navigator.userAgent))setTimeout(a,0);
            else a();
        })(screen,document,encodeURIComponent,'','',imagelink,content.replace(/\[.*?\]/g,""),url,'utf-8');
        return false;
    }  
}
 
function twshare(surl, url, title, img, w, h){ 
    var _t = encodeURIComponent(title);
        var _url = encodeURIComponent(url);
        var _pic = encodeURIComponent(img);
        var _u = surl+_url+'&pic='+_pic+'&title='+_t;
        window.open( _u,'', 'width='+w+', height='+h+', top=0, left=0, toolbar=no, menubar=no, scrollbars=no, location=yes, resizable=no, status=no' );
    }
function pb(type, act, param){
    try{
        var imgurl = ["http://pb.sogou.com/"+type+".gif?uigs_productid=webapp&type=moon&uigs_t="];
        imgurl.push((new Date()).getTime());
        if(type == 'pv'){
            imgurl.push('&act=',act);
        }else{
            imgurl.push('&uigs_cl=', act);
        }
        imgurl.push("&uniqueid=", uniqueid);
        if(act != 'water'){
            imgurl.push('&pictype=', curImage);
        }
        if (param) {
            for (var i in param) {
                imgurl.push("&", i, "=", param[i]);
            }
        }
        (new Image()).src = imgurl.join("");
    }catch(e){
    }
}
 
var drawCount = 0, enAutoTouch = true, mouseoverCount = 0;
 
var canvas = document.createElement('canvas'),
fcanvas = document.createElement('canvas'),
fcanvas2 = document.createElement('canvas'),
dcanvas = document.createElement('canvas'),
ctx = canvas.getContext('2d'),
fctx = fcanvas.getContext('2d'),
fctx2 = fcanvas2.getContext('2d'),
dctx = dcanvas.getContext('2d'),
background = document.createElement('img'),
foreground = document.createElement('img'),
loaded = 0, texture=null,
wm = new waterModel(),
mouseDown = 0,
logo = document.getElementById("logo"),
imageshowed = 0,
curImage = 0,
nextImage = 0,
imageGroup = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
movedTime = 0,
alpha = 0;
 
logo.appendChild(dcanvas);
canvas.setAttribute('width', WIDTH_IMG);
canvas.setAttribute('height', HEIGHT_IMG);
fcanvas.setAttribute('width', FORE_WIDTH);
fcanvas.setAttribute('height', FORE_HEIGHT);
fcanvas2.setAttribute('width', FORE_WIDTH);
fcanvas2.setAttribute('height', FORE_HEIGHT);
dcanvas.setAttribute('width', WIDTH_IMG);
dcanvas.setAttribute('height', HEIGHT_IMG);
 
background.onload = imageLoaded;
foreground.onload = imageLoaded;
background.src = "/logo/midfall/images/sogoulogo.jpg";
foreground.src = "/logo/midfall/images/icon.png";
drawFrame();
// }
 
// sogouWater();

[代码运行效果截图]


搜狗搜索引擎 中秋LOGO“镜花水月”(canvas特效)


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...