Dyanmic изменяет размер счетчика загрузки CSS3 по пикселям

Меня попросили взять счетчик загрузки на чистом CSS3 и сделать его динамически изменяемым по пикселям для использования в разных местах программы.

Мой текущий код: (который, по-видимому, плохо работает в фрагментах SO)

.loader {
  animation:spin 1s infinite linear;
  border:solid 2vmin transparent;
  border-radius:50%;
  border-right-color:#71c491;
  border-top-color:#f7941d;
  box-sizing:border-box;
  height:20vmin;
  left:calc(50% - 10vmin);
  position:fixed;
  top:calc(50% - 10vmin);
  width:20vmin;
  z-index:1;
  &:before {
    animation:spin 2s infinite linear;
    border:solid 2vmin transparent;
    border-radius:50%;
    border-right-color:#21409a;
    border-top-color:#92278f;
    box-sizing:border-box;
    content:"";
    height:16vmin;
    left:0;
    position:absolute;
    top:0;
    width:16vmin;
  }
  &:after {
    animation:spin 3s infinite linear;
    border:solid 2vmin transparent;
    border-radius:50%;
    border-right-color:#13b0e6;
    border-top-color:#18244c;
    box-sizing:border-box;
    content:"";
    height:12vmin;
    left:2vmin;
    position:absolute;
    top:2vmin;
    width:12vmin;
  }
}

@keyframes spin {
  100% {
    transform:rotate(360deg);
  }
}
<div class = "loader"></div>

Я погуглил и попробовал transform:scale(), но, насколько я могу судить, он принимает только определенные данные и увеличивает/уменьшает размер в процентах. (2 = размер 200 %)

Я думаю, мне нужна какая-то оболочка, но я не слишком хорошо знаком с продвинутым CSS, чтобы получить эффект. Когда я пытался создать свой собственный, только верхняя граница счетчика изменялась в странную форму, а не внутренние границы. Я просто в тупике. Если бы вы могли указать мне в правильном направлении, я был бы признателен. Спасибо.

5 способов использования оповещений, предупреждений, ошибок, сообщений об успехе в Bootstrap
5 способов использования оповещений, предупреждений, ошибок, сообщений об успехе в Bootstrap
Bootstrap - это популярный front-end фреймворк, который делает веб-разработку проще и быстрее. Использование Bootstrap растет по мере того, как все...
Как сделать меню гамбургера только на CSS
Как сделать меню гамбургера только на CSS
Недавно я делал небольшие изменения на своем сайте , когда я вновь обнаружил меню гамбургера, которое я сделал для него. В нем нет ничего особенного,...
Полеты по миру фронтенда, том 9
Полеты по миру фронтенда, том 9
Мир фронтенда снова растет быстрее, чем население Земли. За всеми новостями и тенденциями в нем становится почти так же трудно уследить, как за...
Создание фильтров для вашего сайта
Создание фильтров для вашего сайта
Фильтры - удобный инструмент в арсенале веб-дизайнера. Они позволяют изменять элементы на странице с помощью всего нескольких строк кода. Эти...
Библиотека Bootstrap
Библиотека Bootstrap
Bootstrap - это бесплатный набор инструментов для разработки веб-приложений с открытым исходным кодом, разработанный компанией Twitter. Написанный на...
Уроки CSS 28
Уроки CSS 28
Здравствуйте, дорогие читатели, я Ферди Сефа Дюзгюн, сегодня мы продолжим с вами уроки css.
0
0
302
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать сочетание CSS var() / calc() / clip() / сетки ... и relative/absolutepositionning, чтобы положить загрузчик поверх родителя, где вы нужно, если это тебя вдохновляет:

демонстрация с несколькими загрузчиками в пределах размера div и возможностью установить средний размер для начала, размер% в зависимости от ширины родителя.

значение для сброса в демо — --size ; вы также можете настроить другие значения --MyVarCss в соответствии с вашими потребностями.

* {
  box-sizing: border-box;
}

:root { /* init for the var() values */
  --size: 20;/* value used to set the loader's width and adjust border's width */
  --width: calc(var(--size) * 1%);
  --widthBorder: calc( clamp(20px, 6vw, 80px) * var(--size) * 0.005);
}

.a,/* for the demo , just a bunch of containers */
.b,
.c,
.d,
.d,
.e {
  position: relative;
  /* what the parent loader needs to be (absolute/fixed/sticky works too, static not) */
  float: left;
  border: solid;
  margin: 1em;
}

div.a {
  --size: 50; /* reset the value used to set the loader's width */
  width: 50%;
  padding-top: 50%;
}

.b {
  --size: 10;/* reset the value used to set the loader's width */
  width: 600px;
  height: 200px;
}

.c {
  --size: 15;/* reset the value used to set the loader's width */
  width: 25%;
  padding-top: 20%;
}

.d {
  --size: 30;/* reset the value used to set the loader's width */
  width: 800px;
  height: 400px;
}

.e {
  --size: 14;/* reset the value used to set the loader's width */
  width: 90%;
  min-height: 20vh;
}

div {
  width: 20%;
  padding-top: 20%;
}
/* loader styles */
.loader {
  position: absolute;
  top: 0;
  left: 0;
  display: flex;
  width: 100%;
  height: 100%;
  margin: 0;
  padding: 0;
}

.loader b {
  display: grid;
  animation: rotate 3s -1s infinite linear;
  border: solid var(--widthBorder) transparent;
  padding: calc(var(--widthBorder) / 2);
  border-radius: 50%;
  border-right-color: #71c491;
  border-top-color: #f7941d;
  grid-row: 1;
  grid-column: 1;
  margin: 0;
}

.loader>b {
  margin: auto;
  width: var(--width);
}

.loader>b:before {
  content: "";
  padding-top: 100%;
  grid-row: 1;
  grid-column: 1;
}

.loader b b {
  border-right-color: #21409a;
  border-top-color: #92278f;
}

.loader b b b {
  border-right-color: #13b0e6;
  border-top-color: #18244c;
  padding: 0;
}

@keyframes rotate {
  100% {
    transform: rotate(360deg);
  }
}
<div class=a>
  <div class = "loader"><b><b><b></b></b>
    </b>
  </div>
</div>
<div class=b>
  <div class = "loader"><b><b><b></b></b>
    </b>
  </div>
</div>
<div class=c>
  <div class = "loader"><b><b><b></b></b>
    </b>
  </div>
</div>
<div class=d>
  <div class = "loader"><b><b><b></b></b>
    </b>
  </div>
</div>
<div class=e>
  <div class = "loader"><b><b><b></b></b>
    </b>
  </div>
</div>

Другие вопросы по теме