Wordpress自定义域与HTML5简洁的音乐播放器
Sixianqiu主题,一个简洁、多形式(标准、图像、相册、音乐、视频、引用与链接),专门为四弦秋发表诗集的Wordpress博客主题。对于音乐和视频本来是打算用网易云音乐和优酷视频,而萨龙龙的所有站点都使用https来访问,网易云音乐与优酷视频并不支持https访问,所以就使用本地HTML5音乐与视频播放器。
本文就来介绍下如何打造一款Wordpress简洁HTML5音乐播放器,并通过自定义域来获取音乐的地址。
HTML5代码
添加到需要显示HTML5音乐播放器的地方
- <?php if(get_post_meta($post->ID, "audio", true)) { ?>
- <section class="player">
- <audio preload="auto" controls>
- <source src="<?php $values = get_post_custom_values("audio"); echo $values[0]; ?>">
- </audio>
- </section>
- <?php } ?>
代码中判断了是否有自定义域audio这个值,如果没有就不输出整段代码。
JS代码
添加到主题的JS文件中
- // HTML5播放器
- $(function() {
- $('audio').audioPlayer();
- });
- (function(e, t, n, r) {
- var i = "ontouchstart" in t,
- s = i ? "touchstart" : "mousedown",
- o = i ? "touchmove" : "mousemove",
- u = i ? "touchend" : "mouseup",
- a = i ? "touchcancel" : "mouseup",
- f = function(e) {
- var t = Math.floor(e / 3600),
- n = Math.floor(e % 3600 / 60),
- r = Math.ceil(e % 3600 % 60);
- return (t == 0 ? "" : t > 0 && t.toString().length < 2 ? "0" + t + ":" : t + ":") + (n.toString().length < 2 ? "0" + n : n) + ":" + (r.toString().length < 2 ? "0" + r : r)
- },
- l = function(e) {
- var t = n.createElement("audio");
- return !!(t.canPlayType && t.canPlayType("audio/" + e.split(".").pop().toLowerCase() + ";").replace(/no/, ""))
- };
- e.fn.audioPlayer = function(t) {
- var t = e.extend({
- classPrefix: "audioplayer",
- strPlay: "播放",
- strPause: "暂停",
- strVolume: "音量"
- }, t),
- n = {},
- r = {
- playPause: "playpause",
- playing: "playing",
- time: "time",
- timeCurrent: "time-current",
- timeDuration: "time-duration",
- bar: "bar",
- barLoaded: "bar-loaded",
- barPlayed: "bar-played",
- volume: "volume",
- volumeButton: "volume-button",
- noVolume: "novolume",
- mute: "mute",
- mini: "mini"
- };
- for (var u in r) n[u] = t.classPrefix + "-" + r[u];
- this.each(function() {
- if (e(this).prop("tagName").toLowerCase() != "audio") return false;
- var r = e(this),
- u = r.attr("src"),
- c = r.get(0).getAttribute("autoplay"),
- c = c === "" || c === "autoplay" ? true : false,
- h = r.get(0).getAttribute("loop"),
- h = h === "" || h === "loop" ? true : false,
- p = false;
- if (typeof u === "undefined") {
- r.find("source").each(function() {
- u = e(this).attr("src");
- if (typeof u !== "undefined" && l(u)) {
- p = true;
- return false
- }
- })
- } else if (l(u)) p = true;
- var d = e('<div class="' + t.classPrefix + '">' + (p ? e("<div>").append(r.eq(0).clone()).html() : '<embed src="' + u + '" width="0" height="0" volume="100" autostart="' + c.toString() + '" loop="' + h.toString() + '" />') + '<div class="' + n.playPause + '" title="' + t.strPlay + '"><a href="#">' + t.strPlay + "</a></div></div>"),
- v = p ? d.find("audio") : d.find("embed"),
- v = v.get(0);
- if (p) {
- d.find("audio").css({
- width: 0,
- height: 0,
- visibility: "hidden"
- });
- d.append('<div class="' + n.time + " " + n.timeCurrent + '"></div><div class="' + n.bar + '"><div class="' + n.barLoaded + '"></div><div class="' + n.barPlayed + '"></div></div><div class="' + n.time + " " + n.timeDuration + '"></div><div class="' + n.volume + '"><div class="' + n.volumeButton + '" title="' + t.strVolume + '"><a href="#">' + t.strVolume + '</a></div></div>');
- var m = d.find("." + n.bar),
- g = d.find("." + n.barPlayed),
- y = d.find("." + n.barLoaded),
- b = d.find("." + n.timeCurrent),
- w = d.find("." + n.timeDuration),
- E = d.find("." + n.volumeButton),
- S = d.find("." + n.volumeAdjust + " > div"),
- x = 0,
- T = function(e) {
- theRealEvent = i ? e.originalEvent.touches[0] : e;
- v.currentTime = Math.round(v.duration * (theRealEvent.pageX - m.offset().left) / m.width())
- },
- N = function(e) {
- theRealEvent = i ? e.originalEvent.touches[0] : e;
- v.volume = Math.abs((theRealEvent.pageY - (S.offset().top + S.height())) / S.height())
- },
- C = setInterval(function() {
- y.width(v.buffered.end(0) / v.duration * 100 + "%");
- if (v.buffered.end(0) >= v.duration) clearInterval(C)
- }, 100);
- var k = v.volume,
- L = v.volume = .111;
- if (Math.round(v.volume * 1e3) / 1e3 == L) v.volume = k;
- else d.addClass(n.noVolume);
- w.html("…");
- b.text(f(0));
- v.addEventListener("loadeddata", function() {
- w.text(f(v.duration));
- S.find("div").height(v.volume * 100 + "%");
- x = v.volume
- });
- v.addEventListener("timeupdate", function() {
- b.text(f(v.currentTime));
- g.width(v.currentTime / v.duration * 100 + "%")
- });
- v.addEventListener("volumechange", function() {
- S.find("div").height(v.volume * 100 + "%");
- if (v.volume > 0 && d.hasClass(n.mute)) d.removeClass(n.mute);
- if (v.volume <= 0 && !d.hasClass(n.mute)) d.addClass(n.mute)
- });
- v.addEventListener("ended", function() {
- d.removeClass(n.playing)
- });
- m.on(s, function(e) {
- T(e);
- m.on(o, function(e) {
- T(e)
- })
- }).on(a, function() {
- m.unbind(o)
- });
- E.on("click", function() {
- if (d.hasClass(n.mute)) {
- d.removeClass(n.mute);
- v.volume = x
- } else {
- d.addClass(n.mute);
- x = v.volume;
- v.volume = 0
- }
- return false
- });
- S.on(s, function(e) {
- N(e);
- S.on(o, function(e) {
- N(e)
- })
- }).on(a, function() {
- S.unbind(o)
- })
- } else d.addClass(n.mini);
- if (c) d.addClass(n.playing);
- d.find("." + n.playPause).on("click", function() {
- if (d.hasClass(n.playing)) {
- e(this).attr("title", t.strPlay).find("a").html(t.strPlay);
- d.removeClass(n.playing);
- p ? v.pause() : v.Stop()
- } else {
- e(this).attr("title", t.strPause).find("a").html(t.strPause);
- d.addClass(n.playing);
- p ? v.play() : v.Play()
- }
- return false
- });
- r.replaceWith(d)
- });
- return this
- }
- })(jQuery, window, document)
CSS代码
添加到主题文件的CSS文件中
- /***************HTML5音乐播放器***************/
- .player{
- background-color: #fff;
- border-top: 1px #eee solid;
- border-right: 1px #eee solid;
- border-left: 1px #eee solid;
- padding: 20px;
- }
- .player h3{
- margin: 12px 0 0 8px;
- }
- /*播放按钮*/
- .audioplayer {
- height: 54px;
- width: 100%;
- position: relative;
- z-index: 1;
- background-color: #f8f8f8;
- }
- .audioplayer > div {
- position: absolute;
- }
- .audioplayer-playpause {
- width: 32px;
- height: 32px;
- border-radius: 100%;
- background-color: #447110;
- text-indent: -9999px;
- cursor: pointer;
- z-index: 2;
- top: 10px;
- left: 20px;
- }
- .audioplayer-playpause:hover,
- .audioplayer-playpause:focus {
- background-color: #024e48;
- }
- .audioplayer-playpause a {
- display: block;
- -webkit-transition: none;
- -moz-transition: none;
- -ms-transition: none;
- -o-transition: none;
- transition: none;
- }
- .audioplayer:not(.audioplayer-playing) .audioplayer-playpause a {
- width: 0;
- height: 0;
- border: 6px solid transparent;
- border-right: none;
- border-left-color: #fff;
- content: '';
- position: absolute;
- top: 50%;
- left: 50%;
- margin: -6px 0 0 -2px;
- /* 8 4 */
- ;
- }
- .audioplayer-playing .audioplayer-playpause a {
- width: 9px;
- height: 9px;
- position: absolute;
- top: 50%;
- left: 50%;
- margin: -4px 0 0 -4px;
- /* 6 */
- ;
- }
- .audioplayer-playing .audioplayer-playpause a:before,
- .audioplayer-playing .audioplayer-playpause a:after {
- width: 40%;
- height: 100%;
- background-color: #fff;
- content: '';
- position: absolute;
- top: 0;
- }
- .audioplayer-playing .audioplayer-playpause a:before {
- left: 0;
- }
- .audioplayer-playing .audioplayer-playpause a:after {
- rightright: 0;
- }
- /*时间*/
- .audioplayer-time {
- width: 46px;
- height: 100%;
- line-height: 54px;
- text-align: center;
- z-index: 2;
- top: 0;
- }
- .audioplayer-time-current {
- left: 68px;
- }
- .audioplayer-time-duration {
- rightright: 32px;
- }
- .audioplayer-novolume .audioplayer-time-duration {
- border-right: 0;
- rightright: 0;
- }
- /*播放条*/
- .audioplayer-bar {
- height: 8px;
- /* 14 */
- background-color: #e4e4e4;
- cursor: pointer;
- z-index: 1;
- top: 50%;
- rightright: 6.875em;
- /* 110 */
- left: 120px;
- /* 110 */
- margin-top: -4px;
- /* 7 */
- ;
- }
- .audioplayer-novolume .audioplayer-bar {
- rightright: 4.375em;
- }
- .audioplayer-bar div {
- width: 0;
- height: 100%;
- position: absolute;
- left: 0;
- top: 0;
- }
- .audioplayer-bar-loaded {
- background-color: #e4e4e4;
- z-index: 1;
- }
- .audioplayer-bar-played {
- background: #447110;
- z-index: 2;
- }
- /*音量*/
- .audioplayer-volume {
- width: 36px;
- height: 100%;
- text-align: left;
- text-indent: -9999px;
- cursor: pointer;
- z-index: 2;
- top: 0;
- rightright: 0;
- }
- .audioplayer-volume:hover,
- .audioplayer-volume:focus {
- background-color: #f8f8f8;
- }
- .audioplayer-volume-button {
- width: 100%;
- height: 100%;
- }
- .audioplayer-volume-button a {
- width: 0.313em;
- /* 5 */
- height: 0.375em;
- /* 6 */
- background-color: #447110;
- display: block;
- position: relative;
- z-index: 1;
- top: 50%;
- left: 35%;
- margin-top: -2px;
- }
- .audioplayer-volume-button a:before,
- .audioplayer-volume-button a:after {
- content: '';
- position: absolute;
- }
- .audioplayer-volume-button a:before {
- width: 0;
- height: 0;
- border: 0.5em solid transparent;
- /* 8 */
- border-left: none;
- border-right-color: #447110;
- z-index: 2;
- top: 50%;
- rightright: -0.25em;
- margin-top: -0.5em;
- /* 8 */
- ;
- }
- .audioplayer:not(.audioplayer-mute) .audioplayer-volume-button a:after {
- /* "volume" icon by Nicolas Gallagher, http://nicolasgallagher.com/pure-css-gui-icons */
- width: 0.313em;
- /* 5 */
- height: 0.313em;
- /* 5 */
- border: 0.25em double #447110;
- /* 4 */
- border-width: 0.25em 0.25em 0 0;
- /* 4 */
- left: 0.563em;
- /* 9 */
- top: -0.063em;
- /* 1 */
- -webkit-border-radius: 0 0.938em 0 0;
- /* 15 */
- -moz-border-radius: 0 0.938em 0 0;
- /* 15 */
- border-radius: 0 0.938em 0 0;
- /* 15 */
- -webkit-transform: rotate( 45deg);
- -moz-transform: rotate( 45deg);
- -ms-transform: rotate( 45deg);
- -o-transform: rotate( 45deg);
- transform: rotate( 45deg);
- }
- /***************HTML5音乐播放器end***************/
[successbox]一个简洁的HTML5音乐播放器就设计好了,很方便的集成到Wordpress主题中,你也可以修改其中的代码来匹配自己主题的样式,更详细的说明可以下方第一个按钮。[/successbox][scbutton link="http://tympanus.net/codrops/2012/12/04/responsive-touch-friendly-audio-player/" target="blank" variation="blue"]原文地址(黑色的音乐播放器)[/scbutton][scbutton link="https://sixianqiu.com" target="blank" variation="green"]四弦秋的诗演示(简洁的音乐播放器)[/scbutton]