Table des matières
1. >Le principe est très simple, c'est-à-dire ajouter deux
dans la zone de grattage. La première toile sert à afficher le contenu après grattage. Il peut s'agir d'une
Expliquez les paramètres :
est. également lié introduire. " > La méthode de l'outil createElement est utilisée ici, et l'événement est. également lié introduire.
chaîne, si vous utilisez simplement drawImage de la toile directement pour l'image. S'il s'agit d'une chaîne, remplissez-la d'abord de blanc, puis dessinez la chaîne au centre en haut, en bas, à gauche et à droite. Le code est le suivant : " >La première toile est divisée en deux types, image et chaîne, si vous utilisez simplement drawImage de la toile directement pour l'image. S'il s'agit d'une chaîne, remplissez-la d'abord de blanc, puis dessinez la chaîne au centre en haut, en bas, à gauche et à droite. Le code est le suivant :
c'est-à-dire que nous allons masquer le
(7) Pourcentage de zone maculée
Maison interface Web Tutoriel H5 Exemple de détails de l'effet de grattage pratique HTML5 Canvas

Exemple de détails de l'effet de grattage pratique HTML5 Canvas

Mar 30, 2017 am 11:15 AM

Ces dernières années, en raison d'une meilleure prise en charge des appareils mobiles pour HTML5, il sont souvent des activités L'effet des prix à gratter. J'ai également lu le contenu H5 récemment et j'en ai mis un moi-même. Maintenant, je vais le partager avec tout le monde

1. >Le principe est très simple, c'est-à-dire ajouter deux

toiles

dans la zone de grattage. La première toile sert à afficher le contenu après grattage. Il peut s'agir d'une

image ou une

String , la deuxième toile sert à afficher le revêtement, qui peut être rempli d'une image ou d'une couleur unie. La deuxième toile recouvre la première toile lorsqu'elle est dans la seconde. un. Lorsque vous cliquez ou étalez sur la toile (cliquez et faites glisser la souris), rendez la zone cliquée transparente, afin que vous puissiez voir le contenu sur la première toile, ce qui permet d'obtenir l'effet scratch 3. Implémentation.

(1) Définir la classe Loterie

Expliquez les paramètres :

function Lottery(id, cover, coverType, width, height, drawPercentCallback) {
    this.conId = id;
    this.conNode = document.getElementById(this.conId);
    this.cover = cover || '#CCC';
    this.coverType = coverType || 'color';
    this.background = null;
    this.backCtx = null;
    this.mask = null;
    this.maskCtx = null;
    this.lottery = null;
    this.lotteryType = 'image';
    this.width = width || 300;
    this.height = height || 100;
    this.clientRect = null;
    this.drawPercentCallback = drawPercentCallback;
}
Copier après la connexion
id : l'identifiant du conteneur à gratter

  • cover : le contenu du revêtement, qui peut être une adresse d'image ou une valeur de couleur, peut être vide, la valeur par défaut est #ccc

  • coverType : type de revêtement , la valeur est image ou couleur, peut être vide, la valeur par défaut est couleur

  • width : la largeur de la zone de travail, la valeur par défaut est 300px, peut être vide

  • hauteur : la hauteur de la zone de grattage, la valeur par défaut est 100 px, nullable

  • drawPercentCallback : rappel du pourcentage de la zone grattée, nullable

  • Ensuite, plusieurs exigences sont définies.

    variables utilisées

     :

background : le premier élément du canevas

  • backCtx : contexte 2D de l'élément d'arrière-plan (context)

  • masque : le deuxième élément du canevas

  • maskCtx : contexte 2D de l'élément masque

  • lottery : Le contenu affiché après le grattage, qui peut être une adresse d'image ou une chaîne

  • lotteryType : Le type de contenu affiché après le grattage, la valeur est une image ou un texte , pour être Matches

  • clientRect : utilisé pour enregistrer la valeur lotterygetBoundingClientRect() de l'élément de masque

  • (2) Ajoutez deux canevas au conteneur scratch et obtenez le contexte 2D

La méthode de l'outil createElement est utilisée ici, et l'événement est. également lié introduire.

this.background = this.background || this.createElement('canvas', {
    style: 'position:absolute;left:0;top:0;'
});
this.mask = this.mask || this.createElement('canvas', {
    style: 'position:absolute;left:0;top:0;'
});

