貼吧表情雨

前言

目前我的想實現本身的一個項目。正好整合了vue + laravel ,嘗試用下最新的技術。(本人是個PHP Coder)html

 由於,一直找不到好的模板,因此我就本身打算搭一個VUE的環境配合iview寫個頁面。也不算寫吧,只是部分排版設計是本身的。畢竟iview大部分組件已經幫你封裝好了,不須要本身實現太多的組件。vue

廢話,很少說。上真題~~~html5

 

正文

目前,本身寫好了一個登陸頁的總體部分。laravel

設計以下,中間是登陸框和邀請碼登陸。背景是本文的主體,滑稽雨~~~git

登陸上面,是我使用iview實現的走馬燈~~~github

萬一這個項目火了呢。我能夠接廣告了呢(人要有夢想,哈哈哈哈哈哈哈哈)~~~~~canvas

圖片以下。不知道怎麼發動圖。。。。iview

具體說下大致實現方式吧。dom

<template>
<canvas width="1325" height="943" id="canvas"></canvas>
</template>

<script>
export default {
  data () {
    return {
      width: 0,   //當前屏幕的寬度
      height: 0,   //當前屏幕的高度
      canvas: {},   //畫布
      oGc: {},
      emojiNum: 13,
      rainAry: [],
      rainNum: 150,
      extenstion: '.png',
      baseEmojiPath: '/static/images/funny_rain/'   //圖片路徑
    }
  },
  created() {
  },  
  mounted() {
    //獲取當前窗口的寬、高
    this.watchWidth;   //經過computed屬性一直動態的監聽當前窗口的寬度
    this.watchHeight;   //動態監聽高度
    this.initCanvas();
    this.createRain();
    this.move();
    //todo:全局伸縮頁面後,自定義的拓展畫布大小,主要經過window.resize來監聽實現。可是。我目前沒加
  },
  methods: {
    initCanvas() {
      //定義畫布
      this.canvas = document.getElementById('canvas');
      this.canvas.setAttribute('width', this.width);
      this.canvas.setAttribute('height', this.height);
      this.oGc = this.canvas.getContext('2d');
    },
    initRain() {
      let _this = this;
      //每一個emoji rain 是一個單獨的對象
      let rain = {
        init: function(cxt) {
          this.x = _this.random(0,_this.width);   //隨機從x軸降落
          this.y = 0;   //y軸
          this.r = 80;   //每一個emoji的大小
          this.speed = _this.random(3,5);
          //直接繪製出對應的圖片
          let cur_emoji = _this.randomEmoji(1,_this.emojiNum);     //隨機出一張emoji
          let cur_emoji_path = _this.baseEmojiPath + cur_emoji + _this.extenstion;
          this.img = new Image();
          this.img.src = cur_emoji_path;
          cxt.drawImage(this.img,this.x,this.y);   
        },
        draw: function(cxt) {
      //這裏再次繪製,主要是繪製圖片的x,y座標實現動態下落 cxt.drawImage(
this.img,this.x,this.y); //畫布上展現出對應的emoji this.update(cxt); }, update: function(cxt) {
      // 當表情沒有下落到底部,一直加速下墜
if (this.y < (_this.height - this.r)) { this.y += this.speed; } else {
       //重頭開始
this.init(_this.oGc); } } }; return rain; }, createRain() { //經過for循環生成總共的emoji rain for(let i = 0;i < this.rainNum;i++) { setTimeout(() => { //經過定時器,出現延遲感。 let oSnow = this.initRain(); oSnow.init(this.oGc); this.rainAry.push(oSnow); }, 100 * i); } }, move() {
    //刪除以前繪製的像素,不使用的話,你會發現表情下墜的時候會有不少重影
this.oGc.clearRect(0, 0, this.width, this.height); for(var i = 0; i < this.rainAry.length; i++) { this.rainAry[i].draw(this.oGc); //一次性生成好隨機的表情對象,就不用一直隨機生成了。 } requestAnimationFrame(this.move); //requestAnimationFrame的性能比setInternal 和setTimeOut好不少,具體請你們百度看看,這貌似是html5新出的API,我也是寫這個的時候才發現的、
}, random(min,max) { 
  return Math.random() * (max - min) + min;
},
randomEmoji(min,max) {
return Math.floor(Math.random() * (max - min + 1) + min); }
}, computed: {
watchWidth:
function() {
  return this.width = window.innerWidth;
}, watchHeight:
function() {
  return this.height = window.innerHeight;
}
}
}
</script>

github地址:性能

https://github.com/SnailOwO/v-botTemplate

有興趣的能夠加顆星,謝謝~~~渣渣js coder ,若有什麼很差的地方,能夠評論交流。

相關文章
相關標籤/搜索