Я бы сказал, что если вы хотите, чтобы текст и div прогресса были независимыми, лучше было бы использовать как текст, так и прогресс в качестве родных элементов, например:
<div class="back">
<div class="front"></div>
<p>70%</p>
</div>
Вы можете выровнять текст с flexbox:
.back {
display: flex;
align-items: center;
justify-content: center;
}
И сделать индикатор выполнения абсолютно позиционированным, чтобы «убираться с пути».
.back {
position: relative;
}
.front {
position: absolute;
top: 0;
left: 0;
}
Конечно, поскольку метка стоит c , он будет прятаться под позиционированным индикатором выполнения. Тогда вам придется его позиционировать тоже.
.back > p {
position: relative;
}
Я не говорю, что это лучший подход, но я подумал, что стоит упомянуть, потому что он перестраивает иерархию компонентов, что, я думаю, вам следует, и центрирует текст с помощью flexbox.
.back {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 300px;
height: 60px;
background: purple;
border-radius: 8px;
overflow: hidden;
}
.front {
position: absolute;
top: 0;
left: 0;
width: 70%;
height: 100%;
background: orange;
}
p {
position: relative;
}
<div class="back">
<div class="front"></div>
<p>70%</p>
</div>