最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS+Canvas實現滿屏愛心和文字動畫的制作

 更新時間:2022年11月19日 11:14:51   作者:zkj  
Canvas?適合繪制大數據量圖形元素的圖表(如熱力圖、地理坐標系或平行坐標系上的大規(guī)模線圖或散點圖等),也適合實現某些視覺特效。本文就來利用Canvas實現滿屏愛心和文字動畫的制作,感興趣的可以了解一下

介紹

<canvas> 最早由 Apple 引入 WebKit,用于 Mac OS X 的 Dashboard,隨后被各個瀏覽器實現。如今,所有主流的瀏覽器都支持它。Canvas API 提供了一個通過 JavaScript 和 HTML 的 <canvas> 元素來繪制圖形的方式。它可以用于動畫、游戲畫面、數據可視化、圖片編輯以及實時視頻處理等方面。Canvas 適合繪制大數據量圖形元素的圖表(如熱力圖、地理坐標系或平行坐標系上的大規(guī)模線圖或散點圖等),也適合實現某些視覺特效。它還能能夠以 png、jpg 或 webp 格式保存圖像。Canvas 提供了強大的 Web 繪圖能力,所以我們要學會使用它。

效果如下:

步驟

準備一個 canvas 元素。

<canvas id="drawHeart"></canvas>

獲取 canvas 對象和上下文,初始化變量:窗口寬高、愛心和文字總數量、包含愛心和文字的數組,定義愛心圖片,圖片 src 可以是 base64 字符串類型或者本地圖片文件和網絡圖片鏈接。

const canvas = document.getElementById('drawHeart');
const ctx = canvas.getContext('2d');
let wW = window.innerWidth;
let wH = window.innerHeight;
const num = 100;
const hearts = [];
const heartImage = new Image();
heartImage.src = 'data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200"><path id="heart" d="M10,30 A20,20,0,0,1,50,30 A20,20,0,0,1,90,30 Q90,60,50,90 Q10,60,10,30 Z" fill="red"/></svg>';

定義一個 Heart 類,構造函數參數 type 標識用來判斷實例為愛心圖片還是文字類型,定義重繪方法 draw 和更新方法 update。

class Heart {
  constructor(type) {
    this.type = type;
    // 初始化生成范圍
    this.x = Math.random() * wW;
    this.y = Math.random() * wH;
    this.opacity = Math.random() * .5 + .5;
    // 偏移量
    this.vel = {
      x: (Math.random() - .5) * 5,
      y: (Math.random() - .5) * 5
    }
    this.initialW = wW * .5;
    this.initialH = wH * .5;
    // 縮放比例
    this.targetScale = Math.random() * .15 + .02; // 最小0.02
    this.scale = Math.random() * this.targetScale;
    // 文字位置
    this.fx = Math.random() * wW;
    this.fy = Math.random() * wH;
    this.fs = Math.random() * 10;
    this.text = getText();
    this.fvel = {
      x: (Math.random() - .5) * 5,
      y: (Math.random() - .5) * 5,
      f: (Math.random() - .5) * 2
    }
  }
  draw() {
    ctx.save();
    ctx.globalAlpha = this.opacity;
    ctx.drawImage(heartImage, this.x, this.y, this.width, this.height);
    // ctx.scale(this.scale + 1, this.scale + 1);
    if (!this.type) {
      // 設置文字屬性
      ctx.fillStyle = getColor();
      ctx.font = 'italic ' + this.fs + 'px sans-serif';
      // 填充字符串
      ctx.fillText(this.text, this.fx, this.fy);
    }
    ctx.restore();
  }
  update() {
    this.x += this.vel.x;
    this.y += this.vel.y;
    if (this.x - this.width > wW || this.x + this.width < 0) {
      // 重新初始化位置
      this.scale = 0;
      this.x = Math.random() * wW;
      this.y = Math.random() * wH;
    }
    if (this.y - this.height > wH || this.y + this.height < 0) {
      // 重新初始化位置
      this.scale = 0;
      this.x = Math.random() * wW;
      this.y = Math.random() * wH;
    }
    // 放大
    this.scale += (this.targetScale - this.scale) * .1;
    this.height = this.scale * this.initialH;
    this.width = this.height * 1.4;
    // -----文字-----
    this.fx += this.fvel.x;
    this.fy += this.fvel.y;
    this.fs += this.fvel.f;
    if (this.fs > 50) {
      this.fs = 2;
    }
    if (this.fx - this.fs > wW || this.fx + this.fs < 0) {
      // 重新初始化位置
      this.fx = Math.random() * wW;
      this.fy = Math.random() * wH;
    }
    if (this.fy - this.fs > wH || this.fy + this.fs < 0) {
      // 重新初始化位置
      this.fx = Math.random() * wW;
      this.fy = Math.random() * wH;
    }
  }
}

定義一個獲取隨機文字的方法,用來動態(tài)渲染屏幕文字。

