技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運(yùn)營(yíng)

贊助商

分類目錄

贊助商

最新文章

搜索

CSS實(shí)現(xiàn)的下載進(jìn)程動(dòng)畫【演示/源碼】

作者:admin    時(shí)間:2023-3-13 17:39:55    瀏覽:

在文件下載時(shí),如果能顯示一個(gè)下載進(jìn)程,那么對(duì)用戶來(lái)說(shuō)是一個(gè)很好的反饋,本文將給大家介紹一個(gè)CSS實(shí)現(xiàn)的下載進(jìn)程動(dòng)畫。

 CSS實(shí)現(xiàn)的下載進(jìn)程動(dòng)畫

demodownload

實(shí)例介紹

點(diǎn)擊下載按鈕后,畫圓一周,圓內(nèi)顯示“100%”和一個(gè)勾,表示下載進(jìn)程已經(jīng)結(jié)束。

HTML代碼

<button class="button">
    <svg class="circle" viewBox="0 0 76 76">
        <circle class="default" cx="38" cy="38" r="36"></circle>
        <circle class="active" cx="38" cy="38" r="36"></circle>
    </svg>
    <div class="icon">
        <svg class="line" viewBox="0 0 4 37">
            <line x1="2" y1="2" x2="2" y2="35"></line>
        </svg>
        <div>
            <svg class="arrow" viewBox="0 0 40 32"></svg>
            <svg class="progress" viewBox="0 0 444 10">
                <path d="M2,5 L42,5 C60.0089086,6.33131695..."></path>
            </svg>
        </div>
    </div>
    <span>0%</span>
</button>

HTML結(jié)構(gòu)外部為一個(gè)button標(biāo)簽,內(nèi)部為一個(gè)SVG標(biāo)簽、一個(gè)div標(biāo)簽和一個(gè)span標(biāo)簽,其中SVG是一個(gè)圓,它的class值為circle,而div是圓內(nèi)部的圖標(biāo),它的class值為icon。span標(biāo)簽顯示下載進(jìn)程的百分比數(shù)字。

CSS代碼

由于涉及元素較多,所以CSS代碼也比較多。

.button設(shè)置按鈕樣式。

.circle設(shè)置圓的樣式。

.button span設(shè)置下載進(jìn)程百分比數(shù)字樣式。

.icon設(shè)置圓容器的樣式,.icon svg.line是線條動(dòng)畫的樣式。

部分CSS代碼:

.button {
  --default: rgba(255, 255, 255, .2);
  --active: #fff;
  position: relative;
  border: none;
  outline: none;
  background: none;
  padding: 0;
  -webkit-appearance: none;
  -webkit-tap-highlight-color: transparent;
  cursor: pointer;
  transform: scale(var(--s, 1));
  transition: transform 0.2s;
}
.button:active {
  --s: .96;
}
.button svg {
  display: block;
  fill: none;
  stroke-width: var(--sw, 3px);
  stroke-linecap: round;
  stroke-linejoin: round;
}
.button .circle {
  width: 76px;
  height: 76px;
  transform: rotate(-90deg);
}
.button .circle circle.default {
  stroke: var(--default);
}
.button .circle circle.active {
  stroke: var(--active);
  stroke-dasharray: 227px;
  stroke-dashoffset: var(--active-offset, 227px);
  transition: stroke-dashoffset var(--all-transition, 4s) ease var(--all-delay, 0.8s);
}
.button span {
  display: block;
  position: absolute;
  left: 0;
  right: 0;
  text-align: center;
  bottom: 13px;
  font-weight: 500;
  font-size: 10px;
  color: var(--active);
  opacity: var(--count-opacity, 0);
  transform: translateY(var(--count-y, 4px));
  -webkit-animation: var(--count, none) 0.3s ease forwards var(--all-delay, 4.6s);
          animation: var(--count, none) 0.3s ease forwards var(--all-delay, 4.6s);
  transition: opacity 0.2s ease 0.6s, transform 0.3s ease 0.6s;
}
.button .icon {
  --sw: 2px;
  width: 24px;
  height: 40px;
  position: absolute;
  left: 50%;
  top: 50%;
  margin: -20px 0 0 -12px;
}
.button .icon svg.line {
  width: 4px;
  height: 37px;
  stroke: var(--active);
  position: absolute;
  left: 10px;
  top: 0;
  stroke-dasharray: 0 33px var(--line-array, 33px) 66px;
  stroke-dashoffset: var(--line-offset, 33px);
  transform: translateY(var(--line-y, 0));
  opacity: var(--line-opacity, 1);
  transition: stroke-dasharray 0.2s, stroke-dashoffset 0.2s, transform 0.32s ease var(--all-delay, 0.25s);
}

