Skip to content

Instantly share code, notes, and snippets.

@ny0m
Last active December 15, 2017 16:58
Show Gist options
  • Save ny0m/5723736 to your computer and use it in GitHub Desktop.
Save ny0m/5723736 to your computer and use it in GitHub Desktop.
A snippet to make jPlayer volume bar draggable.
$('.jp-volume-bar').mousedown(function() {
var parentOffset = $(this).offset(),
width = $(this).width();
$(window).mousemove(function(e) {
var x = e.pageX - parentOffset.left,
volume = x/width
if (volume > 1) {
$("#JPID").jPlayer("volume", 1);
} else if (volume <= 0) {
$("#JPID").jPlayer("mute");
} else {
$("#JPID").jPlayer("volume", volume);
$("#JPID").jPlayer("unmute");
}
});
return false;
})
.mouseup(function() {
$(window).unbind("mousemove");
});
@redfellow
Copy link

This is what I ended up with after finding the snippet. Mouseup on the actual volume bar will never fire if the user drags his mouse outside of the volume bar element, so we bind the mouseup on document level instead.

Overdragging also means the default jplayer volume event never fires so I added a volume callback there and got rid of the mute parts that were kinda redundant.

I also added code to update the actual value of the volume bar during the drag, so the user can see the volume slider move during the drag.

$('.jp-volume-bar').mousedown(function() {
        var parentOffset = $(this).offset(),
        width = $(this).width();
        $(window).mousemove(function(e) {
            var x = e.pageX - parentOffset.left,
            volume = x/width
            var barValue = Math.floor(volume*100);
            if (barValue < 0 ) barValue = 0;
            if (barValue > 100) barValue = 100;
            jQuery(".jp-volume-bar-value").css("width", barValue + "%");
            $("#player").jPlayer("volume", volume);
        });

        return false;
    })
    $(document).on("mouseup", function() {
        $(window).unbind("mousemove");
    });

@caferelgin
Copy link

caferelgin commented Apr 11, 2017

same can be applied to seek bar as well with small changes;

  $('.jp-seek-bar').mousedown(function() {
    var parentOffset = $(this).offset(),
    width = $(this).width();
    $(window).mousemove(function(e) {
      var x = e.pageX - parentOffset.left,
      currentPosition = x/width
      var barValue = Math.floor(currentPosition*100);
      if (barValue < 0 ) barValue = 0;
      if (barValue > 100) barValue = 100;
      $(".jp-play-bar").css("width", barValue + "%");
    });
    return false;
  })
  $(document).on("mouseup", function() {
    $(window).unbind("mousemove");
  });

Copy link

ghost commented Nov 23, 2017

Cafer, that code for the seek bar is great, but it glitches between the scrub position and the current playing position if the media is playing. Any thoughts on how to stop that? I tried to make the playBar update process pause by adding a global 'isScrubbing' boolean variable, but no success so far.

@Rabotyahoff
Copy link

JohnnyOutdoors, replace
$(".jp-play-bar").css("width", barValue + "%");
to
$("#player").jPlayer( "playHead", barValue );

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment