6

我是 JavaScript/CSS 的新手(基本上是整个 web 开发世界),我真的很难创建以下小部件。我创建了一张我想要制作的图片以使其更清晰。

在此处输入图像描述

播放/暂停和停止按钮已准备就绪。循环复选框是没有问题的。但是进度条很痛苦。这两个标记应该标记文件开始播放和停止的点。进度条也应该是可点击的,所以如果我想访问某个时间点,那么它是可能的。

到目前为止我尝试了什么

jQuery UI 滑块:用于滑动进度条并使用该可拖动滑块访问音频文件中的某个点。工作正常。但是没有标记,看起来真的很丑。不知道怎么改。

<progress>标签:不是很灵活。标记?点击?

<div>标签:似乎没有办法得到我点击的地方。

那么,大家有什么推荐的呢?我应该如何进行?

4

2 回答 2

5

帆布替代品

您可能想使用 acanvas并在其中绘制自己的进度条元素。

以下是一些画布进度条教程:


这样做<progress>

要访问 DOMElement 中的点击位置,您可以继续使用 click 事件的属性:clientXclientY( MDN Source ),如下所示:

HTML

<div class="marker" id="StartMarker">^</div>
<div class="marker" id="StopMarker">^</div>
<progress id="progress" value="0" min="0" max="100">0%</progress>
<form id="choice">
    <button id="marker1">Beginning marker</button>
    <button id="marker2">Ending marker</button>
    <input type="hidden" id="markerValue" value="0" />
</form>

JavaScript(未优化)

document.getElementById('progress').onclick = function (event, element) {
    /* Math.floor((event.offsetX / this.offsetWidth) * 100) */
    var newProgress = event.offsetX;

    document.getElementById('choice').style.display = "block";
    document.getElementById('markerValue').setAttribute('value', newProgress);

    document.getElementById('marker1').onclick = function (event) {
        event.preventDefault();

        var newProgress = document.getElementById('markerValue').value;
        var progressBar = document.getElementById('progress');
        var startMarker = document.getElementById('StartMarker');
        var stopMarker = document.getElementById('StopMarker');

        var marker = startMarker;
        marker.style.display = "block";

        startMarker.style.display = "block";
        startMarker.offsetTop = (progressBar.offsetTop + progressBar.offsetHeight + 2) + "px";
        startMarker.style.left = newProgress + "px";

    };

    document.getElementById('marker2').onclick = function (event) {
        event.preventDefault();

        var newProgress = document.getElementById('markerValue').value;
        var progressBar = document.getElementById('progress');
        var startMarker = document.getElementById('StartMarker');
        var stopMarker = document.getElementById('StopMarker');


        stopMarker.style.display = "block";
        stopMarker.offsetTop = (progressBar.offsetTop + progressBar.offsetHeight + 2) + "px";
        stopMarker.style.left = newProgress + "px";
    };
};

CSS

.marker {
    position:absolute;
    top:24px;
    left:9px;
    display:none;
    z-index:8;
    font-weight:bold;
    text-align:center;
}
#StartMarker {
    color: #CF0;
}
#StopMarker {
    color:#F00;
}
#choice {
    display:none;
}
progress {
    display: inline-block;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    width: 300px;
    height: 20px;
    padding: 3px 3px 2px 3px;
    background: #333;
    background: -webkit-linear-gradient(#2d2d2d, #444);
    background: -moz-linear-gradient(#2d2d2d, #444);
    background: -o-linear-gradient(#2d2d2d, #444);
    background: linear-gradient(#2d2d2d, #444);
    border: 1px solid rgba(0, 0, 0, .5);
    border-radius: 15px;
    box-shadow: 0 1px 0 rgba(255, 255, 255, .2);
}

现场演示

于 2013-07-23T14:09:25.727 回答
2

为此使用简单的块是可能的。您的布局将如下所示(简化):

HTML

<div class="progressbar">
    <div class="bar">
        <div class="progress" style="width: 30%;">
        </div>
    </div>
    <div class="markers">
        <div class="right" style="width: 70%;">
            <div class="marker">
            </div>
            <div class="left" style="width: 20%;">
                <div class="marker">
                </div>
            </div>
        </div>
    </div>
</div>

SCSS

.progressbar {
    width: 20em;
    background: grey;
    .bar {
        height: 2em;
        .progress {
            background: blue;
            height: 100%;
        }
    }
    .markers {
        height: 1em;
        background: white;
        .right {
            height: 100%;
            background: red;
            .marker {
                width: 1em;
                height: 100%;
                background: green;
                position: relative;
                float: right;
            }
            .left {
                background: white;
                height: 100%;
            }
        }
    }
}

操作可能非常困难

jQuery

$('.bar').click(function(e){
    $(this).find('.progress').css('width', (e.offsetX / this.offsetWidth)*100+'%');
});

将在点击时正确设置进度条。

对于标记,您将需要 mousedown、mousemove、mouseleave 事件,因为您有 2 个。

例子

http://jsfiddle.net/JXauW/

于 2013-07-23T14:45:37.547 回答