Как создать, где взять прогрессбар, который на каких-то отрезках заполнен, а на остальных нет

Что-то типа этого (Available), только нету вот этих промежуточных цветов (либо закрашено, либо нет). демонстрация такого отрезка на примере торрента

По факту создаём отрезок.

Делим его на ограниченное количество промежутков фиксированной длины.

Какие-то конкретные промежутки закрашиваем.

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

Также необходимо, чтобы корректно обрабатывались наложения и перекрытия.

Корректно значит, что набор [ 3, 13 ], [ 8, 18 ], [ 6, 16 ] на отрезке длиной 20

--+++++++++++------- [ 3, 13 ]
-------+++++++++++-- [ 8, 18 ]
-----++++++++++----- [ 6, 16 ]
сложится в это:
--++++++++++++++++-- [ 3, 18 ]

Нужно решение, которое легко интегрируется в react или создано специально для него.

Если такого нет, то как создать при слабых навыках в css?


Ответы (1 шт):

Автор решения: 2ip

Сделал по вашему описанию, получилось что-то похожее на ваш пример.

 window.onload= function(){
            
        function start(info,s){//принимаем информацию о закрашенных областях и о кол-ве сегментов
            let hml = info.length; //определяем кол-во будущих полос 
            hml = 1 / hml; //определяем степень прозрачности 
            let innStr = "";
            for(let i = 0; i < info.length; i++){
                innStr = innStr + "<div class='mb' style='opacity: "+hml+"; margin-left: 0%;'  ></div>"
            }
            var pbb = document.getElementById("myProgress");
            pbb.innerHTML = innStr;//добавляем полоски в тело прогресс-бара
            var pr = 100/s; //находим длину 1 сегмента в процентах
            for(let i = 0; i < info.length; i++){//работаем с добавленными полосками
                let here = document.getElementsByClassName("mb")[i];
                let razn = info[i][1] - info[i][0];// вычисляем длину закрашенной области 
                razn = razn * pr;//переводим длину закрашенной области в проценты
                here.style.width = razn+"%";//присваиваем значение длинны полосе
                razn = info[i][0]*pr;//Определяем и переводим отступ от левой границы в проценты
                
                here.style.marginLeft = razn+"%";//присваиваем отступ полосе
            }
        }
        
        var info = [[3, 13],[8, 18],[6, 16]]//(логика) от конца 3 сегмента до конца 13 сегмента 
        start(info,20)
    }
    #myProgress {
    width: 100%;
    background-color: rgb(240, 235, 235);
    height: 30px;
    position: relative;
    }
    body {
    margin: 0; 
    }
    .mb {
    width: 0%;
    height: 100%;
    background-color: rgb(7, 172, 7);
    position: absolute;
    }
<div id="myProgress"></div>

→ Ссылка