此外,還有箭頭樣式,其CSS代碼為:

.button .icon div svg.arrow {
  width: 40px;
  height: 32px;
  opacity: var(--arrow-opacity, 1);
  transition: opacity 0s linear var(--all-delay, 1s);
}

JavaScript代碼

本實(shí)例動(dòng)畫用SVG完成,所以用到了一個(gè)第三方JS庫(kù)文件gsap.min.js,它的作用是實(shí)現(xiàn)SVG動(dòng)畫。

<script src='gsap.min.js'></script>

部分JavaScript代碼:

const $ = (s, o = document) => o.querySelector(s);
const $$ = (s, o = document) => o.querySelectorAll(s);

$$('.button').forEach(button => {

  let count = {
    number: 0 },

  icon = $('.icon', button),
  iconDiv = $('.icon > div', button),
  arrow = $('.icon .arrow', button),
  countElem = $('span', button),
  svgPath = new Proxy({
    y: null,
    s: null,
    f: null,
    l: null },
  {
    set(target, key, value) {
      target[key] = value;
      if (target.y !== null && target.s != null && target.f != null && target.l != null) {
        arrow.innerHTML = getPath(target.y, target.f, target.l, target.s, null);
      }
      return true;
    },
    get(target, key) {
      return target[key];
    } });


  svgPath.y = 30;
  svgPath.s = 0;
  svgPath.f = 8;
  svgPath.l = 32;

  button.addEventListener('click', e => {
    if (!button.classList.contains('loading')) {

      if (!button.classList.contains('animation')) {

        button.classList.add('loading', 'animation');

        gsap.to(svgPath, {
          f: 2,
          l: 38,
          duration: .3,
          delay: .15 });


        gsap.to(svgPath, {
          s: .2,
          y: 16,
          duration: .8,
          delay: .15,
          ease: Elastic.easeOut.config(1, .4) });


        gsap.to(count, {
          number: '100',
          duration: 3.8,
          delay: .8,
          onUpdate() {
            countElem.innerHTML = Math.round(count.number) + '%';
          } });


        setTimeout(() => {
          iconDiv.style.setProperty('overflow', 'visible');
          setTimeout(() => {
            button.classList.remove('animation');
          }, 600);
        }, 4820);

      }

    } else {

      if (!button.classList.contains('animation')) {

        button.classList.add('reset');

        gsap.to(svgPath, {
          f: 8,
          l: 32,
          duration: .4 });


        gsap.to(svgPath, {
          s: 0,
          y: 30,
          duration: .4 });


        setTimeout(() => {
          button.classList.remove('loading', 'reset');
          iconDiv.removeAttribute('style');
        }, 400);

      }

    }
    e.preventDefault();
  });

});

總結(jié)

本文介紹了一個(gè)CSS實(shí)現(xiàn)的下載進(jìn)程動(dòng)畫,這個(gè)動(dòng)畫對(duì)用戶來(lái)說(shuō)是一個(gè)很好的等待反饋,喜歡的朋友可以下載源碼直接使用。

相關(guān)文章

x
  • 站長(zhǎng)推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */