In diesem Artikelbeispiel wird der spezifische Code von JS Canvas zur Implementierung der Slider-Verifizierung zu Ihrer Information geteilt. Der spezifische Inhalt ist wie folgt Slider-Validierung Ohne weitere Umschweife werde ich zuerst den Code veröffentlichen. Freunde, die ihn verwenden möchten, können ihn direkt verwenden. Wenn Sie ihn verstehen möchten, werde ich Ihnen später meine Ideen mitteilen. <Vorlage> <div Klasse="SchiebereglerInhalt"> <div Klasse="imgDev" :style="'Breite:' + Breite + 'px;'"> <canvas :id="id" :width="Breite" :height="Höhe"></canvas> <Leinwand Klasse="Schieberegler" :id="id + 'SchiebereglerBlock'" :width="Breite" :Höhe="Höhe" :Stil="'links:' + SchiebereglerLinks + 'px;'" ></Leinwand> </div> <div Klasse="moveSLider" :style="'Breite:' + Breite + 'px'"> <div Klasse="reagieren" @mousedown.stop="Ball bewegen($event)"> <div Klasse="Yuan" :Stil="'links:' + (Schieberegler links + 10) + 'px;'" ></div> </div> </div> </div> </Vorlage> <Skript> Standard exportieren { Daten() { zurückkehren { width: 200, //Boxbreite height: 200, //Boxhöhe. Dieser Parameter funktioniert nicht, wenn das Originalverhältnis des Bildes eingestellt ist. id: new Date().getTime(), r: 9, //Der Radius des Halbkreises w: 40, //Die Breite des Schiebereglers imgOriginalScale: true, //Gibt an, ob das Bild im Originalmaßstab angezeigt wird sliderLeft: 0, //Die Anfangsposition des Schiebereglers rangeValue:4, //In welchem Bereich gilt der Schieberegler als richtig, wenn er sich darin befindet imgsrc:require("../assets/img/ver-2.png") //Fügen Sie das gewünschte Hintergrundbild ein }; }, montiert() { dies.init(); }, Methoden: { init() { dies.loadImage(); }, loadImage() {//Bild laden let mainDom = document.getElementById(this.id); let bg = mainDom.getContext("2d"); let blockDom = document.getElementById(this.id + "sliderBlock"); let block = blockDom.getContext("2d"); lass imgsrc = diese.imgsrc; let img = document.createElement("img"); img.style.objectFit = "verkleinern"; img.src = imgsrc; img.onload = () => { wenn (this.imgOriginalScale) { //Berechnen Sie die ursprüngliche Proportion des Bildes basierend auf der Größenänderung des Bildes mainDom.height = (img.height / img.width) * mainDom.width; blockDom.height = (Bildhöhe / Bildbreite) * blockDom.width; } bg.drawImage(img, 0, 0, mainDom.width, mainDom.height); this.drawBlock(bg, mainDom.width, mainDom.height, "fill"); //Den Schiebereglerteil zeichnen this.drawBlock(block, blockDom.width, blockDom.height, "clip", img); //Den Schiebereglerteil zeichnen Beachten Sie, dass Sie zuerst ausschneiden und dann das Bild zeichnen müssen (das Bild muss hier übergeben werden, sonst gibt es keine Möglichkeit, es zu steuern) }; }, drawBlock(ctx, width, height, type, img) { //Dies ist eine Zwei-in-Eins-Funktion, die den Schattenteil zeichnen und die Puzzleform ausschneiden kann let { w, r, sliderLeft } = this; //Hier werden Zufallszahlen verwendet und die Anzeigeposition ist jedes Mal anders var x = this.random(30, width - w - r - 1); //Hier soll der Maximalwert verhindern, dass der Schieberegler ausgeblendet wird, daher sollte die Breite des Schiebereglers abgezogen werden. Es gibt einen Halbkreis, daher sollte die Halbkreisposition abgezogen werden var y = this.random(10, height - w - r - 1); if (Typ == "Clip") {//Hier müssen wir sicherstellen, dass beide Objekte den gleichen Y-Wert haben x = sliderLeft; y = dies.y; } anders { dies.x = x; dies.y = y; } sei PI = Math.PI; //Zeichnen Sie ctx.beginPath(); //links ctx.moveTo(x, y); //Spitze ctx.arc(x + (w + 5) / 2, y, r, -PI, 0, wahr); ctx.lineTo(x + w + 5, y); //Rechts ctx.arc(x + w + 5, y + w / 2, r, 1,5 * PI, 0,5 * PI, falsch); ctx.lineTo(x + w + 5, y + w); //unten ctx.arc(x + (w + 5) / 2, y + w, r, 0, PI, falsch); ctx.lineTo(x, y + w); ctx.arc(x, y + w / 2, r, 0,5 * PI, 1,5 * PI, wahr); ctx.lineTo(x, y); wenn (Typ == "Clip") { ctx.shadowBlur = 10; ctx.shadowColor = "schwarz"; } ctx.Linienbreite = 1; ctx.fillStyle = "rgba(0, 0, 0, 0.4)"; //Hintergrundfarbe festlegen ctx.stroke(); ctx[Typ](); wenn (img) { ctx.drawImage(img, -this.x, 0, Breite, Höhe); } ctx.globalCompositeOperation = "xor"; }, Zufall(min, max) { gibt parseInt zurück (Math.floor (Math.random () * (max - min)) + min); }, moveBall(e) {//Wenn Sie auf den kleinen roten Ball klicken, var oldx = e.pageX; document.onmousemove = (e) => {//Hier müssen Sie das Dokumentobjekt binden, sonst wird es sich nicht bewegen, wenn Sie es verlassen. var x = e.pageX; if(this.sliderLeft+x-oldx<=0){//Beurteile hier die linke Grenze this.sliderLeft = 0; }else if(this.sliderLeft+x-oldx>=this.width-this.r*2-this.w){//Beurteile hier die rechte Grenze this.sliderLeft = this.width-this.r*2-this.w; }anders{ this.sliderLeft += x - altx; } altx = x; }; dies.laveBall(); }, laveBall() {//Status löschen, wenn Maus losgelassen wird document.onmouseup = ()=> { Dokument.onmousemove = null; wenn(dieser.sliderLeft<(dieser.x+dieser.rangeValue)&&dieser.sliderLeft>(dieser.x-dieser.rangeValue)){ console.log("Herzlichen Glückwunsch, Sie haben es geschafft") }else{//Sezt die Position des Schiebereglers zurück, wenn sie nicht ausgewählt ist. this.sliderLeft = 0; } }; }, }, }; </Skript> <style lang="scss" scoped> .moveSLider { Position: relativ; Rand: 0 automatisch; Höhe: 50px; .reagieren { .Yuan Position: absolut; links: 0; oben: 50 %; transformieren: übersetzen(0, -50%); Breite: 30px; Höhe: 30px; Hintergrundfarbe: rot; Randradius: 50 %; Cursor: Zeiger; } Position: absolut; links: 0; oben: 50 %; transformieren: übersetzen(0, -50%); Breite: 100 %; Höhe: 20px; Hintergrundfarbe: rosabraun; } } .imgDev { Position: relativ; Rand: 0 automatisch; .Schieberegler { Position: absolut; links: 0; oben: 0; Hintergrundfarbe: transparent; } } </Stil> Hier fasse ich die Schwierigkeiten zusammen, auf die ich gestoßen bin 1. Am Anfang wusste ich nicht, wie ich die Form dieses Puzzles zeichnen sollte. Später fand ich bei Baidu heraus, dass es eigentlich ganz einfach ist. Die Form, die durch das Verbinden von Halbkreisen und Linien entsteht, ist die Form des Puzzles. 2. Wie kann man nur ein Puzzleteil in einem Bild anzeigen? Auch das ist ganz einfach. Sie können die Funktion ctx.clip() verwenden, um dies zu erreichen. Dabei ist zu beachten, dass Sie zuerst zuschneiden und dann das Bild auf die Leinwand laden müssen, da es sonst nicht zugeschnitten werden kann. Schlüsselcode drawBlock(ctx, width, height, type, img) { //Dies ist eine 2-in-1-Funktion, die den Schattenteil zeichnen und die Puzzleform ausschneiden kann. let { w, r, sliderLeft } = this; //w ist die Breite, r ist der Radius des Kreises. sliderLeft ist die Anfangsposition des Schiebereglers. //Hier werden Zufallszahlen verwendet und die Anzeigeposition ist jedes Mal anders. var x = this.random(30, width - w - r - 1); //Hier soll der Maximalwert verhindern, dass der Schieberegler ausgeblendet wird, also muss die Breite des Schiebereglers abgezogen werden. Es gibt einen Halbkreis, also muss die Halbkreisposition abgezogen werden. var y = this.random(10, height - w - r - 1); if (Typ == "Clip") {//Hier müssen wir sicherstellen, dass beide Objekte den gleichen Y-Wert haben x = sliderLeft; y = dies.y; } anders { dies.x = x; dies.y = y; } sei PI = Math.PI; //Zeichnen Sie ctx.beginPath(); //links ctx.moveTo(x, y); //Spitze ctx.arc(x + (w + 5) / 2, y, r, -PI, 0, wahr); ctx.lineTo(x + w + 5, y); //Rechts ctx.arc(x + w + 5, y + w / 2, r, 1,5 * PI, 0,5 * PI, falsch); ctx.lineTo(x + w + 5, y + w); //unten ctx.arc(x + (w + 5) / 2, y + w, r, 0, PI, falsch); ctx.lineTo(x, y + w); ctx.arc(x, y + w / 2, r, 0,5 * PI, 1,5 * PI, wahr); ctx.lineTo(x, y); wenn (Typ == "Clip") { ctx.shadowBlur = 10; ctx.shadowColor = "schwarz"; } ctx.Linienbreite = 1; ctx.fillStyle = "rgba(0, 0, 0, 0.4)"; //Hintergrundfarbe festlegen ctx.stroke(); ctx[Typ](); if (img) {//Warum müssen wir das Bild hier laden? Weil die Höhe dynamisch ist und vor dem Einfügen berechnet werden muss.//Ein weiterer Grund ist, dass Sie das Bild vor dem Laden zuschneiden müssen. ctx.drawImage(img, -this.x, 0, width, height); } }, Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird. Das könnte Sie auch interessieren:
|
Vorwort Tatsächlich bin ich noch nie auf eine Sit...
MySQL-Version: MySQL Community Server 5.7.17, ins...
Inhaltsverzeichnis verwendenMemo useCallback verw...
Eine sehr nützliche Funktion group_concat(), im H...
Erstellen Sie zunächst ein Verzeichnis cd /etc/ng...
Hinweis: In diesem Artikel geht es um die grundle...
CentOS 8 ist schon seit längerem auf dem Markt. A...
Szenariobeschreibung In einem bestimmten System w...
1. addtime() Füge die angegebene Anzahl Sekunden ...
Was ist der Eingabetyp="Datei"? Ich glau...
Vorwort Wir wissen, dass die Indexauswahl Aufgabe...
Inhaltsverzeichnis 1. Zeitstempel bis heute 2. Ko...
Inhaltsverzeichnis Vorwort Ursachenanalyse und Lö...
Hintergrund Das Lösen von Browserkompatibilitätsp...
Inhaltsverzeichnis 1. Neue Verwendung der Uhr 1.1...