ÿµ±ºï×ÓÃÇÎÊÎÒJavaScriptºÍDOMÀïɶ¶«Î÷×îÅ£±ÆÊ±£¬ÎÒ¶¼»áÒ»°ÍÕÆ´ò»ØÈ¥£ºÎÔ²Û»¹ÓÃÎÊôµ±È»ÊÇʼþÏìÓ¦Á˰¡£¡Ã»ËüÄãÄÜÓÐʱ¼äºÍÎÒÌÖÂÛÕâ¸ö£¿ÄãÔçÈ¥¹¤µØ°áשȥÁ˺Ãô£¡ä¯ÀÀÆ÷ûÓÐʼþÏìÓ¦¾ÍûÓÐÐÐΪ½»»¥£¬ÄǼòÖ±¾ÍÊÇÒ»Ò¹»Øµ½½â·ÅǰµÄ¸Ð¾õ°¡¡£´ËÍ⣬ÒÔʼþÇý¶¯Ê¹µÃ¹¦ÄܽâñîÒ²ÊǸöÏ൱¸ß¶Ë´óÆøµÄ¼¼ÇÉÁË£¬ÂÒÔ´ËΪÖ÷µÄNode.js
ÏÖÔÚ¿ÉÊÇ·çÉúË®ÆðµÄ˵¡£
ÄÇÏÖÔÚÎÒÃǾÍÔٿٿÙʼþ¼àÌýµÄÏà¹Ø»ù´¡£¬Èôó¼ÒÔÚÐÄÇéÓäÔõÄ״̬Ï»ñµÃ¸ü¶àµÄ×Ë¡áÊÆ¡£²»¹ýÄÇЩ¾³£Ð´<a
href=¡±javascript:void(0)¡±>ºÍÔÚ±êÇ©ÉÏдonclick=¡±foo()¡±µÄºï×ÓÃÇÇë×Ô¶¯»Ø±Ü£¬Ð¡ÐÄÄã¿´²»¶®ÓÖÏë²»¿ª£¬ÀÏñÄͽÔö×ïÄõѽ£¨Å¼°ËÄêǰ¾Í½âÊÍÁËÄÚÁªÊ¼þ´¦ÀíÊÇ×ÔѰËÀ·£©¡£
ÔÙßëß¶Á½¾ä£º±¾ÎĵĴúÂëÄÚÈÝֻɿ¼°µ½ÔÉúJavaScript£¬ÏñJQuery£¬YUI»òDojoʲôµÄËùÌṩµÄʼþ´¦ÀíÕâÀï¾Í²»¼ÓÒÔ׸ÊöÁË¡£ÎÒÏ£Íû´ó¼ÒÄܹ»Ã÷°×£¬Ê¹ÓÃÕâЩ¿âÖ»ÊÇΪÁË·½±ã£¬µ«ÎÒÃÇÈ´²»ÄÜÍêÈ«ÒÀÀµËü¡£Á˽â»ù´¡ÓëÀí½â±¾ÖÊÊǷdz£ÖØÒªµÄ£¬ÕâÑùÄã¾Í¿ÉÒÔÔÚ²»ÄÜʹÓÃɵ¹Ï¿âµÄÇé¿öÏ£¬ÒÀ¾É¿ÉÒÔÌṩһ¸öÅ£±ÆµÄ½â¾ö·½°¸¡£
½ø»¯Ö÷ÒåÉùÃ÷£ºÕâÀïÎÒÃÇʹÓõÄʼþÓï·¨ÊÇ¡°DOM Level 3 Events¡±¹æ·¶¶¨ÒåµÄ¡°addEventListener()¡£³ýÁËIE9ÒÔϰ汾ÒÔÍâµÄÏÖ´úä¯ÀÀÆ÷¶¼Ö§³Ö¡£µ±È»£¬ÎÒÃÇ¿ÉÒÔʹÓÃJQuery£¬Ëü»á°ïÎÒ½â¾öÕâЩä¯ÀÀÆ÷¼æÈÝÐÔµÄÎÊÌâ¡£µ«Èç¹ûÄ㻹ÏëÈû¥ÁªÍø¿ÉÒÔÁ¼ºÃ·¢Õ¹ºÍ½ø»¯£¬Äã¾ÍÓ¦¸ÃÁ¢¿ÌֹͣΪ¼æÈݵͼ¶ä¯ÀÀÆ÷¶øÔÙȥдһÛçʺһÑùµÄɵ±Æ¼æÈÝ´úÂë¡£ÕâÌõ·ËäÈ»¼èÐÁ£¬µ«È´ÎÞ±ÈÕýÈ·¡£¿ÉÒÔÊÔןøÄãµÄ²úÆ·½øÐй¦Äܽµ¼¶£¬¼ì²âµ½Êǵͼ¶ä¯ÀÀÆ÷¾Í²»Ö´Ðнű¾£¬±ÈÈçaddEventListener()µÄDOMContentLoadedʼþ¾ÍÄÜÈ·±£ÄãµÄ´úÂë²»Ôڵͼ¶ä¯ÀÀÆ÷ÖÐÔËÐУ¬¶øÒ³Ãæ¿ÉÒÔ½«Ö÷ÌåÄÚÈÝÕý³£ÏÔʾ¾ÍOKµÄ¡£
ÔÚÎÒÃǽøÈëʼþµÄϸ½Ú֮ǰÏÈ¿´¼¸¸öÅ£±ÆµÄÑÝʾ£¬ËüÀûÓÃonscrollʼþµÃµ½ÁËÒ»¸öºÜniceµÄЧ¹û£º
ÒòΪҪÕÐÉè¼ÆÊ¦£¬WealthfrontµÄ¹¤³ÌʦÃÇ¿ª·¢ÁËZÖá¹ö¶¯Æ½ÒÆÐ§¹û¡£ÕâÒ²ÊÇBeercamp
2011 websiteµÄÒ»²¿·Ö¡£WealthfrontµÄ²©¿ÍÓÐϸ½Ú½éÉÜ¡£
Stroll.jsÓõÄÒ²ÊÇÀàËÆµÄÊÖ·¨£¬Óû§¿ÉÒÔÔÚ¹ö¶¯Áбíʱ¿´µ½ºÜ¶àÖÖìÅ¿áÕ¹ÏÖ¡£
jQuery Scroll PathÊÇÒ»¸öJQ²å¼þ£¬ËüµÄ¹¦ÄÜÊǵ±Óû§ÔÚÒ³ÃæÄÚÄܹ»¸úËæ×ÅÒ»Ìõ·¾¶È¥¶¯Ì¬ä¯ÀÀÄÚÈÝ¡£
ÒÔÉÏËùÓж¼ÊÇ»ùÓÚä¯ÀÀÆ÷µÄʼþ¼àÌýºÍ´¦Àí¹¦ÄÜ£¬ËùÒÔ£¬ÈÃÎÒÃÇϸϸƷζһÏÂÔÖÔζµÄʼþ»úÖÆ°É¡£
»ù´¡ÎÊÌ⣺ɶÊÇʼþ£¿
var log = document.getElementById('log'), i = '', out = []; for (i in window) { if ( /^on/.test(i)) { out[out.length] = i; } } log.innerHTML = out.join(', '); |
ÔÚä¯ÀÀÆ÷ÖÐÔËÐÐÈçÉÏ´úÂ룬Ç×ÃÇ¿ÉÒԵõ½ÈçÏ£º
onmouseenter, onmouseleave, onafterprint, onbeforeprint, onbeforeunload, onhashchange,
onmessage, onoffline, ononline, onpopstate, onpagehide, onpageshow, onresize, onunload,
ondevicemotion, ondeviceorientation, onabort, onblur, oncanplay, oncanplaythrough, onchange,
onclick, oncontextmenu, ondblclick, ondrag, ondragend, ondragenter, ondragleave, ondragover,
ondragstart, ondrop, ondurationchange, onemptied, onended, onerror, onfocus, oninput, oninvalid,
onkeydown, onkeypress, onkeyup, onload, onloadeddata, onloadedmetadata, onloadstart, onmousedown,
onmousemove, onmouseout, onmouseover, onmouseup, onmozfullscreenchange, onmozfullscreenerror,
onpause, onplay, onplaying, onprogress, onratechange, onreset, onscroll, onseeked, onseeking,
onselect, onshow, onstalled, onsubmit, onsuspend, ontimeupdate, onvolumechange, onwaiting,
oncopy, oncut, onpaste, onbeforescriptexecute, onafterscriptexecute |
Ò»´óÛçʼþ¾Í¹»Äã³Ô¼¸ÌìµÄÁË£¬ÓÃaddEventListener()·½·¨¿ÉÒÔ½øÐÐʼþ¼àÌý£º
element.addEventListener(event, handler, useCapture); |
¾Ù¸öÀý×ÓÀ´Ëµ£º
var a = document.querySelector('a'); // grab the first link in the document a.addEventListener('click', ajaxloader, false); |
ÎÒÃÇÔÚÒ»¸öelementÉϼÓÁ˸öʼþ¼àÌý£¬¾ÍºÃÏñÊÇÔÚÃüÁîËý£¬¡°Äã±»¿ÍÈËÃþÁËÄã¾Í¸øÎÒº°ÆðÀ´£¡¡± The
ajaxloader()ÊǼàÌýʼþµÄ»Øµ÷·½·¨£¬¾ÍºÃÏñÊÇ£¬¡°Äã¾ÍÔÚÕâ¶ù¸øÎÒ¶¢×Å£¬æ¤ÒªÊǺ°ÁË£¬Äã¾Í¹ýÈ¥¸ø¿ÍÈ˵ÀǸ£¡¡±
½«µÚÈý¸ö²ÎÊýuseCaptureÉèÖÃΪfalseÊÇΪÁ˱íʾÕâ´ÎÊÇÔÚʼþðÅݽ׶νøÐд¥·¢£¬¶ø²»ÊÇÔÚʼþ²¶»ñ½×¶Î¡£¿È¿È£¬ÕâÊÇÒ»¸öÂþ³¤¶ø¼è¾ÞµÄ¿ÎÌ⣬ÄãÒ²¿ÉÒÔ¿´¿´Dev.Opera¶ÔcaptureµÄ½âÊÍ¡£°¥Ñ½·´Õý²»ÓùÜÄÇô¶àÀ²£¬99.7434£¥µÄÇé¿öÏÂÉèÖÃuseCaptureΪfalse׼û´í£¡ÆäʵËüĬÈϾÍÊÇfalse£¬ËùÒÔ°´ÀíÀ´ËµÊÇ¿ÉÒÔ²»ÓÃÌîдµÄ£¬µ«OperaÕⶺ±ÈÀýÍâ¡
ÔÚʼþ±»´¥·¢Ö®Ê±£¬»Øµ÷·½·¨»á½ÓÊÕµ½Ò»¸öʼþ¶ÔÏó¡£ÇëÊÔ×ÅÔÚÇ¡µ±µÄ»·¾³ÖÐÔËÐÐÈçÏ´úÂ룬Ҳ¿ÉÒÔÖ±½Óµã»÷ÕâÀï²âÊÔÕâ¸öÀý×Ó£¬¶ÔÏóÄÚµÄÊôÐÔÓÖ¹»³ÔÒ»ÅèµÄ£º
var log = document.getElementById('log'), out = ''; document.addEventListener('click', logeventinfo, false); document.addEventListener('keypress', logeventinfo, false); function logeventinfo (ev) { log.innerHTML = ''; out = '<ul>'; for (var i in ev) { if (typeof ev[i] === 'function' || i === i.toUpperCase()) { continue; } out += '<li><span>'+i+'</span>: '+ev[i]+'</li>'; } log.innerHTML += out + '</ul>'; } |
Äã¿ÉÒÔ¶Ôͬһʼþ½øÐжàÖØ¼àÌý£¬Ò²¿ÉÒÔ¶Ô¶à¸öʼþʹÓÃͬһ·½·¨´¦Àí£¨Èç±¾Àý£©¡£
²ÎÊýevÊÇ´«»ØÀ´µÄʼþ¶ÔÏó£¬ÏÂÃæÊÇËüËù´øµÄÈ«²¿ÊôÐÔ£º
originalTarget: [object HTMLHtmlElement] type: click target: [object HTMLHtmlElement] currentTarget: [object HTMLDocument] eventPhase: 3 bubbles: true cancelable: true timeStamp: 574553210 defaultPrevented: false which: 1 rangeParent: [object Text] rangeOffset: 23 pageX: 182 pageY: 111 isChar: false screenX: 1016 screenY: 572 clientX: 182 clientY: 111 ctrlKey: false shiftKey: false altKey: false metaKey: false button: 0 relatedTarget: null mozPressure: 0 mozInputSource: 1 view: [object Window] detail: 1 layerX: 182 layerY: 111 cancelBubble: false explicitOriginalTarget: [object HTMLHtmlElement] isTrusted: true originalTarget: [object HTMLHeadingElement] type: click target: [object HTMLHeadingElement] currentTarget: [object HTMLDocument] eventPhase: 3 bubbles: true cancelable: true timeStamp: 574554192 defaultPrevented: false which: 1 rangeParent: [object Text] rangeOffset: 0 pageX: 1 pageY: 18 isChar: false screenX: 835 screenY: 479 clientX: 1 clientY: 18 ctrlKey: false shiftKey: false altKey: false metaKey: false button: 0 relatedTarget: null mozPressure: 0 mozInputSource: 1 view: [object Window] detail: 1 layerX: 1 layerY: 18 cancelBubble: false explicitOriginalTarget: [object Text] isTrusted: true |
ÊÔһϱ¾ÀýÖеã»÷Êó±êºÍ°´¼üÅÌ£¬²»Í¬µÄʼþ´¥·¢´«»ØÀ´µÄ½á¹ûÊDz»Í¬µÄ¡£¿ÉÒÔ¿´¿´ÍêÕûµÄ±ê׼ʼþÊôÐÔÁÐ±í¡£
ÖªÏþ»ù´¡Ö®ºó£º×èֹʼþĬÈÏÐÐΪµÄÖ´ÐкͻñµÃ´¥·¢Ê¼þµÄÄ¿±êÔªËØ
ÎÒÃÇÐèÒªÁ˽âä¯ÀÀÆ÷ÖйØÓÚʼþ¶ÔÏóÓÐÁ½¸öºÜÖØÒªµÄ¹¦ÄÜ¡£×èÖ¹ä¯ÀÀÆ÷Ö´ÐÐʼþĬÈÏÐÐΪµÄev.preventDefault()£¬ºÍ¿ÉÒÔ»ñµÃʼþÄ¿±êÔªËØµÄev.target.
±ÈÈç˵һ¸öÁ´½Ó±»µã»÷ÁË£¬µ«ÒòΪҵÎñÐèÒª£¬ÎÒÃDz¢²»ÏëÈÃä¯ÀÀÆ÷´ò¿ªÐÂÒ³Ãæ¡£Õâʱºò¿ÉÒÔ¸øÕâ¸öÁ´½Ó¼Ó¸öµã»÷ʼþ¼àÌý£¬È»ºóÔڻص÷º¯ÊýÖе÷ÓÃ
preventDefault()·½·¨¼´¿É¡£°º£¬¾ÍÈçÏÂÃæÕâ¸öÀý×Ó£¬Çë¿´HTML£º
<a class="prevent" href="http://smashingmagazine.com">Smashing, my dear!</a> <a class="normal" href="http://smashingmagazine.com">Smashing, my dear!</a>
|
»¹ÓÐJavaScript£º
var normal = document.querySelector('.normal'), prevent = document.querySelector('.prevent'); prevent.addEventListener('click', function(ev) { alert('fabulous, really!'); ev.preventDefault(); }, false); normal.addEventListener('click', function(ev) { alert('fabulous, really!'); }, false); |
×¢Ò⣺ document.querySelector() ÊǺÏÀí»ñÈ¡DOMÔªËØµÄÒ»ÖÖ·½Ê½¡£ºÍjQueryµÄ
$() ²î²»¶à¡£ ¿ÉÒÔ¶Á¶Á W3C¡¯s specification ºÍMDNµÄ explanatory
code snippets È¥Á˽⡣
Èç¹ûµã»÷.preventÁ´½Ó£¬»áµ¯³ö¸ö¶Ô»°¿ò£¬µã¡°È·¶¨¡±ºóɶʶ¼Ã»·¢Éú£¬ºÇ¡«ºÇ¡«£¬ÒòΪ´¦ÀíÖÐÓÐÖ´ÐÐev.preventDefault()£¬ËùÒÔ²»»áÌøµ½
http://smashingmagazine.com¡£Ã»ÓÐ preventDefault()µÄ¾Í»áÔÚµ¯¶Ô»°¿ò£¬ÇÒÌøÁ´½Ó¿©¡£²»ÐÅÄã¿ÉÒÔÊÔÒ»ÏÂÂï¡£
ͨ³£Çé¿öÏ£¬´¦ÀíʼþµÄ·½·¨ÏëÒª·ÃÎÊ´¥·¢ÔªËØÖ»ÄÜͨ¹ý±äÁ¿ºÍthisʲôµÄÈ¥¹ØÁª£¬ËäÈ»¿´ËƼòµ¥·½±ã£¬µ«addEventListener()¸øÁËÎÒÃǸüºÃµÄÑ¡Ôñ£ºÊ¼þÄ¿±ê£¨target£©£¬²»¹ýËü¿ÉÄܱ»ÆäËûµÄһЩ¶«Î÷»ìÏý£¬ËùÒÔÓÃev.currentTarget¸ü±£ÏÕЩ¡£Í¨³£ÏëÒªÔÚµã»÷¡¢ÐüÍ£»òÊäÈëʼþµÄ»Øµ÷·½·¨ÖзÃÎÊ´¥·¢ÔªËض¼ÊÇÓñäÁ¿
this ¡£ËäÈ»·½±ã£¬µ«Õâ¸ö¹Ø¼ü×ÖÄã¶®µÃ¡ÓÚÊÇ addEventListener() Ìṩ¸øÎÒÃÇÒ»¸ö¸üºÃµÄ»ñÈ¡·½Ê½£ºevent.target¡£
²»¹ýËü¿ÉÄܻᱻ»ìÏý£¨ this ±»°óµ½Ææ¹ÖµÄ¶«Î÷ÉϵÄʱºò£©£¬ËùÒÔÓà ev.currentTarget ¸ü±£ÏÕЩ¡£
ʼþ´úÀí£º¸ß¶Ë£¬´óÆø£¬Éϵµ´Î£¡
ÓÃʼþ¶ÔÏóµÄ target ÊôÐÔ£¬Äã¿ÉÒԵõ½´¥·¢Ê¼þµÄÔªËØ¡£
ʼþ±»¼¤»îºó£¬»áÏñºï×ÓÒ»ÑùÑØ×ÅDOMÊ÷´Ó¼àÌý½ÚµãÏ»¬µ½´¥·¢½Úµã£¬È»ºóÔÙÉÏÅÀ»Ø¼àÌý½Úµã¡£Ò²¾ÍÊÇ˵£¬Èç¹ûÄã¼àÌýÁËÒ»¸öDOM½Úµã£¬ÄÇÒ²¾ÍµÈÓÚÄã¼àÌýÁËÆäËùÓеĺó´ú½Úµã¡£´úÀíµÄÒâ˼¾ÍÊÇÖ»¼àÌý¸¸½ÚµãµÄʼþ´¥·¢£¬ÒÔÀ´´úÀí¶ÔÆäºó´ú½ÚµãµÄ¼àÌý£¬¶øÄãÐèÒª×öµÄÖ»ÊÇͨ¹ý
target ÊôÐԵõ½´¥·¢ÔªËز¢×÷³ö»ØÓ¦¡£À´¿´ÎÒÏÂÃæµÄÀý×Ó£º
<ul id="resources"> <li><a href="http://developer.mozilla.org">MDN</a></li> <li><a href="http://html5doctor.com">HTML5 Doctor</a></li> <li><a href="http://html5rocks.com">HTML5 Rocks</a></li> <li><a href="http://beta.theexpressiveweb.com/">Expressive Web</a></li> <li><a href="http://creativeJS.com/">CreativeJS</a></li> </ul> |
Õâ¸öÀý×ÓÖеÄHTML½á¹¹ÊǸöÎÞÐòÁÐ±í£¬µ±Êó±êÐüÍ£»áÏÔʾÏàÓ¦µÄ±êÇ©ÐÅÏ¢¡£ÏÂÃæÊÇËüJS´úÂ룬Ä㽫¿´µ½ËüÖ»Óõ½ÁËÒ»¸öʼþ¼àÌý£¬È»ºóÔÚ´¦Àíº¯ÊýÖеõ½target£¬ÒÔËüµÄ
tagName À´½øÐÐÇø·Ö¡£
var resources = document.querySelector('#resources'), log = document.querySelector('#log'); resources.addEventListener('mouseover', showtarget, false); function showtarget(ev) { var target = ev.target; if (target.tagName === 'A') { log.innerHTML = 'A link, with the href:' + target.href; } if (target.tagName === 'LI') { log.innerHTML = 'A list item'; } if (target.tagName === 'UL') { log.innerHTML = 'The list itself'; } } |
ÎÒ·ÑʰÉÀ²½âÊÍÁ˰ëÌ죬ÄËÃǶ®µÃÕâô×öÒâζ×Åʲôô£¿ÕâÒâζ×ÅÄã¿ÉÒÔ½ÚÊ¡´óÁ¿Öظ´µÄʼþ¼àÌý£¬ÒÔ¼õÉÙä¯ÀÀÆ÷×ÊÔ´ÏûºÄ¡£´ó¶àÊýÈË¿ÉÄÜ»áÓÃjQueryµÄ$(¡®a¡¯).click(¡)
ɶɶɶµÄ£¨ËäÈ» jQueryµÄ on ·½·¨ÓÅ»¯µÄ»¹OKÀ²²»¹ýż»¹ÊÇÂù±ÉÊÓËûµÄ£©£¬Õâô×ö¿´ËÆÒ»¾ä»°Âù´ø¸ÐµÄ£¬¿ÉÆäʵËüÊǰѻñÈ¡µ½µÄËùÓÐAÔªËØÒ»¸öÒ»¸öµÄ×¢²á¼àÌý£¡È»ºóÔÚij¸öʱ¿Ì£¬³ä³â×ÅÎÞÊýʼþ¼àÌýµÄÒ³ÃæÖÕÓÚ¾õÀÛ²»°®£¬×Ô±¬ÒÔÃùÔ©Çü¡£
Ëý»¹ÓÐÒ»¸öºÃ´¦¾ÍÊÇÈÃHTML¶ÀÁ¢ÆðÀ´£¬±ÈÈçÖ®ºó»¹ÓÐÒª¼Ó×ÓÔªËØµÄÐèÇó£¬Ò²²»ÐèÒªÔÙΪÆäµ¥¶À¼Óʼþ¼àÌýÁË¡£
ʼþ¼à²â£¬Ë³±ã˵һϳ¬¼¶Å£±ÆµÄCSSƽ»¬Ð§¹û
ÒÔǰÎÒÃÇ»áÓÃmouseover|mouseoutʼþÀ´°µ´ì´ìµÄʵÏÖhoverЧ¹û£¬¶øÏÖÔÚÓÃCSSαѡÔñÆ÷µÄ:hoverºÍ:focusʲôµÄ¾ÍÖ±½Ó¸ã¶¨ÁË¡£Ïëµ½ÕâÀÄÚÐÄÖ¹²»×¡µÄÉ˸а¡¡¡Ä§·¨Ê¦ÃǼá³Öס£¡¿È¿È£¬µ±È»£¬CSSÒ²²¢²»ÊÇÍòÄܵģ¬ÓÐЩÊÂÇ黹ÊÇÒª¸úʼþÅäºÏÍê³É£¬±ÈÈçÏÂÃæÕâ¸öÀý×Ó£¬¶ÔÊó±êÖ¸Õë½øÐж¨Î»¡£ÕâÊÇÏ൱¼òµ¥µÄÁËÊDz»£¬ÎÒÃÇÏȸã¸ö¾ø¶Ô¶¨Î»µÄСÇòÔªËØ£¬ÏÂÃæÊÇËüµÄHTML£º
ÕâÊÇËüµÄCSS£º
.plot { position:absolute; background:rgb(175,50,50); width: 20px; height: 20px; border-radius: 20px; display: block; top:0; left:0; } |
ÎÒÃǼàÌý²¢´¦ÀídoucmentµÄclickʼþ£¬ÀûÓÃPageXºÍpageY¶ÔСÇò½øÐж¨Î»¡£×¢Òâ°¡ÕâÀÎÒÃÇÐèÒª¼õÈ¥ÇòµÄ°ë¾¶£¬ÒÔÈÃÇòµÄÖÐÐÄÔÚÊó±êÖ¸ÕëÉÏ£º
var plot = document.querySelector('.plot'), offset = plot.offsetWidth / 2; document.addEventListener('click', function(ev) { plot.style.left = (ev.pageX - offset) + 'px'; plot.style.top = (ev.pageY - offset) + 'px'; }, false); |
Ëæ±ãµã»÷ÆÁÄ»µÄÈÎÒâλÖã¬Ð¡Çò¶¼»áËæÖ®ÉÁÏÖµ½ÄÇ¡£²»¹ýËü²¢²»ÊÇÆ½»¬¹ýÈ¥µÄ£¬µ«Èç¹ûÄã¹´Ñ¡Õâ¸öʾÀýµÄ¸´Ñ¡¿ò£¬Äã»á·¢ÏÖСÇò¾Í»áºÜÔ²ÈóµÄ»¬¹ýÀ´ÁË¡£Õâ¸öЧ¹ûÄØ£¬¹ýÈ¥µÄ»°¿ÉÄÜÖ»ÄÜÓÃJS¿âÀ´Íê³É£¬µ«ÏÖÔÚ°¡£¬Ê±´ú²»Í¬ÁË¡¡ÎÒÃÇÖ»ÐèÒªÓÃCSSд¸ö¹ý¶ÉЧ¹ûµÄÀ࣬¶øÊ£ÏµÄÊÂÇé¾ÍÈÃä¯ÀÀÆ÷È¥´¦Àí¡£ÎªÖÁÓÚ´Ë£¬ÎÒÃÇд¸öÀàÃûΪsmoothµÄÑùʽ£¬ÔÚ¸´Ñ¡¿ò±»Ñ¡ÖÐÖ®ºó£¬½«ÆäÓ¦Óõ½Ð¡ÇòÉÏ£º
.smooth { -webkit-transition: 0.5s; -moz-transition: 0.5s; -ms-transition: 0.5s; -o-transition: 0.5s; transition: 0.5s; } |
Ìí¼ÓJavaScript£º
var cb = document.querySelector('input[type=checkbox]'); cb.addEventListener('click', function(ev) { plot.classList.toggle('smooth'); }, false); |
Ëæ×ÅÐÂÊÀ½çµÄÀ´ÁÙ£¬CSSºÍJavaScriptË«½£ºÏèµ£¬ËÓëÕù·æ£¡Âï˳±ã˵Ï£¬ÔÚJSÖÐÒ²ÓиúCSS¹ý¶ÉºÍ¶¯»Ð§¹ûÓйصÄʼþàÞ¡£
ߣһ¸ö¼üÐèÒª¶à³¤Ê±¼ä£¿
ÕýÈçÄã֮ǰÔÚ¿ÉÓÃʼþÁбíÖп´µ½µÄ£¬ÎÒÃÇÒ²¿ÉÒÔ¼àÌý°´¼üÊäÈëʼþ¡£²»¹ýºÜÒź¶µÄÊÇ£¬ä¯ÀÀÆ÷¶Ô¼üÅÌʼþ´¦ÀíµÄ²¢²»ÊǺܵ½Î»£¬Äã¿ÉÒÔ¿´¿´Jan
Wolter¶Ô´ËµÄÏêϸ½âÊͽÓÏÂÀ´ÈÃÎÒÃÇ¿´Ò»¸ökeytimeµÄÀý×Ó£¬Ëü»áÊä³öÓû§°´¼üµÄºÁÃë¼ä¸ô¡£´úÂë²¢²»ÄÑ£º
var resources = document.querySelector('#resources'), log = document.querySelector('#log'), time = 0; document.addEventListener('keydown', keydown, false); document.addEventListener('keyup', keyup, false); function keydown(ev) { if (time === 0) { time = ev.timeStamp; log.classList.add('animate'); } } function keyup(ev) { if (time !== 0) { log.innerHTML = ev.timeStamp - time; time = 0; log.classList.remove('animate'); } } |
Ïȶ¨ÒåÎÒÃÇÏëÒª²Ù×ݵÄÔªËØ²¢ÉèÖÃtimeΪ0¡£È»ºóÎÒÃÇÔÚdocumentÉϼàÌýÁ½¸ö¼üÅÌÊäÈëʼþ keydownºÍkeyup¡£
ÔÚkeydownʼþ´¦ÀíÖУ¬ÎÒÃǼì²é±äÁ¿timeÊÇ·ñΪ0£¬Èç¹ûÊÇÔò°Ñʼþ¶ÔÏóµÄtimeStamp¸³Öµ¸øtime¡£ÔÙ¼Ó¸öCSS¶¯»Ààanimate¸ølog½Úµã£¬ÈÃËüÏò¹ö¶¯ÌõÒ»Ñù¶¯ÆðÀ´
ÔÚkeyupʼþ´¦ÀíÖУ¬Èç¹ûtime»¹ÊÇΪ0ÔòºöÂÔ£¨ÔÚ°´×żüÅÌµÄÆÚ¼äkeydownʼþÊÇÁ¬Ðø²»¶Ï±»´¥·¢µÄ£©£¬Èç¹û²»ÊÇÔòͨ¹ýÁ½Õßʱ¼ä´ÁÏà¼õÈ¥¼ÆËãÒ»´Î°´¼ü²Ù×÷¾¹ý¶à³¤Ê±¼ä¡£×îºóÈÃtimeΪ0²¢ÒƳýlog½ÚµãµÄanimateÀà
Ū¸öCSS¹ý¶É£¨¶¯»£©Ð§¹û
µ±ä¯ÀÀÆ÷ÔËÐÐCSS¹ý¶ÉЧ¹ûÊÇ»áÔÚJavaScriptÖд¥·¢Ò»¸ö¶ÀÁ¢Ê¼þ£¬½Ðtransitionend¡£Õâ¸öʼþ¶ÔÏó»áÓÐÁ½¸öÊôÐÔ£º±»ÆäËùÓ°Ïìµ½µÄÊôÐÔÃûpropertyName£¬ºÍÆä¹ý¶ÉËù¾ÀúµÄʱ¼äelapsedTime¡£
¿ÉÒԲ鿴Õâ¸ödemo¸ÐÊÜһϣ¬´úÂëºÜ¼òµ¥£¬ÏÂÃæÊÇËüµÄCSS£º
.plot { background:rgb(175,50,50); width: 20px; height: 20px; border-radius: 20px; display: block; -webkit-transition: 0.5s; -moz-transition: 0.5s; -ms-transition: 0.5s; -o-transition: 0.5s; transition: 0.5s; } .plot:hover { width: 50px; height: 50px; border-radius: 100px; background: blue; } |
ÕâÊÇËüµÄJavaScript£º
plot.addEventListener('transitionend', function(ev) { log.innerHTML += ev.propertyName + ':' + ev.elapsedTime + 's '; }, false); |
µ«ÒòΪFire/Chrome/Safari/OperaµÈÕâЩä¯ÀÀÆ÷³§É̸÷×ÔΪÕþ£¬Ò²ÊÇÒòΪÕâЩʼþ»¹²»³ÉÊ죬ËùÒÔÕâЩʼþÃûͨ³£¶¼»á±»¼ÓÉÏǰ׺£¬ÄÇÔÚʹÓÃʱÄã¾Í²»µÃ²»ÅжÏÏÂä¯ÀÀÆ÷¼æÈÝÐÔ¡£¿ÉÒÔ¿´¿´Õâ¸öDavid
Calhoun¡¯s gist¡£
CSS¶¯»Ê¼þºÍÉÏÃæÑÝʾµÄ¹ý¶Éʼþ»ù±¾Ò»¸öÒâ˼£¬ËüÓÐÈý¸öʼþ£ºanimationstart£¬animationendºÍanimationiteration¡£¿ÉÒÔ¿´MDNµÄdemo¡£
ËÙ¶È£¬¾àÀëºÍ½Ç¶È£¬Ã»ÓÐÎÊÌ⣡
ʼþÎÒÃÇÊǼàÌýµ½ÁË£¬µ«Èç¹ûÏëÈÃËü¸ü¼ÓŒÅÕ¨Ì죬ÎÒÃǾÍÐèÒªÔÙÀ´µãÓÐÉî¶ÈµÄ£¬±ÈÈçÔÚÓû§ÔÚÍÏ×§ÔªËØÊ±£¬¸øÔªËØÀ´¸ö¼ÆËã½Ç¶È¡¢¾àÀëºÍËٶȲîʲôµÄ¡ª¡ªÊ¾Àý¡£
var plot = document.querySelector('.plot'), log = document.querySelector('output'), offset = plot.offsetWidth / 2, pressed = false, start = 0, x = 0, y = 0, end = 0, ex = 0, ey = 0, mx = 0, my = 0, duration = 0, dist = 0, angle = 0; document.addEventListener('mousedown', onmousedown, false); document.addEventListener('mouseup', onmouseup, false); document.addEventListener('mousemove', onmousemove, false); function onmousedown(ev) { if (start === 0 && x === 0 && y === 0) { start = ev.timeStamp; x = ev.clientX; y = ev.clientY; moveplot(x, y); pressed = true; } } function onmouseup(ev) { end = ev.timeStamp; duration = end - start; ex = ev.clientX; ey = ev.clientY; mx = ex - x; my = ey - y; dist = Math.sqrt(mx * mx + my * my); start = x = y = 0; pressed = false; angle = Math.atan2( my, mx ) * 180 / Math.PI; log.innerHTML = '<strong>' + (dist>>0) +'</strong> pixels in <strong>'+ duration +'</strong> ms ( <strong>' + twofloat(dist/duration) +'</strong> pixels/ms)'+ ' at <strong>' + twofloat(angle) + '</strong> degrees'; } function onmousemove (ev) { if (pressed) { moveplot(ev.pageX, ev.pageY); } } function twofloat(val) { return Math.round((val*100))/100; } function moveplot(x, y) { plot.style.left = (x - offset) + 'px'; plot.style.top = (y - offset) + 'px'; } |
ºÃÀ²£¬ºÃÏñ×öÁ˺ܶàÊÂÇéµÄÑù×Ó£¬µ«ÊÂʵÉϲ¢Ã»ÓÐÄÇô¸´ÔÓ¡£¼àÌýonmousedownºÍonmouseupÁ½¸öʼþ£¬ÎÒÃÇÄܵõ½Êó±êµ±Ç°Î»ÖÃclientXºÍclientY£¬»¹ÓмǼ°´¼üʱ¼äµÄtimeStamp¡£µ±Êó±êÒÆ¶¯Ê±£¬¼ì²éÊó±êÊÇ·ñ±»°´ÏÂÁË£¨Í¨¹ýÔÚmousedownʱÉ趨µÄ²¼¶ûÖµ£©£¬Èç¹û°´ÏÂÁËÔòÈÃСÇò¸ú×ÅÊó±êÒÆ¶¯¡£
È»ºóÊǼ¸ºÎ¡ª¡ªPythagoras£¨±Ï´ï¸çÀ˹¶¨Àí£©Í¨¹ýmousedownºÍmouseupµÄʱ¼ä¼ä¸ôºÍÏñËØÎ»ÒÆ¶øµÃ³öËüÔ˶¯µÄËÙ¶È¡£
ÎÒÃǵõ½ÁËÔ˶¯¿ªÊ¼ºÍ½áÊøµÄxy×ø±ê£¬Ïà¼õµÃµ½¾àÀë²î£¬ÔÙÆ½·½Ïà¼Ó£¬×îºóµÃµ½ºÍµÄƽ·½¸ù£¬¼´ÎªÐ¡ÇòÔ˶¯µÄÎ»ÒÆ¡£ÂïÎÒÃÇ»¹Í¨¹ý¼ÆËãÈý½ÇÐεķ´ÕýÇеõ½ÁËËüÔ˶¯Ç°ºóµÄƫת½Ç¶È£¬¸ß¶Ë°É£¡ºÙºÙÆäʵÕâЩ¶¼Êdz¡°A
Quick Look Into the Math of Animations With JavaScript¡±µÄ¡¡Äã¿ÉÒÔ¿´ÏÂÕâ¸öÔÚJSFiddleÉϵÄʾÀý£º
http://jsfiddle.net/codepo8/bAwUf/light/
ýÌåʼþ
videoºÍaudioÕâÁ©ºÜ³±µÄÍæÒâÒ²ÓÐÒ»´ó¶Ñʼþ¹©ÎÒÃÇʹÓᣱÈÈçÓÐȤµÄtimeʼþ£¬Ëü¿ÉÒÔ¸æËßÎÒÃÇÕâÊ׸è»òµçÓ°µÄÒѲ¥·Åʱ³¤¡£¿ÉÒÔ¿´¿´MDNÕâ¸öMGM-inspired
dinosaur animation£»ÎÒҲûÊÂÏеÄÂ¼ÖÆÁËÒ»¸ösix-minute screencastÀ´ÍæÅªÁËÒ»ÏÂ~¡£
Ïë¿´ËùÓеÄʼþ¶¯×÷£¿È¥JPlayer¿´Ã½ÌåʼþµÄÑÝÊ¾Ò³Ãæ°É¡£
ÆäËûÊäÈëÏà¹Ø
ÎÒÃÇÖªµÀ£¬ä¯ÀÀÆ÷ÌṩÁËÓëÊó±ê¼üÅ̵Ľ»»¥£¬µ«Õ⻹ԶԶ²»¹»Âú×ãÎÒÃǸü¶àµÄÓ²¼þ½»»¥ÐèÇó¡£±ÈÈç¼ì²âÊÖ»ú»òƽ°åµçÄÔÇãб¶ÈµÄDevice
orientationºÍ touch events¡£the Gamepad APIÈÃÎÒÃÇ¿ÉÒÔÔÚä¯ÀÀÆ÷ÖÐ×öÓÎÏ·¿ØÖÆ£»postMessageÈÃÎÒÃÇ¿ÉÒÔÔÚä¯ÀÀÆ÷¸÷´°¿ÚÖ®¼ä½øÐпçÓòÏûÏ¢´«µÝ£»pageVisibilityÈÃÎÒÃÇ¿ÉÒÔµÃÖªä¯ÀÀÆ÷Öе±Ç°±êǩҳ¿É¼û״̬¡£ÉõÖÁµ±windowµÄhistory¶ÔÏóÓвÙ×÷ʱҲÄܼàÌýµÄµ½¡£²é¿´window¶ÔÏóµÄʼþÁÐ±í£¬ÓеĿÉÄÜÒѾ±»ÊµÏÖÁË£¬»¹Óиü¶àµÄÔÚı»®ÖС¡
Â²»¹Üä¯ÀÀÆ÷ÊÇ·ñ»áÖ§³Ö£¬×îÖÕ¶¼ÊÇÒªÖ§³ÖµÄÂÕâЩÊǸÕÐè¡£ÎÒÃÇֻҪĬĬµÈ´ý¾Í¿ÉÒÔÁË£¬É§Ä꣬Ïò×ÅϦÑô±¼Åܰɣ¡=v=
Íæ³ö¸öδÀ´
»ù±¾ÉϾÍÕâÑùÁË£¬¿´£¬Ê¼þ²¢²»ÄÑ¡£Ò»°ãÇé¿öÏ£¬ÄãÖ»ÐèҪע²á¼àÌýËûÃÇ£¬È»ºóÔÚʼþ´¦Àíº¯ÊýÖÐʹÓÃevent¶ÔÏó¾ÍºÃÁË¡£Èç¹ûµ½ÏÖÔÚÄ㻹ûÏëµ½ËüÄÜ×öЩʲôÓÐȤµÄÊÂÇ飬ÄÇÕâÆªÎÄÕÂÒ²Ö»ÄܰïÄãµ¹ÕâÀïÁË¡£±ðÔÙ¹ÜÉÏÎĵÄÄÇЩÀý×ÓÁË£¬ÇëÄãÓÃÄãÄÇÉÏÐâµÄÄÔ´üºÃºÃ˼¿¼Ï£¬Íæ·ßÅСÄñʱºò£¬²»¾ÍÊǼàÌý¸ö´¥ÃþʼþµÄ¿ªÊ¼Óë½áÊø£¬ÔÙ´¦ÀíÏÂÏàÓ¦µÄ·½ÏòºÍ¾àÀë²îËùµÃ³öµÄÉä»÷Á¦Á¿Ã´£¿×îºóವÄÒ»Éù£¬Ð¡Äñ¾Í×ÔÓÉ·ÉÏèÔÚÔ¶·½ÁË~¡£ËùÒÔ£¬¾¿¾¹ÊÇʲô×èÖ¹ÁËÄãµÄ´´Ò⣿¸Ã¼ÓÁ˸öÓÍÁË£¬Í¬Ñ§¡£
|