function getText() {
  const val = Math.random() * 10;
  if (val > 1 && val <= 3) {
    return 'always';
  } else if (val > 3 && val <= 5) {
    return 'zzy';
  } else if (val > 5 && val <= 8) {
    return 'taylor swift';
  } else {
    return 'I Love You';
  }
}

定義一個獲取隨機顏色的方法,用來動態(tài)渲染屏幕文字顏色。

function getColor() {
  const val = Math.random() * 10;
  if (val > 0 && val <= 1) {
    return '#00f';
  } else if (val > 1 && val <= 2) {
    return '#f00';
  } else if (val > 2 && val <= 3) {
    return '#0f0';
  } else if (val > 3 && val <= 4) {
    return '#368';
  } else if (val > 4 && val <= 5) {
    return '#666';
  } else if (val > 5 && val <= 6) {
    return '#333';
  } else if (val > 6 && val <= 7) {
    return '#f50';
  } else if (val > 7 && val <= 8) {
    return '#e96d5b';
  } else if (val > 8 && val <= 9) {
    return '#5be9e9';
  } else {
    return '#d41d50';
  }
}

定義渲染和初始化方法,添加 resize 事件,在窗口調整大小時自動適應。

function init() {
  canvas.width = wW;
  canvas.height = wH;
  for (let i = 0; i < num; i++) {
    hearts.push(new Heart(i % 5));
  }
  render();
}

function render() {
  ctx.clearRect(0, 0, wW, wH);
  for (let i = 0; i < hearts.length; i++) {
    hearts[i].draw();
    hearts[i].update();
  }
  setTimeout(render, 60);
}

init();
window.addEventListener('resize', function() {
  canvas.width = wW = window.innerWidth;
  canvas.height = wH = window.innerHeight;
});

效果圖

到此這篇關于JS+Canvas實現滿屏愛心和文字動畫的制作的文章就介紹到這了,更多相關JS Canvas愛心文字動畫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Bootstrap輪播插件中圖片變形的終極解決方案 使用jqthumb.js

    Bootstrap輪播插件中圖片變形的終極解決方案 使用jqthumb.js

    這篇文章主要介紹了Bootstrap輪播插件中圖片變形的終極解決方案,使用jqthumb.js,感興趣的小伙伴們可以參考一下
    2016-07-07
  • javascript彈出帶文字信息的提示框效果

    javascript彈出帶文字信息的提示框效果

    這篇文章主要介紹了javascript彈出帶文字信息的提示框效果,涉及javascript簡單彈出窗口定義與樣式相關操作技巧,需要的朋友可以參考下
    2016-07-07
  • Javascript動畫效果(4)

    Javascript動畫效果(4)

    這篇文章主要為大家詳細介紹了第四篇Javascript動畫效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • JavaScript實現alert彈框效果

    JavaScript實現alert彈框效果

    這篇文章主要為大家詳細介紹了JavaScript實現alert彈框效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 微信小程序實現九宮格抽獎

    微信小程序實現九宮格抽獎

    這篇文章主要為大家詳細介紹了微信小程序實現九宮格抽獎,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • js實現七夕表白彈幕效果 jQuery實現彈幕技術

    js實現七夕表白彈幕效果 jQuery實現彈幕技術

    這篇文章主要介紹了js實現七夕表白彈幕效果,jQuery實現彈幕技術,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 原生JS實現簡單的倒計時功能示例

    原生JS實現簡單的倒計時功能示例

    這篇文章主要介紹了原生JS實現簡單的倒計時功能,涉及javascript基于定時器的日期時間運算與頁面元素屬性動態(tài)修改相關操作技巧,需要的朋友可以參考下
    2018-08-08
  • js異或運算符^小技巧分享

    js異或運算符^小技巧分享

    這篇文章主要介紹了js異或運算符^小技巧,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • JavaScript實現彈出子窗口并傳值給父窗口

    JavaScript實現彈出子窗口并傳值給父窗口

    這篇文章主要介紹了JavaScript實現彈出子窗口并傳值給父窗口,方法很簡單,這里推薦給大家,需要的朋友可以參考下
    2014-12-12
  • Bootstrap導航條學習使用(一)

    Bootstrap導航條學習使用(一)

    這篇文章主要為大家詳細介紹了Bootstrap導航條的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02

最新評論

合肥市| 洪江市| 本溪市| 南部县| 固原市| 城步| 景宁| 仁寿县| 上思县| 诸暨市| 隆德县| 衡阳县| 保德县| 革吉县| 会同县| 长治县| 文昌市| 东海县| 鹤庆县| 阿拉善盟| 海门市| 泽普县| 乐清市| 吉木乃县| 梅州市| 象山县| 普安县| 宜黄县| 紫阳县| 和顺县| 漠河县| 商丘市| 怀集县| 渭源县| 嘉兴市| 即墨市| 怀化市| 隆昌县| 三台县| 永宁县| 新竹县|