Сохраняйте ширину элемента на всю ширину (используя влево / вправо), затем используйте градиент для окраски, чтобы окрасить только его часть. Теперь вы можете положиться на translateX(100%)
, какая бы ширина окраски ни была:
.freeze-loading {
position: relative;
width: 100%;
max-width: 300px;
margin: 1rem auto;
height: 5px;
box-shadow: inset 1px 0px 4px 0 #ddd;
overflow: hidden;
}
.freeze-loading-bar {
--w:80px; /* the width of coloration */
position: absolute;
left: calc(-1*var(--w));
right: 0;
height: 100%;
background:
linear-gradient(rgb(0, 132, 255) 0 0)
0 / var(--w) 100%
no-repeat;
animation: freeze-loading-bar 2s linear infinite;
}
@keyframes freeze-loading-bar {
to {
transform: translateX(100%);
}
}
<div class="freeze-loading">
<div class="freeze-loading-bar"></div>
</div>
<div class="freeze-loading">
<div class="freeze-loading-bar" style="--w:150px;"></div>
</div>
Другой вид анимации:
.freeze-loading {
position: relative;
width: 100%;
max-width: 300px;
margin: 1rem auto;
height: 5px;
box-shadow: inset 1px 0px 4px 0 #ddd;
overflow: hidden;
}
.freeze-loading-bar {
--w:80px; /* the width of coloration */
position: absolute;
left: 0;
right: var(--w);
height: 100%;
background:
linear-gradient(rgb(0, 132, 255) 0 0)
0 / var(--w) 100%
no-repeat;
animation: freeze-loading-bar 1s linear infinite alternate;
}
@keyframes freeze-loading-bar {
to {
transform: translateX(100%);
}
}
<div class="freeze-loading">
<div class="freeze-loading-bar"></div>
</div>
<div class="freeze-loading">
<div class="freeze-loading-bar" style="--w:150px;"></div>
</div>
Другой синтаксис:
.freeze-loading {
position: relative;
width: 100%;
max-width: 300px;
margin: 1rem auto;
height: 5px;
box-shadow: inset 1px 0px 4px 0 #ddd;
overflow: hidden;
}
.freeze-loading-bar {
--w:80px; /* the width of coloration */
position: absolute;
left: 0;
right: 0;
height: 100%;
background:
linear-gradient(rgb(0, 132, 255) 0 0)
0 / var(--w) 100%
no-repeat;
animation: freeze-loading-bar 2s linear infinite;
transform: translateX(calc(-1*var(--w)));
}
@keyframes freeze-loading-bar {
to {
transform: translateX(100%);
}
}
<div class="freeze-loading">
<div class="freeze-loading-bar"></div>
</div>
<div class="freeze-loading">
<div class="freeze-loading-bar" style="--w:150px;"></div>
</div>
И еще один:
.freeze-loading {
position: relative;
width: 100%;
max-width: 300px;
margin: 1rem auto;
height: 5px;
box-shadow: inset 1px 0px 4px 0 #ddd;
overflow: hidden;
}
.freeze-loading-bar {
--w:80px; /* the width of coloration */
position: absolute;
right: 0;
width:calc(100% + var(--w));
height: 100%;
background:
linear-gradient(rgb(0, 132, 255) 0 0)
0 / var(--w) 100%
no-repeat;
animation: freeze-loading-bar 2s linear infinite;
}
@keyframes freeze-loading-bar {
to {
transform: translateX(100%);
}
}
<div class="freeze-loading">
<div class="freeze-loading-bar"></div>
</div>
<div class="freeze-loading">
<div class="freeze-loading-bar" style="--w:150px;"></div>
</div>