〔總結〕H5常見效果整理彙總資料

1.Canvas 實現圓形進度條並顯示數字百分比

實現效果
imagejavascript

1.首先建立html代碼css

<canvas id="canvas" width="500" height="500" style="background:#000;"></canvas>

2.建立canvas環境html

var canvas = document.getElementById('canvas'),  //獲取canvas元素
    context = canvas.getContext('2d'),  //獲取畫圖環境,指明爲2d
    centerX = canvas.width/2,   //Canvas中心點x軸座標
    centerY = canvas.height/2,  //Canvas中心點y軸座標
    rad = Math.PI*2/100, //將360度分紅100份,那麼每一份就是rad度
    speed = 0.1; //加載的快慢就靠它了

3.繪製5像素寬的運動外圈html5

//繪製5像素寬的運動外圈
function blueCircle(n){
    context.save();
    context.strokeStyle = "#fff"; //設置描邊樣式
    context.lineWidth = 5; //設置線寬
    context.beginPath(); //路徑開始
    context.arc(centerX, centerY, 100 , -Math.PI/2, -Math.PI/2 +n*rad, false); //用於繪製圓弧context.arc(x座標,y座標,半徑,起始角度,終止角度,順時針/逆時針)
    context.stroke(); //繪製
    context.closePath(); //路徑結束
    context.restore();
}

4.繪製紅色運動圈java

function whiteCircle(){
    context.save();
    context.beginPath();
    context.lineWidth = 2; //設置線寬
    context.strokeStyle = "red";
    context.arc(centerX, centerY, 100 , 0, Math.PI*2, false);
    context.stroke();
    context.closePath();
    context.restore();
}

5.百分比文字繪製css3

function text(n){
    context.save(); //save和restore能夠保證樣式屬性只運用於該段canvas元素
    context.strokeStyle = "#fff"; //設置描邊樣式
    context.font = "40px Arial"; //設置字體大小和字體
    //繪製字體,而且指定位置
    context.strokeText(n.toFixed(0)+"%", centerX-25, centerY+10);
    context.stroke(); //執行繪製
    context.restore();
}

6.讓它運動起來web

(function drawFrame(){
    window.requestAnimationFrame(drawFrame);
    context.clearRect(0, 0, canvas.width, canvas.height);
    whiteCircle();
    text(speed);
    blueCircle(speed);
    if(speed > 100) speed = 0;
    speed += 0.1;
}());

完整代碼canvas

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>HTML5 Canvas 圓形進度條並顯示數字百分比</title>
<style>
    *{margin:0;padding:0;}
    body{text-align:center;background-color:#000;}
</style>
</head>
<body>
<canvas id="canvas" width="500" height="500" style="background:#000;"></canvas>
<script>
    window.onload = function(){
        var canvas = document.getElementById('canvas'),  //獲取canvas元素
            context = canvas.getContext('2d'),  //獲取畫圖環境,指明爲2d
            centerX = canvas.width/2,   //Canvas中心點x軸座標
            centerY = canvas.height/2,  //Canvas中心點y軸座標
            rad = Math.PI*2/100, //將360度分紅100份,那麼每一份就是rad度
            speed = 0.1; //加載的快慢就靠它了 
            
        //繪製5像素寬的運動外圈
        function blueCircle(n){
            context.save();
            context.strokeStyle = "#fff"; //設置描邊樣式
            context.lineWidth = 5; //設置線寬
            context.beginPath(); //路徑開始
            context.arc(centerX, centerY, 100 , -Math.PI/2, -Math.PI/2 +n*rad, false); //用於繪製圓弧context.arc(x座標,y座標,半徑,起始角度,終止角度,順時針/逆時針)
            context.stroke(); //繪製
            context.closePath(); //路徑結束
            context.restore();
        }
        //繪製紅色運動圈
        function whiteCircle(){
            context.save();
            context.beginPath();
            context.lineWidth = 2; //設置線寬
            context.strokeStyle = "red";
            context.arc(centerX, centerY, 100 , 0, Math.PI*2, false);
            context.stroke();
            context.closePath();
            context.restore();
        }  
        //百分比文字繪製
        function text(n){
            context.save(); //save和restore能夠保證樣式屬性只運用於該段canvas元素
            context.strokeStyle = "#fff"; //設置描邊樣式
            context.font = "40px Arial"; //設置字體大小和字體
            //繪製字體,而且指定位置
            context.strokeText(n.toFixed(0)+"%", centerX-25, centerY+10);
            context.stroke(); //執行繪製
            context.restore();
        } 
        //動畫循環
        (function drawFrame(){
            window.requestAnimationFrame(drawFrame);
            context.clearRect(0, 0, canvas.width, canvas.height);
            whiteCircle();
            text(speed);
            blueCircle(speed);
            if(speed > 100) speed = 0;
            speed += 0.1;
        }());
    }
</script>

</body>
</html>

2.H5實現樹葉飄落

實現如圖所示的東西效果(落葉下落):
image瀏覽器

html代碼:app

<!DOCTYPE html>
<html>
<head>
    <title>HTML5樹葉飄落動畫</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=500px, initial-scale=0.64">
    <link rel="stylesheet" href="leaves.css" type="text/css">
    <script src="leaves.js" type="text/javascript"></script>
</head>
<body>
    <div id="container">
        <div id="leafContainer"></div>
        <div id="message">
            <em>這是基於webkit的落葉動畫</em>
        </div>
    </div>  
</body>
</html>

css代碼:

body{
    background-color: #4E4226;
}

#container {
    position: relative;
    height: 700px;
    width: 500px;
    margin: 10px auto;
    overflow: hidden;
    border: 4px solid #5C090A;
    background: #4E4226 url('images/backgroundLeaves.jpg') no-repeat top left;
}

#leafContainer {
    position: absolute;
    width: 100%;
    height: 100%;
}

#message{
    position: absolute;
    top: 160px;
    width: 100%;
    height: 300px;
    background:transparent url('images/textBackground.png') repeat-x center;
    color: #5C090A;
    font-size: 220%;
    font-family: 'Georgia';
    text-align: center;
    padding: 20px 10px;
    -webkit-box-sizing: border-box;
    -webkit-background-size: 100% 100%;
    z-index: 1;
}

em {
    font-weight: bold;
    font-style: normal;
}

#leafContainer > div {
    position: absolute;
    width: 100px;
    height: 100px;
    -webkit-animation-iteration-count: infinite;
    -webkit-animation-direction: normal;
    -webkit-animation-timing-function: linear;
}

#leafContainer > div > img {
     position: absolute;
     width: 100px;
     height: 100px;
     -webkit-animation-iteration-count: infinite;
     -webkit-animation-direction: alternate;
     -webkit-animation-timing-function: ease-in-out;
     -webkit-transform-origin: 50% -100%;
}


@-webkit-keyframes fade{
    0%   { opacity: 1; }
    95%  { opacity: 1; }
    100% { opacity: 0; }
}

@-webkit-keyframes drop{
    0%   { -webkit-transform: translate(0px, -50px); }
    100% { -webkit-transform: translate(0px, 650px); }
}

@-webkit-keyframes clockwiseSpin{
    0%   { -webkit-transform: rotate(-50deg); }
    100% { -webkit-transform: rotate(50deg); }
}


@-webkit-keyframes counterclockwiseSpinAndFlip {
    0%   { -webkit-transform: scale(-1, 1) rotate(50deg); }
    100% { -webkit-transform: scale(-1, 1) rotate(-50deg); }
}

js代碼:

const NUMBER_OF_LEAVES = 30;
function init(){
    var container = document.getElementById('leafContainer');
    for (var i = 0; i < NUMBER_OF_LEAVES; i++) {
        container.appendChild(createALeaf());
    }
}

function randomInteger(low, high){
    return low + Math.floor(Math.random() * (high - low));
}

function randomFloat(low, high){
    return low + Math.random() * (high - low);
}

function pixelValue(value){
    return value + 'px';
}

function durationValue(value){
    return value + 's';
}

function createALeaf(){
    var leafDiv = document.createElement('div');
    leafDiv.style.top = "-100px";
    leafDiv.style.left = pixelValue(randomInteger(0, 500));
    leafDiv.style.webkitAnimationName = 'fade, drop';
    var fadeAndDropDuration = durationValue(randomFloat(5, 11));
    leafDiv.style.webkitAnimationDuration = fadeAndDropDuration + ', ' + fadeAndDropDuration;
    var leafDelay = durationValue(randomFloat(0, 5));
    leafDiv.style.webkitAnimationDelay = leafDelay + ', ' + leafDelay;
    
    var image = document.createElement('img');
    image.src = 'images/realLeaf' + randomInteger(1, 5) + '.png';
    var spinAnimationName = (Math.random() < 0.5) ? 'clockwiseSpin' : 'counterclockwiseSpinAndFlip';
    image.style.webkitAnimationName = spinAnimationName;
    var spinDuration = durationValue(randomFloat(4, 8));
    image.style.webkitAnimationDuration = spinDuration;

    leafDiv.appendChild(image);
    return leafDiv;
}

window.addEventListener('load', init, false);

轉載地址:http://www.html5tricks.com/css3-fall-leaves.html

3.canvas處理連續幀圖片

html5 canvas處理連續幀圖片,下面的代碼基於IE8以上

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<title>Canvas Demo</title>
<script>
var canvas = null;//初始化參數
var img = null;
var ctx = null;
var imageReady = false;
window.onload = function() {
    var canvas = document.getElementById("animation_canvas");
    canvas.width = canvas.parentNode.clientWidth;
    canvas.height = canvas.parentNode.clientHeight;
    
    if (!canvas.getContext) {
        console.log("Canvas not supported. Please install a HTML5 compatible browser.");
        return;
    }   
    // get 2D context of canvas and draw rectangel
    ctx = canvas.getContext("2d");
    ctx.fillStyle="black";
    ctx.fillRect(0, 0, canvas.width, canvas.height);
    console.log(canvas.height);
    img = document.createElement('img');
    img.src = "images/ab0.png";
    img.onload = loaded();
}  
//保證只有圖像加載後纔開始循環動畫
function loaded() {
    imageReady = true;
    setTimeout( update, 1000/3);//添加3幀每秒間隔計時器
}
function redraw() {
    ctx.fillStyle="black";
    ctx.fillRect(0, 0, 460, 460);
    ctx.drawImage(img, 0, 0, 232, 180);
    
}   

//爲了讓圖片以規定的速度動畫,咱們必須追蹤已經通過的時間,而後根據分配給每幀的時間播放幀。基本步驟是:
//一、按每秒幾幀設置動畫速度(msPerFrame)。
//二、當你循環遊戲時,計算一下自最後一幀之後已經通過了多少時間(delta)。
//三、若是已經通過的時間足夠把動畫幀播完,那麼播放這一幀並設置累積delta爲0。
//四、若是已經通過的時間不夠,那麼記住(累積)delta時間(acDelta)。
var frame = 0;
var lastUpdateTime = 0;
var acDelta = 0;
var msPerFrame = 200;
function update() {
    requestAnimFrame(update);
    var delta = Date.now() - lastUpdateTime;
    //console.log(Date.now(),lastUpdateTime);
    if (acDelta > msPerFrame){
        acDelta = 0;
        redraw();
        img.src='images/ab'+frame+'.png';
        frame++; 
        if(frame >= 3) frame = 0; //當繪製後且幀推動完,計時器就會重置。
    }else{
        acDelta += delta;
    }
    lastUpdateTime = Date.now();
}

//requestAnimFrame的做用基本上就是setTimeout,但瀏覽器知道你正在渲染幀,因此它能夠優化繪製循環,以及如何與剩下的頁面迴流。
//在某些狀況下,setTimeout比requestAnimFrame更好用,特別是對於手機。
//如下是在不一樣的瀏覽器上調用requestAnimFrame的狀況也不一樣,標準的檢測方法以下:
window.requestAnimFrame = (function(){
    return window.requestAnimationFrame ||
            window.webkitRequestAnimationFrame ||
            window.mozRequestAnimationFrame ||
            window.oRequestAnimationFrame ||
            window.msRequestAnimationFrame ||
            function( callback ){
                window.setTimeout(callback, 1000 / 3); //若是requestAnimFrame支持不可用,仍是能夠用回內置的setTimeout。
            };
})();

</script>
</head>
<body style="position:absolute;margin:0;padding:0;width:100%;height:100%;">
    <canvas id="animation_canvas"></canvas>
</body>
</html>
後續逐漸添加
相關文章
相關標籤/搜索