Делаем аудио плеер с помощью jQuery и jPlayer

14-02-11 Html, JavaScript Audio 16

Раньше, в начале 2000х, возможности воспроизведения аудио или видео контента онлаин, в браузере были сильно ограничены. Сегодня, благодаря новым возможностям HTML5 и тегу <audio> мы можем сами создавать аудио и видео плееры без каких-либо ограничений. Чем и займемся в этой статье 🙂

Что нам понадобится

Перед тем как начать, необходимо подготовить несколько вещей, которые нам понадобятся для создания аудио плеера: jQuery, плагин jPlayer и шрифт FontAwesome.

jPlayer — это jQuery плгин, который позволяет проигрывать аудио и видео контент прямо на странице в браузере. Для стилизации нашего плеера будем использовать иконки FontAwesome.

Как только все необходимые инструменты будут готовы — подключим их к нашей странице:

<link rel="stylesheet" href="css/normalize.css">
<link type="text/css" href="css/style.css" rel="stylesheet" />
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/jquery.jplayer.min.js"></script>

Как видите помимо библиотек jQuery и jPlayer, мы указали еще два CSS файла. Первый — normalize.css будет сбрасывать дефолтные стили браузеров для более лучшего отображения плеера, второй — style.css содержит стили для плеера.

HTML разметка

Пришло время заняться HTML разметкой для нашего веб плеера. Важным моментом в разметке является элемент с id=jquery_jplayer_1. Позже этот id мы передадим плагину jPlayer с помощью jQuery.

Кроме того, все CSS классы в разметке, включая jp-playjp-pausejp-mute и jp-unmute — все эти классы — стандартные классы, используемые в jPlayer.

<div id="jquery_jplayer_1" class="jp-jplayer"></div>

<div id="jp_container_1" class="jp-audio">
  <div class="jp-type-single">

    <div class="jp-title">
      <ul>
        <li>TEDxPhoenix - Kelli Anderson - Disruptive Wonder for a Change</li>
      </ul>
    </div>

    <div class="jp-gui jp-interface">

        <ul class="jp-controls">
          <li><a href="javascript:;" class="jp-play" tabindex="1">&#61515;</a></li>
          <li><a href="javascript:;" class="jp-pause" tabindex="1">&#61516;</a></li>
          <li><a href="javascript:;" class="jp-mute" tabindex="1" title="mute">&#61480;</a></li>
          <li><a href="javascript:;" class="jp-unmute" tabindex="1" title="unmute">&#61478;</a></li>
        </ul>

        <div class="jp-progress">
          <div class="jp-seek-bar">
            <div class="jp-play-bar"></div>
          </div>
        </div>

        <div class="jp-time-holder">
          <div class="jp-current-time"></div>
        </div>

        <div class="jp-volume-bar">
          <div class="jp-volume-bar-value"></div>
        </div>

    <div class="jp-no-solution">
      <span>Update Required</span>
      To play the media you will need to either update your browser to a recent version or update your <a href="http://get.adobe.com/flashplayer/" target="_blank">Flash plugin</a>.
    </div>
  </div>
 </div>
</div>

Если взглянуть внимательнее, то вы увидите непонятные символы 🙂 : &#61515;,&#61516;&#61480; и &#61478;. Эти  символы — специальные HTML символы, которые будут использованы для рендера иконок FontAwesome.

Активируем аудио плеер

Теперь, когда разметка готова, осталось только активировать плеер следующим скриптом. В этом скрипте мы укажем файлы для воспроизведения.

$(document).ready(function(){
  $("#jquery_jplayer_1").jPlayer({
    ready: function () {
      $(this).jPlayer("setMedia", {
        mp3: "audio/TEDxPhoenix-KelliAnderson-DisruptiveWonderforaChange.mp3",
        oga: "audio/TEDxPhoenix-KelliAnderson-DisruptiveWonderforaChange.ogg"
      });
    },
    swfPath: "/js",
    supplied: "mp3,oga"
  });
});

После добавления скрипта уже можно воспроизводить музыку и если посмотреть код нашей разметки с помощью инструментов разработчика, можно найти HTML5 тег <audio>, который автоматически генерируется плагином.

HTML5 audio player
HTML5 audio player

Стилизация аудио плеера

Теперь пришло время написать стили для плеера. Начнем с объявления нового шрифта и удаления подчеркивания у ссылок:

@font-face {
    font-family: "FontAwesome";
    src: url("fonts/fontawesome-webfont.eot");
    src: url("fonts/fontawesome-webfont.eot?#iefix") format("eot"),
    	 url("fonts/fontawesome-webfont.woff") format("woff"),
    	 url("fonts/fontawesome-webfont.ttf") format("truetype"),
    	 url("fonts/fontawesome-webfont.svg#FontAwesome") format("svg");
    font-weight: 400;
    font-style: normal;
}
a {
    text-decoration: none;
}
.jp-jplayer,.jp-audio {
    width: 420px;
    margin: 50px auto;
}

