Maison  >  Article  >  interface Web  >  Comment implémenter le composant de compte à rebours de l'anneau de toile

Comment implémenter le composant de compte à rebours de l'anneau de toile

不言
不言original
2018-06-14 16:08:341793parcourir

Cet article présente principalement l'exemple de code du composant de compte à rebours de l'anneau de toile. Le contenu est assez bon, je vais le partager avec vous maintenant et le donner comme référence.

Cet article présente l'exemple de code du composant de compte à rebours de l'anneau de toile et le partage avec tout le monde. Les détails sont les suivants :

L'effet est tel que montré dans la figure 1 :

Composant de compte à rebours Canvas ring

Le compte à rebours Canvas ring est un compte à rebours basé sur Canvas Il est recommandé de l'utiliser sur le terminal mobile

<.>Adresse de téléchargement du compte à rebours de l'anneau en toile

1. Comment utiliser1. soyez nommé comme vous le souhaitez

2. Présentez le fichier process.js
<canvas id="canvas"></canvas>

Référence de page

3. Paramètres d'initialisation
<script src="js/process.js"></script>

Instancier simplement

<script>
    window.onload = function () {
        let ctd = new Countdown();
        ctd.init();
    };

</script>

2. Description des paramètres des paramètres

Les paramètres suivants ne sont pas obligatoires et peuvent être configurés en fonction de besoins spécifiques

window.onload = function () {
        let ctd = new Countdown();
        ctd.init({
            id: "canvas",         // ID,canvas一定要有ID属性
            size: 130,            // 绘制圆形的最大尺寸,宽=高
            borderWidth: 4,       // 边框宽度
            borderColor:"#fff",   // 边框颜色
            outerColor:"#fff",    // 最外层底圆颜色
            scheduleColor:"#fff", // 进度条动画颜色
            fontColor: "#fff",    // 字体颜色
            ringColor: "#ffc720", // 进度条环形颜色
            innerColor: "#4e84e5",// 最内圆底色
            fontSize: 50,
            time: 5
        });
    };

3. Exemple de code

html

js



    
    Title
    


<script src="js/process.js"></script> <script> window.onload = function () { let ctd = new Countdown(); ctd.init(); }; </script>

/**
 * Created by 谭瞎 on 2018/3/15.
 */

function Countdown() {
    // 设置默认参数
    this.settings = {
        id: "canvas",         // ID,canvas一定要有ID属性
        size: 130,            // 绘制圆形的最大尺寸,宽=高
        borderWidth: 4,       // 边框宽度
        borderColor:"#fff",   // 边框颜色
        outerColor:"#fff",    // 最外层底圆颜色
        scheduleColor:"#fff", // 进度条动画颜色
        fontColor: "#fff",    // 字体颜色
        ringColor: "#ffc720", // 进度条环形颜色
        innerColor: "#4e84e5",// 最内圆底色
        fontSize: 50,
        time: 5
    }
}

Countdown.prototype.init = function (opt) {
    this.obj = document.getElementById(this.settings.id);
    this.obj.width = this.settings.size;
    this.obj.height = this.settings.size;
    this.ctx = this.obj.getContext("2d");
    extend(this.settings, opt);
    this.countdown();
};

// 绘制底色
Countdown.prototype.drawBackground = function () {
    this.drawCircle(0, 360, 0, this.settings.outerColor);
};
// 绘制进度条动画背景
Countdown.prototype.drawProcess = function () {
    this.drawCircle(0, 360, 4, this.settings.ringColor);
};

// 绘制倒计时
Countdown.prototype.drawInner = function () {
    this.drawCircle(0, 360, 23, this.settings.innerColor);
    this.strokeBorder(this.settings.borderWidth);
};

// 绘制进度条动画
Countdown.prototype.drawAnimate = function () {
    // 旋转的角度
    let deg = Math.PI / 180;
    let v = schedule * 360,
        startAng = -90,
        endAng = -90 + v;

    this.ctx.beginPath();
    this.ctx.moveTo(this.settings.size / 2, this.settings.size / 2);
    this.ctx.arc(this.settings.size / 2, this.settings.size / 2, this.settings.size / 2 -3, startAng * deg, endAng * deg, false);
    this.ctx.fillStyle = this.settings.scheduleColor;
    this.ctx.fill();
    this.ctx.closePath();

};
// 绘制边框
Countdown.prototype.strokeBorder = function (borderWidth) {
    this.ctx.lineWidth = borderWidth;
    this.ctx.strokeStyle = this.settings.borderColor;
    this.ctx.stroke();
};
// 绘制文字
Countdown.prototype.strokeText = function (text) {
    this.ctx.textAlign = "center";
    this.ctx.textBaseline = "middle";
    this.ctx.font = this.settings.fontSize+"px"+ " microsoft yahei";
    this.ctx.fillStyle = this.settings.fontColor;
    this.ctx.fillText(text, this.settings.size / 2, this.settings.size / 2);
};
// 绘制圆
Countdown.prototype.drawCircle = function (startAng, endAng, border, fillColor) {
    let deg = Math.PI / 180;
    this.ctx.beginPath();
    this.ctx.arc(this.settings.size / 2, this.settings.size / 2, this.settings.size / 2 -border, startAng * deg, endAng * deg, false);
    this.ctx.fillStyle = fillColor;
    this.ctx.fill();
    this.ctx.closePath();
};
// 进度条动画
Countdown.prototype.countdown = function () {
    let oldTime = +new Date();
    timer = setInterval(() => {
        let allMs = this.settings.time * 1000,// 如30*1000=30 000ms
            currentTime = +new Date();
        // 步长=(当前的时间-过去的时间)/总秒数
        schedule = (currentTime - oldTime) / allMs;
        this.schedule = schedule;

        this.drawAll(schedule);
        if (currentTime - oldTime >= allMs) {
            // 重绘
            this.drawBackground();
            this.drawProcess();
            this.drawAnimate();
            this.drawInner();
            this.strokeText(0);
            clearInterval(timer);
        }
    }, 100);
};

// 绘制所有
Countdown.prototype.drawAll = function (schedule) {
    schedule = schedule >= 1 ? 1 : schedule;
    let text = parseInt(this.settings.time * (1 - schedule)) + 1;
    // 清除画布
    this.ctx.clearRect(0, 0, this.settings.size, this.settings.size);
    this.drawBackground();
    this.drawProcess();
    this.drawAnimate();
    this.drawInner();
    this.strokeText(text);
};

// 对象拷贝
function extend(obj1,obj2){
    for(let attr in obj2){
        obj1[attr] = obj2[attr];
    }
}

4. Supplémentaire - préparation de la toile

La toile n'est en fait pas si mystérieuse. Ce n'est rien de plus qu'une balise H5, tout comme les autres balises HTML :

A noter qu'il est préférable de définir la largeur et la hauteur du canevas au début (si la largeur et la hauteur ne sont pas définies, le navigateur définira par défaut la taille du canevas sur 300 pixels de large et 100 pixels de haut), et ne peut pas être défini en utilisant CSS (il sera étiré). directement à l'intérieur de la balise canvas :
<canvas id="canvas"></canvas>

Canvas lui-même n'a aucune capacité de dessin et tous les travaux de dessin sont implémentés via js. Habituellement, nous utilisons getElementById dans js pour faire fonctionner le canevas (ce qui signifie que nous devons définir un identifiant pour le canevas) :
<canvas id="canvas" width="130" height="130"></canvas>

1. Préparez le pinceau Ensuite, vous pouvez commencer à dessiner. Les anneaux sont en fait des cercles concentriques avec des rayons différents. Les coordonnées centrales sont (taille/2, taille/2). Dessinez d'abord le plus grand cercle inférieur sur fond blanc avec un rayon de taille/2.
var c = document.getElementById("canvas");
var ctx = c.getContext("2d");