if (!this.conNode.innerHTML.replace(/[\w\W]| /g, '')) {
    this.conNode.appendChild(this.background);
    this.conNode.appendChild(this.mask);
    this.clientRect = this.conNode ? this.conNode.getBoundingClientRect() : null;
    this.bindEvent();
}

this.backCtx = this.backCtx || this.background.getContext('2d');
this.maskCtx = this.maskCtx || this.mask.getContext('2d');
Copier après la connexion

(3) Dessinez la première toile

La première toile est divisée en deux types, image et chaîne, si vous utilisez simplement drawImage de la toile directement pour l'image. S'il s'agit d'une chaîne, remplissez-la d'abord de blanc, puis dessinez la chaîne au centre en haut, en bas, à gauche et à droite. Le code est le suivant :

<🎜. >

(4) Dessin La deuxième toileLa deuxième toile peut également être remplie d'image ou de couleur.

Il y a une difficulté ici, c'est-à-dire comment rendre la zone de clic de la souris transparente ? La réponse est ici : Developer.mozilla.org/en/docs/Web/Guide/HTML/Canvas_tutorial/Compositing
if (this.lotteryType == &#39;image&#39;) {
    var image = new Image(),
        _this = this;
    image.onload = function () {
        _this.width = this.width;
        _this.height = this.height;
        _this.resizeCanvas(_this.background, this.width, this.height);
        _this.backCtx.drawImage(this, 0, 0);
    }
    image.src = this.lottery;
} else if (this.lotteryType == &#39;text&#39;) {
    this.width = this.width;
    this.height = this.height;
    this.resizeCanvas(this.background, this.width, this.height);
    this.backCtx.save();
    this.backCtx.fillStyle = &#39;#FFF&#39;;
    this.backCtx.fillRect(0, 0, this.width, this.height);
    this.backCtx.restore();
    this.backCtx.save();
    var fontSize = 30;
    this.backCtx.font = &#39;Bold &#39; + fontSize + &#39;px Arial&#39;;
    this.backCtx.textAlign = &#39;center&#39;;
    this.backCtx.fillStyle = &#39;#F60&#39;;
    this.backCtx.fillText(this.lottery, this.width / 2, this.height / 2 + fontSize / 2);
    this.backCtx.restore();
}
Copier après la connexion

c'est-à-dire que nous allons masquer le

de Ctx alors dessinez le deuxième Le code du canevas est le suivant :

Ici, resizeCanvas est une méthode outil pour changer la taille du canevas. globalCompositeOperation 设置为 destination-out ,详细的用法请参考上面给出的链接。

(5) Liaison d'événements

Une fois le dessin terminé, liez l'événement à la deuxième toile. Il y a ici deux situations : les appareils mobiles et PC-WEB. Les appareils mobiles ont des événements touchstart et touchmove, et les événements PC-WEB correspondants sont des événements
this.resizeCanvas(this.mask, this.width, this.height);
if (this.coverType == &#39;color&#39;) {    
this.maskCtx.fillStyle = this.cover;    
this.maskCtx.fillRect(0, 0, this.width, this.height);    
this.maskCtx.globalCompositeOperation = &#39;destination-out&#39;;
} else if (this.coverType == &#39;image&#39;){    var image = new Image(),
        _this = this;
    image.onload = function () {
        _this.maskCtx.drawImage(this, 0, 0);
        _this.maskCtx.globalCompositeOperation = &#39;destination-out&#39;;
    }
    image.src = this.cover;
}
Copier après la connexion
key

down et mousemove. De plus, en mode PC-WEB, un événement mouseup doit être lié au document pour déterminer si. la souris est enfoncée. Le code est le suivant :

Ici, les coordonnées de la souris sont supprimées dans l'événement et drawPoint est appelé pour dessiner, ce qui sera discuté ci-dessous.

(6) Dessinez la zone de clic et de maculage