Название песни

Мы не будем сильно изменять эту часть стандартных стилей, т.к. они отвечают лишь за отображения текущей записи. Мы только сделаем текст меньше и сделаем его серым.

.jp-title {
    font-size: 12px;
    text-align: center;
    color: #999;
}

.jp-title ul {
    padding: 0;
    margin: 0;
    list-style: none;
}

Интерфейс плеера

Интерфейс плеера содержится в div'е с классом jp-gui. Как будет выглядеть плеер, вы можете увидеть на скриншоте выше. В качестве фона будет градиент с цветами: #f34927, и #dd3311. Также важно, чтобы свойство position было установлено в relative.

.jp-gui {
	position: relative;
	background: #f34927;
	background: -moz-linear-gradient(top,  #f34927 0%, #dd3311 100%);
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f34927), color-stop(100%,#dd3311));
	background: -webkit-linear-gradient(top,  #f34927 0%,#dd3311 100%);
	background: -o-linear-gradient(top,  #f34927 0%,#dd3311 100%);
	background: -ms-linear-gradient(top,  #f34927 0%,#dd3311 100%);
	background: linear-gradient(to bottom,  #f34927 0%,#dd3311 100%);
	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f34927', endColorstr='#dd3311',GradientType=0 );
	-webkit-box-shadow:  0px 1px 1px 0px rgba(0, 0, 0, .1);
    box-shadow:  0px 1px 1px 0px rgba(0, 0, 0, .1);
    border-radius: 3px;
	overflow: hidden;
	margin-top: 10px;
}

Контроллеры

Интерфейс плеера содержит контроллеры для управления воспроизведением, например, кнопки запуска, паузы и громкости. Все, что мы сделаем — это установим свойство font-family равным FontAwesome, сделаем цвет текста белым и добавим теней.

.jp-controls {
    padding: 0;
    margin: 0;
    list-style: none;
    font-family: "FontAwesome";
    text-shadow: 1px 1px 0 rgba(0,0,0,0.3);
}

.jp-controls li {
    display: inline;
}

.jp-controls a {
    color: #fff;
}

Кнопки воспроизведения и паузы

Кнопки воспроизведения и паузы мы позиционируем абсолютно, именно поэтому класс .jp-gui мы ранее спозиционировали относительно. Поэтому позиция кнопок будет вычисляться относительно родительского элемента, а не окна браузера.

.jp-play,.jp-pause {
    width: 60px;
    height: 40px;
    display: inline-block;
    text-align: center;
    line-height: 43px;
    border-right: 1px solid #d22f0f;
}

.jp-controls .jp-play:hover,.jp-controls .jp-pause:hover {
    background-color: #de3918;
}

.jp-mute,.jp-unmute {
    position: absolute;
    right: 55px;
    top: 0;
    width: 20px;
    height: 40px;
    display: inline-block;
    line-height: 46px;
}

.jp-mute {
    text-align: left;
}
.jp-time-holder {
    color: #FFF;
    font-size: 12px;
    line-height: 14px;
    position: absolute;
    right: 90px;
    top: 14px;
    text-shadow: 1px 1px 0 rgba(0,0,0,0.3);
}

Процесс воспроизведения и ползунок громкости

Оба элемента будут выглядеть как прогрессбары, только тот, который отображает процесс воспроизведения музыки будет больше, чем регулятор громкости.

.jp-progress {
    background-color: #992E18;
    border-radius: 20px 20px 20px 20px;
    overflow: hidden;
    position: absolute;
    right: 133px;
    top: 15px;
    width: 210px;
    -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,0.2) inset;
    box-shadow: 0 1px 1px 0 rgba(0,0,0,0.2) inset;
}

.jp-play-bar {
    height: 12px;
    background-color: #fff;
    border-radius: 20px 20px 20px 20px;
}

.jp-volume-bar {
    position: absolute;
    right: 10px;
    top: 17px;
    width: 45px;
    height: 8px;
    border-radius: 20px 20px 20px 20px;
    -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1) inset;
    box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1) inset;
    background-color: #992E18;
    overflow: hidden;
}

.jp-volume-bar-value {
    background-color: #fff;
    height: 8px;
    border-radius: 20px 20px 20px 20px;
}

Готово! Результат вы можете посмотреть на демо странице и в исходниках.

Хочешь получать статьи на почту?

Подпишись на обновления!
* Ваш email не будет разглашен/продан. Вы сможете отписаться в любое время.

16 Комментариев

  1. British:

    Доброго времени суток!
    Скажите пожалуйста, возможно ли добавить на одну страницу два и более таких плеера, но с разными mp3?

    1. root:

      Здравствуйте!
      Для нескольких плееров JavaScript код будет немного другой: надо будет использовать событие $.jPlayer.event.play для того чтобы плееры не пели хором 🙂

      
      $(document).ready(function(){
      	$("#jquery_jplayer_1").jPlayer({
      		ready: function () {
      		  $(this).jPlayer("setMedia", {
      			mp3: "audio/TEDxPhoenix-KelliAnderson-DisruptiveWonderforaChange.mp3",
      			oga: "audio/TEDxPhoenix-KelliAnderson-DisruptiveWonderforaChange.ogg"
      		  });
      		},
      		swfPath: "/js",
      		supplied: "mp3,oga",
      		play: function() { // Останавливаем остальные
      			$(this).jPlayer("pauseOthers");
      		},
      		wmode: "window",
      		smoothPlayBar: true,
      		keyEnabled: true
      	});
      
      	$("#jquery_jplayer_2").jPlayer({
      		ready: function () {
      		  $(this).jPlayer("setMedia", {
      			mp3: "audio/TEDxPhoenix-KelliAnderson-DisruptiveWonderforaChange.mp3",
      			oga: "audio/TEDxPhoenix-KelliAnderson-DisruptiveWonderforaChange.ogg"
      		  });
      		},
      		swfPath: "/js",
      		supplied: "mp3,oga",
      		play: function() { // Останавливаем остальные
      			$(this).jPlayer("pauseOthers");
      		},
      		cssSelectorAncestor: "#jp_container_2",
      		wmode: "window",
      		smoothPlayBar: true,
      		keyEnabled: true
      	});
      });
      

      Соответственно в разметке надо расставить id jquery_jplayer_1, jp_container_1; jquery_jplayer_2, jp_container_2 и т.д.
      Разметка для каждого плеера одинаковая.

      1. British:

        Огромное спасибо за ответ! У меня так и получилось, что они хором пели))

      2. Владимир:

        Большое спасибо, очень долго искал пример такого кода

  2. British:

    Попробовал этот скрипт. Всё равно хором почему-то поют 🙁

      1. British:

        Теперь работает, спасибо)) Хотя делал всё также вроде) Не знаю в чем было у меня дело

  3. max:

    Если не трудно, подскажите пожалуйста, куда и что мне поставить в этом коде, чтобы остальные плееры останавливались. Перепробовал, ничего не помогает. Таких плееров 5 штук на сайте.

    РОЛЬФ

    document.getElementById("mybtn2").onclick = function()
    {
        var myaudio2 = document.getElementById("myaudio2");
        if (myaudio2.paused == true)
        {
            document.getElementById("myaudio2").volume = "0.5";
            document.getElementById("myaudio2").play();
            this.style.backgroundImage = 'url(images/Null_but2.gif)';
            this.style.color = "White";
        }
        else if (myaudio2.paused == false)
        {
            document.getElementById("myaudio2").pause();
            this.style.backgroundImage = 'url(images/Null_but.gif)';
            this.style.color = "White";
        }
    } 
    

    Буду вам ооочень признателен

  4. Server:

    А вы не поможете с примером, для того чтобы не писать 10 разных скриптов для каждой песни, а один скрипт для всех. Чтобы песня передавалась через переменную.

  5. Oliver:

    Привет, перепробовал много плееров на html5, но ни один не заработал, так как нужно, а конкретно требуется следующее:
    Плеер будет стоять на сайте интернет-радио. Т.е. воспроизводит аудио поток. Сейчас плеер при нажатии на паузу останавливается и если через некоторое время нажать «плей», то воспроизведение начинается с того места, на котором нажали паузу.
    А как сделать так, чтобы после паузы, плеер не продолжал воспроизведение, а подключился к потоку и начал играть то, что вещает сервер в данный момент.

    1. egor:

      Здравствуй если можешь поделись информацией как ты сделал кнопку а то я в программировании не силен у меня тоже такая задача стоит сделать интернет радио там все просто нужно сделать кнопку которая при нажатии будет подхватывать поток и воспроизводить радио, а при повторном нажатии что бы была пауза.

  6. Glorymirrorq:

    А как сбросить трек в начало? Игра/пауза понятно, а как через яваскрипт трек в начало перемотать?

    1. root:

      Здравствуйте!
      Чтобы перемотать в начало можно использовать следующую конструкцию:

      $("#jp-replay").click(function(){
          // второй аргумент - прогресс в процентах
          $("#jquery_jplayer_1").jPlayer("playHead", 0);
      });
      
      <a href="javascript:;" id="jp-replay" title="replay">replay</a>
      
  7. Влад:

    Добрый день, можно ли в этом плеере задать несколько песен, чтобы они играли одна за другой? Или только по одной возможно?

  8. Дмирий:

    Добрый день!
    Столкнулся с проблемой: на iphone/ipad не отображается уровень громкости (при повторной перезагрузке сразу есть, и потом пропадает, когда страница загрузилась)
    Что это может быть? подскажите

  9. tlustenko:

    Ставлю плеер на mp3-сайт как предварительную прослушку. Там на странице 50 песен. Как внедрить php-код в js чтобы отрабатывался цикл такого типа: song.php?id=%s ?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *