Как сделать так, чтобы маркер js был скользящим или подвижным - PullRequest
7 голосов
/ 21 февраля 2020

Я хочу переместить мой markers всякий раз, когда он скользит вместе с поиском. Я ожидаю, что мои маркеры будут точно slidable как jqueryui-slider

Вопрос: Я хочу, чтобы мои markers (оба) были такими же скользкими, как jqueryui-range ползунок, как показано под видео в следующем примере:

var player = videojs('example_video_1');

function markplayer(){
var inTimeOutTimeList = [6.333,27.667];
        for(var i = 0; i < inTimeOutTimeList.length; i++){
            player.markers.add([{
            time: inTimeOutTimeList[i],
            text: inTimeOutTimeList[i]
        }]);

        var icon = (i == 0) ? '[' : ']';
        $(".vjs-marker[data-marker-time='"+inTimeOutTimeList[i]+"']").html(icon);
    }
};

player.markers({
   breakOverlay:{
      display: true,
      displayTime: 120,
      style:{
         'width':'100%',
         'height': '30%',
         'background-color': 'rgba(10,10,10,0.6)',
         'color': 'white',
         'font-size': '16px'
      }
   },
   markers: [
      {time:10, startTime:10, endTime:60, text: "this", overlayText: "1", class: "special-blue"},
   ]
});

setTimeout(function(){
 markplayer();    
},2000);

 $( "#slider-range" ).slider({
      range: true,
      min: 0,
      max: 500,
      values: [ 75, 300 ],
      slide: function( event, ui ) {
        $( "#amount" ).val( "$" + ui.values[ 0 ] + " - $" + ui.values[ 1 ] );
      }
    });
.vjs-fluid {
            overflow: hidden;
         }
         #example_video_1 .vjs-control-bar {
            display: block;
         }
         #example_video_1 .vjs-progress-control {
               bottom: 28px;
               left: 0;
               height: 10px;
               width: 100%;
         }
         
    .vjs-default-skin.vjs-has-started .vjs-control-bar {
            display: block !important;
            visibility: visible !important;
            opacity: 1 !important;
         }

.vjs-marker {
            background-color: transparent !important;
            height: 20px !important;
            font-size: 20px !important;
            color: red !important;
            font-weight: bold;
      }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="http://vjs.zencdn.net/4.2/video.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/videojs-markers/0.7.0/videojs-markers.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<link href="http://vjs.zencdn.net/4.2/video-js.css" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/videojs-markers/0.7.0/videojs.markers.min.css" rel="stylesheet"/>

<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css" rel="stylesheet"/>



<video id="example_video_1" width="400" height="210" controls class="video-js vjs-default-skin" data-setup='{ "inactivityTimeout": 0 }'>
   <source src="http://vjs.zencdn.net/v/oceans.mp4" type="video/mp4">
   <source src="http://vjs.zencdn.net/v/oceans.webm" type="video/webm">
</video>


<p><b>I want both of my red markers to be movable/slidable like below slider</b></p>


<div id="slider-range"></div>

Пожалуйста, помогите мне заранее спасибо !!!

Ответы [ 3 ]

5 голосов
/ 23 февраля 2020

Во-первых, сделайте ваши маркеры перетаскиваемыми, используя jQuery встроенный метод пользовательского интерфейса.

$('body').on('mousedown', '.vjs-marker', function(e) {
    $(e.target).draggable({
      axis: 'x',
      containment: '.vjs-progress-control',
    });
}).on('mouseup', function(e) {
    $('.vjs-marker').css('top','-8px');   
});

Так как маркер хочет подняться к верхнему краю индикатора выполнения, я дал ему top: -8px mouseup.

Затем добавьте метод onMarkerClick к вашему вызову player.markers(), чтобы обновить время.

onMarkerClick: function(marker) {    
    marker.time = player.currentTime();
    player.markers.updateTime();
},

И я заметил, что вы добавляете пустой маркер в 10 секунд, поэтому я заменил это пустым массивом.

markers: []

Наконец, я добавил несколько кнопок Prev и Next, чтобы вы могли видеть, что маркеры работают после скольжения.

Редактировать:

Посмотрев на ответ Маамуна Отмана , я понял, что в моем решении чего-то не хватает. В отличие от примера ползунка диапазона, мои маркеры могли пересекаться друг с другом.

Поэтому я использовал свойство drag объекта draggable, чтобы ограничить диапазон маркеров.

...    
drag: function( e, ui ) {        
  if ( $(e.target).index('.vjs-marker') === 0 ) {
    const outPosition = parseInt( $('.vjs-slider .vjs-marker:eq(1)').css('left') );          
    ui.position.left = Math.min( outPosition, ui.position.left );
  }
  else {
    const inPosition = parseInt( $('.vjs-slider .vjs-marker:eq(0)').css('left') );
    ui.position.left = Math.max( inPosition, ui.position.left );        
  }                
}
...

var player = videojs('example_video_1');

function markplayer() {
  var inTimeOutTimeList = [1.2, 4.2];
  var labelList = ['In Point', 'Out Point'];
  for (var i = 0; i < inTimeOutTimeList.length; i++) {
    player.markers.add([{
      time: inTimeOutTimeList[i],
      text: labelList[i]
    }]);

    var icon = (i == 0) ? '[' : ']';
    $(".vjs-marker[data-marker-time='" + inTimeOutTimeList[i] + "']").html(icon);
  }
};

player.markers({
  breakOverlay: {
    display: true,
    displayTime: 120,
    style: {
      'width': '100%',
      'height': '30%',
      'background-color': 'rgba(10,10,10,0.6)',
      'color': 'white',
      'font-size': '16px'
    }
  },
  onMarkerClick: function(marker, index) {
    marker.time = player.currentTime();
    player.markers.updateTime();
  },
  markers: []
});

setTimeout(function() {
  markplayer();
}, 2000);

$(function() {
  $('body').on('mousedown', '.vjs-marker', function(e) {
    $(e.target).draggable({
      axis: 'x',
      containment: '.vjs-progress-control',
      drag: function(e, ui) {
        if ($(e.target).index('.vjs-marker') === 0) {
          const outPosition = parseInt( $('.vjs-slider .vjs-marker:eq(1)').css('left') );
          ui.position.left = Math.min(outPosition, ui.position.left);
        } else {
          const inPosition = parseInt( $('.vjs-slider .vjs-marker:eq(0)').css('left') );
          ui.position.left = Math.max(inPosition, ui.position.left);
        }
      }
    });
  }).on('mouseup', function(e) {
    $('.vjs-marker').css('top', '-8px');
  });

  $("#prev").click(function() {
    player.markers.prev();
  });
  $("#next").click(function() {
    player.markers.next();
  });
});
body {
  text-align: center;
}

#example_video_1 {
  margin: auto;
}

#buttons {
  margin-top: 1em;
}

.vjs-fluid {
  overflow: hidden;
}

#example_video_1 .vjs-control-bar {
  display: block;
}

#example_video_1 .vjs-progress-control {
  bottom: 28px;
  left: 0;
  height: 10px;
  width: 100%;
}

.vjs-default-skin.vjs-has-started .vjs-control-bar {
  display: block !important;
  visibility: visible !important;
  opacity: 1 !important;
}

.vjs-marker {
  background-color: transparent !important;
  height: 20px !important;
  font-size: 20px !important;
  color: red !important;
  font-weight: bold;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://vjs.zencdn.net/4.2/video.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/videojs-markers/0.7.0/videojs-markers.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<link href="https://vjs.zencdn.net/4.2/video-js.css" rel="stylesheet" />
<link href="https://cdnjs.cloudflare.com/ajax/libs/videojs-markers/0.7.0/videojs.markers.min.css" rel="stylesheet" />
<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css" rel="stylesheet" />

<video id="example_video_1" width="400" height="210" controls class="video-js vjs-default-skin" data-setup='{ "inactivityTimeout": 0 }'>
	   <source src="https://interactive-examples.mdn.mozilla.net/media/examples/flower.mp4" type="video/mp4">
	   <source src="https://interactive-examples.mdn.mozilla.net/media/examples/flower.webm" type="video/webm">
	</video>

<div id="buttons">
  <button id="prev">Previous</button> | <button id="next">Next</button>
</div>
4 голосов
/ 27 февраля 2020

Я просто добавил несколько строк в slide событие, которое вы имели до этого, и использовал .values() из этого события, чтобы получить начальное и конечное значение, затем сделал marker.reset () , чтобы добавить новые маркеры

...
slide: function twsr(event, ui) {
  // $( "#amount" ).val( "$" + ui.values[ 0 ] + " - $" + ui.values[ 1 ] );
  player.markers.reset([
    {
      time: ui.values[0],
      text: "this",
      overlayText: "1",
      class: "special-blue"
    },
    {
      time: ui.values[1],
      text: "this",
      overlayText: "1",
      class: "special-blue"
    }
  ]);
  for (var i = 0; i < ui.values.length; i++) {
    var icon = i == 0 ? "[" : "]";
    $(".vjs-marker[data-marker-time='" + ui.values[i] + "']").html(icon);
  }
}
...

Примечание: мне не очень нравится setTimeOut, и я проверю это позже, или у меня будет время обновить его.

И если я получу Ваш вопрос правильно, это реализация, которую вы ищете, рабочий фрагмент :

$(document).ready(function() {
  var player = videojs("example_video_1");

  function markplayer() {
    $("#slider-range").slider({
      range: true,
      min: 0,
      max: player.duration(),
      values: [6.333, 27.667],
      slide: function(event, ui) {
        // $( "#amount" ).val( "$" + ui.values[ 0 ] + " - $" + ui.values[ 1 ] );
        player.markers.reset([
          {
            time: ui.values[0],
            text: "this",
            overlayText: "1",
            class: "special-blue"
          },
          {
            time: ui.values[1],
            text: "this",
            overlayText: "1",
            class: "special-blue"
          }
        ]);
        for (var i = 0; i < ui.values.length; i++) {
          var icon = i == 0 ? "[" : "]";
          $(".vjs-marker[data-marker-time='" + ui.values[i] + "']").html(icon);
        }
      }
    });

    var inTimeOutTimeList = [6.333, 27.667];
    for (var i = 0; i < inTimeOutTimeList.length; i++) {
      player.markers.add([
        {
          time: inTimeOutTimeList[i],
          text: inTimeOutTimeList[i]
        }
      ]);

      var icon = i == 0 ? "[" : "]";
      $(".vjs-marker[data-marker-time='" + inTimeOutTimeList[i] + "']").html(
        icon
      );
    }
  }

  player.markers({
    breakOverlay: {
      display: true,
      displayTime: player.duration(),
      style: {
        width: "100%",
        height: "30%",
        "background-color": "rgba(10,10,10,0.6)",
        color: "white",
        "font-size": "16px"
      }
    },
    markers: [
      {
        time: 10,
        startTime: 10,
        endTime: 60,
        text: "this",
        overlayText: "1",
        class: "special-blue"
      }
    ]
  });

  setTimeout(function() {
    markplayer();
  }, 100);
});
.vjs-fluid {
  overflow: hidden;
}
#example_video_1 .vjs-control-bar {
  display: block;
}
#example_video_1 .vjs-progress-control {
  bottom: 28px;
  left: 0;
  height: 10px;
  width: 100%;
}

.vjs-default-skin.vjs-has-started .vjs-control-bar {
  display: block !important;
  visibility: visible !important;
  opacity: 1 !important;
}

.vjs-marker {
  background-color: transparent !important;
  height: 20px !important;
  font-size: 20px !important;
  color: red !important;
  font-weight: bold;
}
<!doctype html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link href="https://vjs.zencdn.net/4.2/video-js.css" rel="stylesheet" />
    <link href="https://cdnjs.cloudflare.com/ajax/libs/videojs-markers/0.7.0/videojs.markers.min.css" rel="stylesheet" />

    <link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css" rel="stylesheet" />
    <style>

    </style>

</head>