Le dégradé radial du canevas est utilisé ici pour dessiner un cercle au niveau du pointeur de la souris. Le code est le suivant :
bindEvent: function () {
    var _this = this;
    var device = (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase()));
    var clickEvtName = device ? &#39;touchstart&#39; : &#39;mousedown&#39;;
    var moveEvtName = device? &#39;touchmove&#39;: &#39;mousemove&#39;;
    if (!device) {
        var isMouseDown = false;
        document.addEventListener(&#39;mouseup&#39;, function(e) {
            isMouseDown = false;
        }, false);
    }
    this.mask.addEventListener(clickEvtName, function (e) {
        isMouseDown = true;
        var docEle = document.documentElement;
        if (!_this.clientRect) {
            _this.clientRect = {
                left: 0,
                top:0
            };
        }
        var x = (device ? e.touches[0].clientX : e.clientX) - _this.clientRect.left + docEle.scrollLeft - docEle.clientLeft;
        var y = (device ? e.touches[0].clientY : e.clientY) - _this.clientRect.top + docEle.scrollTop - docEle.clientTop;
        _this.drawPoint(x, y);
    }, false);

    this.mask.addEventListener(moveEvtName, function (e) {
        if (!device &amp;&amp; !isMouseDown) {
            return false;
        }
        var docEle = document.documentElement;
        if (!_this.clientRect) {
            _this.clientRect = {
                left: 0,
                top:0
            };
        }
        var x = (device ? e.touches[0].clientX : e.clientX) - _this.clientRect.left + docEle.scrollLeft - docEle.clientLeft;
        var y = (device ? e.touches[0].clientY : e.clientY) - _this.clientRect.top + docEle.scrollTop - docEle.clientTop;
        _this.drawPoint(x, y);
    }, false);
}
Copier après la connexion

.

(7) Pourcentage de zone maculée

drawPoint: function (x, y) {
    this.maskCtx.beginPath();
    var radgrad = this.maskCtx.createRadialGradient(x, y, 0, x, y, 30);
    radgrad.addColorStop(0, &#39;rgba(0,0,0,0.6)&#39;);
    radgrad.addColorStop(1, &#39;rgba(255, 255, 255, 0)&#39;);
    this.maskCtx.fillStyle = radgrad;
    this.maskCtx.arc(x, y, 30, 0, Math.PI * 2, true);
    this.maskCtx.fill();
    if (this.drawPercentCallback) {
        this.drawPercentCallback.call(null, this.getTransparentPercent(this.maskCtx, this.width, this.height));
    }
}
Copier après la connexion
Dans de nombreux cas, nous devons également savoir combien l'utilisateur a barbouillé avant de passer à l'interaction suivante. Par exemple, lorsque l'utilisateur a enduit 80%, autorisez l'affichage du suivant.

Comment calculer ce pourcentage ? En fait, c'est très simple. Nous pouvons utiliser la méthode getImageData pour spécifier les données de pixel du rectangle sur le canevas. Puisque chaque pixel est représenté par rgba et que la zone peinte est transparente, il suffit de juger la valeur du. canal alpha à savoir. Est-ce transparent ? Le code est le suivant :

(8) Appeler l'entrée init

et enfin fournir une entrée pour le dessin et la réinitialisation. Le code est le suivant : .

getTransparentPercent: function(ctx, width, height) {
    var imgData = ctx.getImageData(0, 0, width, height),
        pixles = imgData.data,
        transPixs = [];
    for (var i = 0, j = pixles.length; i &lt; j; i += 4) {
        var a = pixles[i + 3];
        if (a &lt; 128) {
            transPixs.push(i);
        }
    }
    return (transPixs.length / (pixles.length / 4) * 100).toFixed(2);
}
Copier après la connexion
À ce stade, tous les codes clés ont été expliqués.

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 de ce site Web
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

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Tableau imbriqué en HTML Tableau imbriqué en HTML Sep 04, 2024 pm 04:49 PM

Tableau imbriqué en HTML

Bordure de tableau en HTML Bordure de tableau en HTML Sep 04, 2024 pm 04:49 PM

Bordure de tableau en HTML

Marge gauche HTML Marge gauche HTML Sep 04, 2024 pm 04:48 PM

Marge gauche HTML

Disposition du tableau HTML Disposition du tableau HTML Sep 04, 2024 pm 04:54 PM

Disposition du tableau HTML

Déplacer du texte en HTML Déplacer du texte en HTML Sep 04, 2024 pm 04:45 PM

Déplacer du texte en HTML

Liste ordonnée HTML Liste ordonnée HTML Sep 04, 2024 pm 04:43 PM

Liste ordonnée HTML

Bouton HTML onclick Bouton HTML onclick Sep 04, 2024 pm 04:49 PM

Bouton HTML onclick

Espace réservé d'entrée HTML Espace réservé d'entrée HTML Sep 04, 2024 pm 04:54 PM

Espace réservé d'entrée HTML

See all articles