整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          用HTML5的canvas來畫一個(gè)夢(mèng)幻星空,來學(xué)習(xí)一下吧

          隨著HTML5的火熱,越來越多的人投入到HTML5開發(fā)中了,canvas作為HTML5中比較重要的一個(gè)元素,在很多官網(wǎng)的主頁面中被使用到。今天我們一起來看看如何使用canvas畫出一個(gè)夢(mèng)幻的星空背景,還會(huì)有流星運(yùn)動(dòng)。

          本文的代碼已經(jīng)放到Github上了,感興趣的可以自取,Github地址如下。

          https://github.com/zhouxiongking/article-pages/blob/master/articles/starry/starry.html

          HTML5

          實(shí)現(xiàn)效果

          首先我們來看看通過canvas實(shí)現(xiàn)的星空效果圖,如下所示。

          效果圖

          代碼實(shí)現(xiàn)

          接下來我們看看這個(gè)效果是如何通過代碼一步步實(shí)現(xiàn)的。

          首先來看看頁面上的HTML代碼,只有一個(gè)Div元素。

          HTML代碼

          Javascript代碼

          首先我們需要定義一些常量,比如畫布的寬和高,星星數(shù)量,流星個(gè)數(shù)。在這個(gè)星空中流星其實(shí)是星星的一個(gè),只是添加了動(dòng)態(tài)效果。

          頁面初始化

          然后是設(shè)定一個(gè)定時(shí)器,通過一段隨機(jī)時(shí)間生成一個(gè)流星的索引號(hào)。

          流星索引號(hào)

          緊接著來看看生成一個(gè)星星的方法,該方法返回一個(gè)星星的各項(xiàng)參數(shù),包括x,y軸坐標(biāo),透明度,x,y軸偏移量。

          生成星星的參數(shù)

          然后是最重要的render方法,通過該方法可以將星星渲染至畫布上,我們將這個(gè)方法拆開看,首先是對(duì)流星的繪制,流星索引號(hào)通過上面metor方法獲得。

          畫流星

          然后是對(duì)于星星各項(xiàng)參數(shù)的處理,比如有的星星生成的點(diǎn)坐標(biāo)超出了屏幕寬高,有的透明度是負(fù)數(shù),都要將其處理成正常參數(shù)。

          各項(xiàng)參數(shù)判斷

          最后是在畫布中進(jìn)行繪制。

          畫布繪制

          至此,這個(gè)畫面效果的講解完畢,如果代碼正確的話,就可以看到文中出現(xiàn)的效果圖。

          結(jié)束語

          今天這篇文章主要是借助HTML5中的canvas畫出了一個(gè)夢(mèng)幻星空的效果,你學(xué)會(huì)了嗎?

          鳥網(wǎng)作者:rockidz

          出自蜂鳥網(wǎng)-風(fēng)光攝影,原貼鏈接:https://m.fengniao.com/thread/10753492.html

          第一次拍星空 SONY A5100+適馬S30 1.4 到郊區(qū)后發(fā)現(xiàn)視野確實(shí)太小了 而且銀河在頭頂 根本拍不到銀河跟地景在同一張照片里

          于是拍了27張回去再拼起來 分別從車頭 車身 車尾三列往上拍

          每列拍到頭頂需要拍9張 相鄰照片大概有40%左右的重合后期方便接圖

          誰知回去之后又出狀況 一是電腦是XP系統(tǒng) 只能安裝舊版本的PS跟LR 但舊版本的軟件又不識(shí)別索尼的raw文件(arw格式)

          二是打算退一步拼jpg算了 又發(fā)現(xiàn)自己根本拼不起來。。。以前沒什么拼圖經(jīng)驗(yàn) 這次也太多照片了

          于是求助萬能的淘寶 付了80塊錢后幫我拼成了這樣~

          但總感覺這星空跟我看的好像不太一樣~

          算了 下次還是入手三陽12再拍星空了 視野太小拍星空麻煩事太多

          雖然折騰了好多 但總算有張成品圖出來 求大神指點(diǎn)!

          歡迎關(guān)注 蜂鳥網(wǎng)微信公眾號(hào):fengniaoweixin

          天躺在床上刷抖音的時(shí)候,看見了一個(gè)馬克筆隨便畫星空的視頻,很有意思。


          先看效果:


          開始需求分析:

          1、漸變色的背景

          2、畫一顆樹和一些草

          3、水面的倒影

          4、隨便畫點(diǎn)星星

          5、畫一顆流星


          1、漸變色的背景

          先確定200*500的區(qū)域,使用css3的線性漸變屬性,依次深藍(lán)、淺藍(lán)、紫色、粉色、黃色畫出一個(gè)漸變色的背景。

          為了使背景更真實(shí),使用同樣的顏色順序,在不同的角度,加上一些模糊和透明。再畫一遍重疊起來。

          再重疊一層黑色,使畫布更暗一些。

          .bg-color {
            background-image: linear-gradient(170deg, #000093 13%, #9f35ff, #ff8000 70%, #f9f900 );
          }
          .bg-color2 {
            background-image: linear-gradient( 180deg, #000093 13%, #9f35ff, #ff8000 80%, #f9f900 );
            opacity: 0.3;
            filter: blur(6px);
          }
          .bg-color3 {
            background: rgba(0,0,0,.2);
          }


          2、畫一棵樹和草

          使用html來畫一棵樹的話,需要很多個(gè)節(jié)點(diǎn),性能和效果都很差。這里使用canvas來畫樹。

          畫樹的教程,公眾號(hào)出過好幾次了,這里就不在重寫了。

          基本原理就是,從一個(gè)點(diǎn)向一個(gè)方向畫一條直線。從終點(diǎn)開始,重新這個(gè)流程。期間可以修改一個(gè)角度畫出一分支。

          草就更加簡(jiǎn)單。隨便在底部畫一些雜亂的直線。

          // 畫一棵樹
          function drawTree(x, y, deg, step, type) {
            var deg1 = step % 2 == 0 ? 0.1 : -0.1;
            var x1 = x + Math.cos(deg + deg1) * (step + 5) * 0.9;
            var y1 = y + Math.sin(deg + deg1) * (step - 1) * 0.9;
            ctx.beginPath();
            ctx.lineWidth = step / 3;
            ctx.moveTo(x, y);
            ctx.lineTo(x1, y1);
            ctx.stroke();
            if (step > 12) {
              ctx.arc(x, y, step / 6, 0, Math.PI * 2);
              ctx.fill();
            }
            if (step < 3 && Math.random() > 0.7) {
              var r = 2 + Math.random() * 2;
              ctx.arc(x1 + Math.random() * 3, y1 + Math.random() * 3, r, r, Math.PI + r);
              ctx.fill();
            }
            step--;
            if (step > 0) {
              drawTree(x1, y1, deg, step, type);
              if (step % 2 == 1 && step < 17)
                drawTree(x1, y1, deg + 0.2, Math.round(step / 1.13));
              if (step % 2 == 0 && step < 17)
                drawTree(x1, y1, deg - 0.2, Math.round(step / 1.13) );
            }
          }


          3、水面的倒影

          最簡(jiǎn)單的做法,就是使用canvas.toDataUrl 拿到canvas的圖片數(shù)據(jù)。在底部放一個(gè)反轉(zhuǎn)的圖片就可以。

          我這里希望水面的倒影可以動(dòng)起來。

          新建一個(gè)canvas,使用ctx.getImageData拿到我們畫好的樹的像素點(diǎn)數(shù)據(jù)。

          使用正弦給像素的x軸做一些偏移,得到一個(gè)新的數(shù)據(jù)。put到倒影的canvas上。

          在使用requestAnimationFrame,做出一個(gè)流暢的左右擺動(dòng)的倒影動(dòng)畫。

          最后,在原數(shù)據(jù)基礎(chǔ)上,增加一些雜色,使得倒影有一些黑白的橫線,模擬水波的高亮。

          var startWave = 0 // 水波起始位置
          // 倒影增加水波紋效果
          function wave(star){
            var newImgData = ctxShadow.createImageData(200,150)
            var pos = 0
            var source = 0
            startWave += 0.2
            start = startWave
            for(var y = 0 ; y < CANVAS_HEIGHT ; y ++) {
              start += 0.5
              for(var x = 0 ; x < CANVAS_WIDTH ; x ++) {
                pos = (y * CANVAS_WIDTH + x) * 4
                source = (y * CANVAS_WIDTH + x + Math.round(Math.sin(start)* 1.5)) * 4
                newImgData.data[pos + 0] = imgData.data[source + 0];
                newImgData.data[pos + 1] = imgData.data[source + 1];
                newImgData.data[pos + 2] = imgData.data[source + 2];
                newImgData.data[pos + 3] = imgData.data[source + 3];
              }
            }
            ctxShadow.putImageData(newImgData,0,0)
            requestAnimationFrame(wave)
          }


          4、畫星空

          這個(gè)簡(jiǎn)單,就不再寫代碼了,就隨意寫一些白色的div,隨機(jī)插入背景上。


          其實(shí)到這一步,已經(jīng)基本上完成了。


          5、加一些流星

          要畫流星,需要畫出一個(gè)漸漸變淡變窄的白線。

          這里偷了個(gè)懶,在視覺效果上,一個(gè)漸漸變淡的白線,人眼看到,就感覺漸漸變窄。

          這里使用白色加透明漸變,畫出一個(gè)流星的輪廓。加入從右到左動(dòng)畫效果。

          再加入一個(gè)外包的div,做一下旋轉(zhuǎn)和縮放。


          效果完成?。。?!


          具體效果,建議查看原文。

          代碼倉庫地址:

          https://github.com/shb190802/html5

          演示地址:

          http://suohb.com/demo/win/starrySky.html


          主站蜘蛛池模板: 中文字幕精品亚洲无线码一区| 一区二区在线播放视频| 亚洲无人区一区二区三区| 丰满人妻一区二区三区免费视频| 日韩熟女精品一区二区三区| 国产免费一区二区三区不卡| 亚洲综合一区二区| 精品深夜AV无码一区二区| 久久精品国内一区二区三区| 熟妇人妻一区二区三区四区| 精品国产一区二区三区久| 中文字幕一区二区免费| 欧美激情一区二区三区成人| 秋霞无码一区二区| 久久久精品人妻一区二区三区蜜桃| 中文字幕精品一区| 风间由美性色一区二区三区| 亚洲国产成人久久一区久久| 色一情一乱一伦一区二区三区| 蜜臀AV一区二区| 亚洲欧洲日韩国产一区二区三区| 日韩好片一区二区在线看| 亚洲无线码一区二区三区| 国产福利视频一区二区| 久久久精品一区二区三区| 99精品国产一区二区三区| 一区二区三区四区无限乱码| 国产成人一区二区三区免费视频| 国产一区二区精品久久91| 无码精品人妻一区二区三区免费| 欲色aV无码一区二区人妻| 一区二区不卡视频在线观看| 日本一区二区三区精品国产 | 制服中文字幕一区二区| 久久se精品一区精品二区国产| 日韩精品一区二区三区大桥未久| 亚洲AV无码第一区二区三区| 亚洲av成人一区二区三区在线播放| 男人免费视频一区二区在线观看 | 日韩一区二区久久久久久| 精品不卡一区二区|