最开始在陌小雨那就看到了这个功能,觉得挺好玩,但是也没想继续深入。昨天在无主题博客看到他分享了这个功能的代码之后,觉得可以试试。
用了之后,发现他改进之后的代码存在几个缺憾:
①、他加入了随机播放功能,但是多次点击启动,将出现多首歌曲叠加播放 BUG(嗨过头了); ②、这个功能一旦启用,就必须刷新页面来停止,否则得等到歌曲播放完成才会停止“颤抖”; ③、如果用了 CDN,那么 js 会托管到 CDN,新增或更改歌曲就变得非常麻烦,因为缓存刷新很蛋疼; ④、启动之后,高潮来得有点慢,15.5s 才会看到明显效果(强迫症)。
我部署了这个功能之后,改进了一下:
①、加入移除机制,当第二次启动功能时,将移除上一次加载内容,从而避免了歌曲叠加播放的窘迫; ②、加入停止函数 stopCrazy(),只要执行这个函数就能停止效果,怎么发挥就看你的了; ③、将歌曲赋值数组从 js 里面分离出来,直接放到页面中,后续只要修改页面代码,就能即时生效; ④、我将 15.5s 的延迟改成 5s,让高潮效果提前,没办法现代人大部分喜欢快节奏。。。
刚刚无主题博主小武也说了,可以监听整个页面的双击动作来停止效果,提议不错。我考虑将停止函数绑定到鼠标双击、键盘 ESC 上面,下面开始 DIY!
①、CSS 代码
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释
* @charset "utf-8";body{-webkit-backface-visibility:hidden}.mw-strobe_light{position:fixed;width:100%;height:100%;top:0;left:0;z-index:100000;background-color:rgba(250,250,250,0.8);display:block}.mw-harlem_shake_me{transition:all 0.8s ease-in-out;-moz-transition:all 0.8s ease-in-out;-webkit-transition:all 0.8s ease-in-out;-o-transition:all 0.8s ease-in-out;-ms-transition:all 0.8s ease-in-out;animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;-webkit-animation:spin 1s infinite linear;-o-animation:spin 1s infinite linear;-ms-animation:spin 1s infinite linear}.mw-harlem_shake_slow{transition:all 3.2s ease-in-out;-moz-transition:all 3.2s ease-in-out;-webkit-transition:all 3.2s ease-in-out;-o-transition:all 3.2s ease-in-out;-ms-transition:all 3.2s ease-in-out;animation:spin 4s infinite linear;-moz-animation:spin 4s infinite linear;-webkit-animation:spin 4s infinite linear;-o-animation:spin 4s infinite linear;-ms-animation:spin 4s infinite linear}.mw-harlem_shake_me{-webkit-animation-duration:.4s;-moz-animation-duration:.4s;-o-animation-duration:.4s;animation-duration:.4s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.mw-harlem_shake_slow{-webkit-animation-duration:1.6s;-moz-animation-duration:1.6s;-o-animation-duration:1.6s;animation-duration:1.6s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.flash,.mw-strobe_light{-webkit-animation-name:flash;-moz-animation-name:flash;-o-animation-name:flash;animation-name:flash}@-webkit-keyframes shake{0%,100%{-webkit-transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px)}}@-moz-keyframes shake{0%,100%{-moz-transform:translateX(0)}10%,30%,50%,70%,90%{-moz-transform:translateX(-10px)}20%,40%,60%,80%{-moz-transform:translateX(10px)}}@-o-keyframes shake{0%,100%{-o-transform:translateX(0)}10%,30%,50%,70%,90%{-o-transform:translateX(-10px)}20%,40%,60%,80%{-o-transform:translateX(10px)}}@keyframes shake{0%,100%{transform:translateX(0)}10%,30%,50%,70%,90%{transform:translateX(-10px)}20%,40%,60%,80%{transform:translateX(10px)}}.shake,.im_baked{-webkit-animation-name:shake;-moz-animation-name:shake;-o-animation-name:shake;animation-name:shake}.swing,.im_drunk{-webkit-transform-origin:top center;-moz-transform-origin:top center;-o-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;-moz-animation-name:swing;-o-animation-name:swing;animation-name:swing}@-webkit-keyframes wobble{0%{-webkit-transform:translateX(0%)}15%{-webkit-transform:translateX(-15%) rotate(-4deg)}30%{-webkit-transform:translateX(12%) rotate(3deg)}45%{-webkit-transform:translateX(-9%) rotate(-2deg)}60%{-webkit-transform:translateX(6%) rotate(2deg)}75%{-webkit-transform:translateX(-3%) rotate(-1deg)}100%{-webkit-transform:translateX(0%)}}@-moz-keyframes wobble{0%{-moz-transform:translateX(0%)}15%{-moz-transform:translateX(-15%) rotate(-5deg)}30%{-moz-transform:translateX(12%) rotate(3deg)}45%{-moz-transform:translateX(-9%) rotate(-3deg)}60%{-moz-transform:translateX(6%) rotate(2deg)}75%{-moz-transform:translateX(-3%) rotate(-1deg)}100%{-moz-transform:translateX(0%)}}@-o-keyframes wobble{0%{-o-transform:translateX(0%)}15%{-o-transform:translateX(-15%) rotate(-5deg)}30%{-o-transform:translateX(12%) rotate(3deg)}45%{-o-transform:translateX(-9%) rotate(-3deg)}60%{-o-transform:translateX(6%) rotate(2deg)}75%{-o-transform:translateX(-3%) rotate(-1deg)}100%{-o-transform:translateX(0%)}}@keyframes wobble{0%{transform:translateX(0%)}15%{transform:translateX(-15%) rotate(-5deg)}30%{transform:translateX(12%) rotate(3deg)}45%{transform:translateX(-9%) rotate(-3deg)}60%{transform:translateX(6%) rotate(2deg)}75%{transform:translateX(-3%) rotate(-1deg)}100%{transform:translateX(0%)}}.wobble,.im_first{-webkit-animation-name:wobble;-moz-animation-name:wobble;-o-animation-name:wobble;animation-name:wobble}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1)}50%{-webkit-transform:scale(1.1)}100%{-webkit-transform:scale(1)}}@-moz-keyframes pulse{0%{-moz-transform:scale(1)}50%{-moz-transform:scale(1.1)}100%{-moz-transform:scale(1)}}@-o-keyframes pulse{0%{-o-transform:scale(1)}50%{-o-transform:scale(1.1)}100%{-o-transform:scale(1)}}@keyframes pulse{0%{transform:scale(1)}50%{transform:scale(1.1)}100%{transform:scale(1)}}.pulse,.im_blown{-webkit-animation-name:pulse;-moz-animation-name:pulse;-o-animation-name:pulse;animation-name:pulse}@-webkit-keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.3)}50%{opacity:1;-webkit-transform:scale(1.05)}70%{-webkit-transform:scale(.9)}100%{-webkit-transform:scale(1)}}@-moz-keyframes bounceIn{0%{opacity:0;-moz-transform:scale(.3)}50%{opacity:1;-moz-transform:scale(1.05)}70%{-moz-transform:scale(.9)}100%{-moz-transform:scale(1)}}@-o-keyframes bounceIn{0%{opacity:0;-o-transform:scale(.3)}50%{opacity:1;-o-transform:scale(1.05)}70%{-o-transform:scale(.9)}100%{-o-transform:scale(1)}}@keyframes bounceIn{0%{opacity:0;transform:scale(.3)}50%{opacity:1;transform:scale(1.05)}70%{transform:scale(.9)}100%{transform:scale(1)}}.bounceIn,.im_trippin{-webkit-animation-name:bounceIn;-moz-animation-name:bounceIn;-o-animation-name:bounceIn;animation-name:bounceIn}
*/
以上 css 代码保存为 hi.css 上传到网站即可,然后记住这个 css 文件的 http 路径,后面的 js 中需要填写。
②、主 JS 代码:
function hig(){(function(){function c(){ $(".mw_added_css").remove();var e=document.createElement("link");e.setAttribute("type","text/css");e.setAttribute("rel","stylesheet");e.setAttribute("href",f);e.setAttribute("class",l);document.body.appendChild(e)}function h(){var e=document.getElementsByClassName(l);for(var t=0;t<e.length;t++){document.body.removeChild(e[t])}}function p(){var e=document.createElement("div");e.setAttribute("class",a);document.body.appendChild(e);setTimeout(function(){document.body.removeChild(e)},100)}function d(e){return{height:e.offsetHeight,width:e.offsetWidth}}function v(i){var s=d(i);return s.height>e&&s.height<n&&s.width>t&&s.width<r}function m(e){var t=e;var n=0;while(!!t){n+=t.offsetTop;t=t.offsetParent}return n}function g(){var e=document.documentElement;if(!!window.innerWidth){return window.innerHeight}else if(e&&!isNaN(e.clientHeight)){return e.clientHeight}return 0}function y(){if(window.pageYOffset){return window.pageYOffset}return Math.max(document.documentElement.scrollTop,document.body.scrollTop)}function E(e){var t=m(e);return t>=w&&t<=b+w}function S(){$("audio").remove();var e=document.createElement("audio");e.setAttribute("class",l);e.src=i;e.loop=false;e.addEventListener("canplay",function(){setTimeout(function(){x(k)},500);setTimeout(function(){N();p();for(var e=0;e<O.length;e++){T(O[e])}},5000)},true);e.addEventListener("ended",function(){N();h()},true);e.innerHTML=" <p>如果你正在读这篇文章,那是因为你的浏览器不支持音频元素。我们建议你得到一个新的浏览器。</p> <p>";document.body.appendChild(e);e.play()}function x(e){e.className+=" "+s+" "+o}function T(e){e.className+=" "+s+" "+u[Math.floor(Math.random()*u.length)]}function N(){var e=document.getElementsByClassName(s);var t=new RegExp("\\b"+s+"\\b");for(var n=0;n<e.length;){e[n].className=e[n].className.replace(t,"")}}var e=30;var t=30;var n=350;var r=350;var i=CrazyMusic[Math.floor(Math.random()*Number(CrazyMusic.length))];var f=hicss;var s="mw-harlem_shake_me";var o="im_first";var u=["im_drunk","im_baked","im_trippin","im_blown"];var a="mw-strobe_light";var l="mw_added_css";var b=g();var w=y();var C=document.getElementsByTagName("*");var k=null;for(var L=0;L<C.length;L++){var A=C[L];if(v(A)){if(E(A)){k=A;break}}}if(A===null){return}c();S();var O=[];for(var L=0;L<C.length;L++){var A=C[L];if(v(A)){O.push(A)}}})()};function stopCrazy(){ $("audio").remove();$(".mw_added_css").remove()}
将以上 js 代码保存为 crazy.js 或直接添加到网站的其他全局 js 文件中均可。如果想改回 15.5s 的延迟,只需要在上述代码中搜索 5000,然后改回 15500 即可。
最新补充:发现很多朋友不知道引入 js 是干嘛,有的甚至完全忘记上面这个引入主要 js 的步骤,再次说明下,将上述 js 代码保存为 crazy.js,然后上传到主题根目录,最后在主题目录下的 header.php 或 footer.php 中添加如下代码即可:
<script type='text/javascript' src='<?php echo get_template_directory_uri(); ?>/crazy.js'></script>
不是 WordPress 主题的,可以自行上传到网站任意目录,然后如上引入到网站页面当中即可,要注意下文件的路径。
③、页面 JS 代码
<script type="text/javascript">
/* 定义hi.css */
var hicss="此处请填写hi.css的地址,比如http://zhangge.net/hi.css";
/* 定义歌曲数组 */
var CrazyMusic=[
"歌曲地址一",
"歌曲地址二",
"歌曲地址三",
"歌曲地址四"
/* 更多歌曲,请按照如上格式添加,英文逗号隔开,添加完后记得删除中文占位,比如只添加了一个歌曲地址,那么其他【歌曲地址二、三、四、。。。】和多余逗号都删除掉!!!*/
];
/* 监听到ESC或鼠标双击动作,将停止所有效果 */
function KeyMonitor() {
if (event.keyCode == 27) {stopCrazy()};
}
$(document).bind("dblclick",stopCrazy);
$(document).bind("onkeydown ",KeyMonitor);
</script>
i. 将第一步中的得到 hi.css 地址填写到代码中;
ii. 将你喜欢的歌曲上传到网站或七牛空间,然后将歌曲的 http 地址替换上述代码的【歌曲地址】即可。
Ps:将这个 JS 代码添加到网站任意位置均可,比如 footer 或 head,不启动功能时,并不会加载文件,请放心添加!
④、触发按钮
部署完疯癫功能之后,咱们还需要添加一个启动按钮,启动代码示例如下:
<a title="亲,点我放松一下吧~!(单击启动,双击或ESC停止)" id="hig" href="javascript:void(0);" onclick="hig();" ondblclick="location.reload(true);">点我嗨一下</a>
将以上代码添加到网站的合适位置即可,样式可以进一步 DIY 一下,比如张戈博客是弄了一个图片启动按钮,放到了网站右下角的滚动条的右侧。
为了方便部署,张戈特意打包了所有代码和文件,不过要记得修改代码中的 CSS 和歌曲地址哦!
好了,这个功能就分享到这,顺便偷偷说一声,这个功能应该适用任何建站程序,符合 html 协议即可,一般人我还不告诉他!