let deg = Math.PI / 180;
// beginPath()可以做到隔离路径绘制效果的作用,防止之前的效果被污染。
ctx.beginPath();

// tcx.arc(圆心X,圆心Y,半径,起始角度,结束角度,顺逆时针);
ctx.arc(size / 2, size / 2, size / 2, 0* deg, 360 * deg, false);
ctx.fillStyle = "#fff";
ctx.fill();
ctx.closePath();

2. Commencez à dessiner le deuxième cercle jaune avec le centre étant également (taille/2, taille/ 2), seul le rayon est 4px plus petit que le cercle inférieur blanc, donc le rayon du cercle inférieur jaune est de (taille/2-4)

let deg = Math.PI / 180;
// beginPath()可以做到隔离路径绘制效果的作用,防止之前的效果被污染。
ctx.beginPath();

// tcx.arc(圆心X,圆心Y,半径,起始角度,结束角度,顺逆时针);
ctx.arc(size / 2, size / 2, size / 2-4, 0* deg, 360 * deg, false);
ctx.fillStyle = "#fff";
ctx.fill();
ctx.closePath();

3. Commencez à dessiner un cercle intérieur bleu de même, le centre du cercle est (taille/2, taille/2), le rayon est (taille-23), puis ajoutez. une bordure blanche de 4 pixels.

let deg = Math.PI / 180;
// beginPath()可以做到隔离路径绘制效果的作用,防止之前的效果被污染。
ctx.beginPath();

// tcx.arc(圆心X,圆心Y,半径,起始角度,结束角度,顺逆时针);
ctx.arc(size / 2, size / 2, size / 2-23, 0* deg, 360 * deg, false);
ctx.fillStyle = "#fff";
ctx.fill();
ctx.closePath();

// 白色边框
ctx.lineWidth = 4;
ctx.strokeStyle = #fff;
ctx.stroke();

4. Dessinez le texte et centrez-le verticalement

ctx.textAlign = "center";
ctx.textBaseline = "middle";
ctx.fillStyle = "#fff";
// ctx.fillText(文字,相对画布的X坐标,相对画布的Y坐标)
ctx.fillText(30, size / 2, size / 2);

5. Comment faire de l'animation ? En fait, il s'agit également d'un processus consistant à dessiner un cercle blanc, un processus consistant à recouvrir lentement la barre de progression jaune. Ensuite, dessinez d'abord le cercle blanc. À ce moment-là, le cercle bleu sera recouvert par le cercle blanc animé. , le dernier cercle bleu sera bien dessiné.

let deg = Math.PI / 180;
ctx.beginPath();
// tcx.arc(圆心X,圆心Y,半径,起始角度,结束角度,顺逆时针);
ctx.arc(size / 2, size / 2, size / 2-4, 0* deg, 360 * deg, false);
ctx.fillStyle = "#fff";
ctx.fill();
ctx.closePath();

6. Le processus de peinture relativement simple est terminé. Ensuite, nous devons associer l'animation au. En utilisant l'heure la plus récente - l'heure la plus ancienne, puis en divisant le temps total, vous pouvez obtenir un pourcentage clé. Ce pourcentage détermine le changement du nombre et l'angle auquel le cercle blanc animé est dessiné.

Countdown.prototype.countdown = function () {
    let oldTime = +new Date();// 过去的时间:1522136419291
    timer = setInterval(() => {
        let currentTime = +new Date();// 现在的时间:1522136419393
        let allMs = this.settings.time * 1000;// 总时间豪秒数:如30*1000=30 000ms
        schedule = (currentTime - oldTime) / allMs;// 绘制百分比:(1522136419393-1522136419291)/30000=0.0204
        this.schedule = schedule;
        this.drawAll(schedule);
        if (currentTime - oldTime >= allMs) {
            // 重绘
            this.drawBackground();
            this.drawProcess();
            this.drawAnimate();
            this.drawInner();
            this.strokeText(0);
            clearInterval(timer);
        }
    }, 10);
};

