html5实现刮刮卡
来源:互联网 发布:魔兽世界淘宝刷坐骑 编辑:程序博客网 时间:2024/05/06 18:31
使用canvas实现。
canvas下面有一个div,div中可以显示文字。
基于github中一个项目修改的。http://github.com/websanova/wScratchPad
html
<div id="gua1" class="guaguaka"></div><script type="text/javascript">$(function(){ $("#gua1").wScratchPad({ cursor:'', image:'images/xx.jpg', text:'123', scratchMove: function(e, percent) { if(percent > 70) this.clear(); }, });})</script>
css
.guaguaka{ display: inline-block; position: relative;}
js
(function($){ $.fn.wScratchPad = function(option, settings) { if(typeof option === 'object') { settings = option; } else if(typeof option == 'string') { var values = []; var elements = this.each(function() { var data = $(this).data('_wScratchPad'); if(data) { if(option === 'reset') { data.reset(); } else if(option === 'clear') { data.clear(); } else if(option === 'enabled') { data.enabled = settings === true; } else if($.fn.wScratchPad.defaultSettings[option] !== undefined) { if(settings !== undefined) { data.settings[option] = settings; } else { values.push(data.settings[option]); } } } }); if(values.length === 1) { return values[0]; } if(values.length > 0) { return values; } else { return elements; } } settings = $.extend({}, $.fn.wScratchPad.defaultSettings, settings || {}); return this.each(function() { var elem = $(this); var $settings = jQuery.extend(true, {}, settings); //test for HTML5 canvas var test = document.createElement('canvas'); if(!test.getContext) { elem.html("Browser does not support HTML5 canvas, please upgrade to a more modern browser."); return false; } var sp = new ScratchPad($settings, elem); elem.append($('<p></p>').css({ position:'absolute', margin:'0',width:'100%', height:'100%', 'text-align':'center', 'line-height':$settings.height+'px', 'font-size':$settings.height/2 + 'px' }).html($settings.text)); elem.append(sp.generate()); //get number of pixels of canvas for percent calculations sp.pixels = sp.canvas.width * sp.canvas.height; elem.data('_wScratchPad', sp); sp.init(); }); }; $.fn.wScratchPad.defaultSettings = { text : 'none', width: 483,// set width - best to match image width height: 340,// set height - best to match image height image: null,// set image path image2: null,// set overlay image path - if set color is not used color: '#888',// set scratch color - if image2 is not set uses color overlay: 'none',// set the type of overlay effect 'none', 'lighter' - only used with color size: 10,// set size of scratcher realtimePercent : false, // Update scratch percent only on the mouseup/touchend (for better performances on mobile device) scratchDown: null,// scratchDown callback scratchUp: null,// scratchUp callback scratchMove: null,// scratcMove callback cursor: null// Set path to custom cursor }; function ScratchPad(settings, elem) { this.sp = null; this.settings = settings; this.$elem = elem; this.enabled = true; this.scratch = false; this.canvas = null; this.ctx = null; return this; } ScratchPad.prototype = { generate: function() { var $this = this; this.canvas = document.createElement('canvas'); this.ctx = this.canvas.getContext('2d'); this.sp = $('<div></div>') .css({position: 'relative'}) .append( $(this.canvas) .attr('width', this.settings.width + 'px') .attr('height', this.settings.height + 'px') ) $(this.canvas) .mousedown(function(e) { if(!$this.enabled) return true; e.preventDefault(); e.stopPropagation(); //reset canvas offset in case it has moved $this.canvas_offset = $($this.canvas).offset(); $this.scratch = true; $this.scratchFunc(e, $this, 'Down'); }) .mousemove(function(e) { e.preventDefault(); e.stopPropagation(); if($this.scratch) $this.scratchFunc(e, $this, 'Move'); }) .mouseup(function(e) { e.preventDefault(); e.stopPropagation(); //make sure we are in draw mode otherwise this will fire on any mouse up. if($this.scratch) { $this.scratch = false; $this.scratchFunc(e, $this, 'Up'); } }); this.bindMobile(this.sp); return this.sp; }, bindMobile: function($el) { $el.bind('touchstart touchmove touchend touchcancel', function () { var touches = event.changedTouches, first = touches[0], type = ""; switch (event.type) { case "touchstart": type = "mousedown"; break; case "touchmove": type = "mousemove"; break; case "touchend": type = "mouseup"; break; default: return; } var simulatedEvent = document.createEvent("MouseEvent"); simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY, false, false, false, false, 0/*left*/, null); first.target.dispatchEvent(simulatedEvent); event.preventDefault(); }); }, init: function() { this.sp.css('width', this.settings.width); this.sp.css('height', this.settings.height); this.sp.css('cursor', (this.settings.cursor ? 'url("' + this.settings.cursor + '"), default' : 'default')); $(this.canvas).css({cursor: (this.settings.cursor ? 'url("' + this.settings.cursor + '"), default' : 'default')}); this.canvas.width = this.settings.width; this.canvas.height = this.settings.height; this.pixels = this.canvas.width * this.canvas.height; if(this.settings.image2) { this.drawImage(this.settings.image2); } else { if(this.settings.overlay != 'none') { if(this.settings.image) { this.drawImage(this.settings.image); } this.ctx.globalCompositeOperation = this.settings.overlay; } else { this.setBgImage(); } this.ctx.fillStyle = this.settings.color; this.ctx.beginPath(); this.ctx.rect(0, 0, this.settings.width, this.settings.height) this.ctx.fill(); } }, reset: function() { this.ctx.globalCompositeOperation = 'source-over'; this.init(); }, clear: function() { this.ctx.clearRect(0, 0, this.settings.width, this.settings.height); }, setBgImage: function() { if(this.settings.image) { this.sp.css({backgroundImage: 'url('+this.settings.image+')'}); } }, drawImage: function(imagePath) { var $this = this; var img = new Image(); img.src = imagePath; $(img).load(function(){ $this.ctx.drawImage(img, 0, 0); $this.setBgImage(); }) }, scratchFunc: function(e, $this, event) { e.pageX = Math.floor(e.pageX - $this.canvas_offset.left); e.pageY = Math.floor(e.pageY - $this.canvas_offset.top); $this['scratch' + event](e, $this); if(this.settings.realtimePercent || event == "Up") { if($this.settings['scratch' + event]) $this.settings['scratch' + event].apply($this, [e, $this.scratchPercentage($this)]); } }, scratchPercentage: function($this) { var hits = 0; var imageData = $this.ctx.getImageData(0,0,$this.canvas.width,$this.canvas.height) for(var i=0, ii=imageData.data.length; i<ii; i=i+4) { if(imageData.data[i] == 0 && imageData.data[i+1] == 0 && imageData.data[i+2] == 0 && imageData.data[i+3] == 0) hits++; } return (hits / $this.pixels) * 100; }, scratchDown: function(e, $this) { $this.ctx.globalCompositeOperation = 'destination-out'; $this.ctx.lineJoin = "round"; $this.ctx.lineCap = "round"; $this.ctx.strokeStyle = $this.settings.color; $this.ctx.lineWidth = $this.settings.size; //draw single dot in case of a click without a move $this.ctx.beginPath(); $this.ctx.arc(e.pageX, e.pageY, $this.settings.size/2, 0, Math.PI*2, true); $this.ctx.closePath(); $this.ctx.fill(); //start the path for a drag $this.ctx.beginPath(); $this.ctx.moveTo(e.pageX, e.pageY); }, scratchMove: function(e, $this) { $this.ctx.lineTo(e.pageX, e.pageY); $this.ctx.stroke(); }, scratchUp: function(e, $this) { $this.ctx.closePath(); }, }})(jQuery);
0 0
- html5实现刮刮卡效果
- html5实现刮刮卡
- HTML5实现刮刮卡功能
- HTML5实现刮刮卡效果
- 使用HTML5实现刮刮卡效果
- html5 js 实现刮刮卡效果
- 使用HTML5实现刮刮卡效果
- html5 canvas实现刮刮卡效果
- Atitit .html5刮刮卡的gui实现总结
- HTML5实现类似刮刮卡的功能
- HTML5实现类似刮刮卡的功能
- HTML5实现圣诞树效果
- Html5实现拖动效果
- Android实现HTML5 video
- HTML5实现幻灯片
- HTML5有意思的实现
- HTML5+JS实现俄罗斯方块
- HTML5实现视频播放
- HDU 2520 我是菜鸟,我怕谁
- Pthreads并行编程之spin lock与mutex性能对比分析
- MyEclipse中Could not create the view: An unexpected exception was thrown.
- Linux下mysql主从配置
- JSP中使用bean,创建后执行成功,修改后却没变化?
- html5实现刮刮卡
- 不起眼的小空格里的大文章
- 关于shell中$VARIABLE ${VARIABLE} "$VARIABLE"
- HDU 2500 做一个正气的杭电人
- envelope.getResponse 只返回一条数据
- 争做python小能手(一)
- 黑马程序员_集合总结
- buffer busywaits
- pthread编程基础