<body>
    <video id="example_video_1" width="400" height="210" controls class="video-js vjs-default-skin" data-setup='{ "inactivityTimeout": 0 }'>
        <source src="http://vjs.zencdn.net/v/oceans.mp4" type="video/mp4">
        <source src="http://vjs.zencdn.net/v/oceans.webm" type="video/webm">
    </video>

    <p><b>I want both of my red markers to be movable/slidable like below slider</b></p>

    <div id="slider-range"></div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://vjs.zencdn.net/4.2/video.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/videojs-markers/0.7.0/videojs-markers.js"></script>
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
    <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

</body>

</html>
2 голосов
/ 28 февраля 2020

Мне очень понравился Ответ Ма'муна Отмана , поэтому я решил настроить его так, чтобы он соответствовал требованиям вопроса.

Я просто переместил ползунок диапазона непосредственно над индикатором выполнения и дал ему opacity: 0;

$(document).ready(function() {
  var player = videojs("example_video_1");

  function markplayer() {
    $("#slider-range").slider({
      range: true,
      min: 0,
      max: player.duration(),
      values: [6.333, 27.667],
      slide: function(event, ui) {
        // $( "#amount" ).val( "$" + ui.values[ 0 ] + " - $" + ui.values[ 1 ] );
        player.markers.reset([{
            time: ui.values[0],
            text: "this",
            overlayText: "1",
            class: "special-blue"
          },
          {
            time: ui.values[1],
            text: "this",
            overlayText: "1",
            class: "special-blue"
          }
        ]);
        for (var i = 0; i < ui.values.length; i++) {
          var icon = i == 0 ? "[" : "]";
          $(".vjs-marker[data-marker-time='" + ui.values[i] + "']").html(icon);
        }
      }
    });

    var inTimeOutTimeList = [6.333, 27.667];
    for (var i = 0; i < inTimeOutTimeList.length; i++) {
      player.markers.add([{
        time: inTimeOutTimeList[i],
        text: inTimeOutTimeList[i]
      }]);

      var icon = i == 0 ? "[" : "]";
      $(".vjs-marker[data-marker-time='" + inTimeOutTimeList[i] + "']").html(
        icon
      );
    }
  }

  player.markers({
    breakOverlay: {
      display: true,
      displayTime: player.duration(),
      style: {
        width: "100%",
        height: "30%",
        "background-color": "rgba(10,10,10,0.6)",
        color: "white",
        "font-size": "16px"
      }
    },
    markers: [{
      time: 10,
      startTime: 10,
      endTime: 60,
      text: "this",
      overlayText: "1",
      class: "special-blue"
    }]
  });

  setTimeout(function() {
    $('#slider-range').appendTo('#example_video_1');
    markplayer();
  }, 100);
});
.vjs-fluid {
  overflow: hidden;
}

#example_video_1 .vjs-control-bar {
  display: block;
}

#example_video_1 .vjs-progress-control {
  bottom: 28px;
  left: 0;
  height: 10px;
  width: 100%;
}

#example_video_1 #slider-range {
  bottom: 29px;
  position: absolute;
  width: 100%;
  z-index: 101;
  opacity: 0;
}

.vjs-default-skin.vjs-has-started .vjs-control-bar {
  display: block !important;
  visibility: visible !important;
  opacity: 1 !important;
}

.vjs-marker {
  background-color: transparent !important;
  height: 20px !important;
  font-size: 20px !important;
  color: red !important;
  font-weight: bold;
}
<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">

  <link href="http://vjs.zencdn.net/4.2/video-js.css" rel="stylesheet" />
  <link href="https://cdnjs.cloudflare.com/ajax/libs/videojs-markers/0.7.0/videojs.markers.min.css" rel="stylesheet" />

  <link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css" rel="stylesheet" />
  <style>

  </style>

</head>

<body>
  <video id="example_video_1" width="400" height="210" controls class="video-js vjs-default-skin" data-setup='{ "inactivityTimeout": 0 }'>
        <source src="http://vjs.zencdn.net/v/oceans.mp4" type="video/mp4">
        <source src="http://vjs.zencdn.net/v/oceans.webm" type="video/webm">
    </video>


  <div id="slider-range"></div>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="http://vjs.zencdn.net/4.2/video.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/videojs-markers/0.7.0/videojs-markers.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

</body>

</html>
...