// 绘制所有
Countdown.prototype.drawAll = function (schedule) {
    schedule = schedule >= 1 ? 1 : schedule;
    let text = parseInt(this.settings.time * (1 - schedule)) + 1;
    // 清除画布
    this.ctx.clearRect(0, 0, this.settings.size, this.settings.size);
    this.drawBackground();
    this.drawProcess();
    this.drawAnimate();
    this.drawInner();
    this.strokeText(text);
};

// 绘制进度条动画
Countdown.prototype.drawAnimate = function () {
    // 旋转的角度
    let deg = Math.PI / 180;
    let v = schedule * 360,
        startAng = -90,// 开始角度
        endAng = -90 + v;// 结束角度

    this.ctx.beginPath();
    this.ctx.moveTo(this.settings.size / 2, this.settings.size / 2);
    this.ctx.arc(this.settings.size / 2, this.settings.size / 2, this.settings.size / 2 - 3, startAng * deg, endAng * deg, false);
    this.ctx.fillStyle = this.settings.scheduleColor;
    this.ctx.fill();
    this.ctx.closePath();
};

Version orientée processus

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !
/**
    * 进度条动画
    */
    countdown: function () {
        this.getSystemInfo().then(v => {
            // 自适应
            let width = v.windowWidth,
                size = width >= 414 ? 66 : 400 / 414 * 66;
            size = parseInt(size);
            size = size % 2 ? size + 1 : size;

            let maxtime =30,
                sTime = +new Date,

                temp = setInterval(() => {
                    let time = maxtime * 1000,
                        currentTime = +new Date,
                        schedule = (currentTime - sTime) / time;

                    this.drew(schedule, maxtime, size);

                    if (currentTime - sTime >= time) {
                        // 绘制文字
                        this.setData({
                            schedule: 0
                        });
                        clearInterval(temp);
                    };
                }, 100);

        });
    },

    /**
     * 绘制
     */
    drew: function (schedule, val, size) {
        size = size || 66;
        const _ts = this;
        schedule = schedule >= 1 ? 1 : schedule;

        let text = parseInt(val - val * schedule),
            r = size / 2,
            deg = Math.PI / 180;

        _ts.setData({
            width: size,
            height: size,
            schedule: text + 1
        });

        // 清除画布
        ctx.clearRect(0, 0, size, size);

        // 绘制白色底
        ctx.beginPath();
        ctx.arc(r, r, r, 0 * deg, 360 * deg);
        ctx.fillStyle = &#39;rgba(255,255,255,1)&#39;;
        ctx.closePath();
        ctx.fill();

        // 绘制橙色
        ctx.beginPath();
        ctx.arc(r, r, r - 2, 0 * deg, 360 * deg);
        ctx.fillStyle = &#39;rgba(248,200,80,1)&#39;;
        ctx.closePath();
        ctx.fill();

        // 绘制白色进度条
        let v = schedule * 360;

        ctx.beginPath();
        ctx.moveTo(r, r);
        ctx.arc(r, r, r, -90 * deg, (-90 + v) * deg);

        ctx.fillStyle = &#39;rgba(255,255,255,1)&#39;;
        ctx.closePath();
        ctx.fill();

        // 中心蓝色底
        ctx.beginPath();
        ctx.arc(r, r, r - 12, 0 * deg, 360 * deg);
        ctx.fillStyle = &#39;rgba(90,140,220,1)&#39;;
        ctx.closePath();
        ctx.fill();

        // 绘制文字
        ctx.strokeText();
        
        // 统一画
        ctx.draw();
            
    },

Recommandations associées :

Comment utiliser Canvas pour manipuler les pixels

À propos des propriétés des lignes de toile

Comment utiliser Canvas pour implémenter une mosaïque d'images


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn