วิธีเพิ่มไอคอนสปินเนอร์ไปที่ปุ่มเมื่ออยู่ในสถานะกำลังโหลด


191

ปุ่มของ Twitter BootstrapมีLoading...สถานะที่ดี

สิ่งนั้นคือมันเพิ่งแสดงข้อความเช่นLoading...ส่งผ่านdata-loading-textคุณลักษณะเช่นนี้:

<button type="button" class="btn btn-primary start" id="btnStartUploads"
        data-loading-text="@Localization.Uploading">
    <i class="icon-upload icon-large"></i>
    <span>@Localization.StartUpload</span>
</button>

เมื่อมองไปที่ Font Awesome คุณจะเห็นว่าตอนนี้มีไอคอนสปินเนอร์เคลื่อนไหวแล้ว

ฉันพยายามรวมไอคอนสปินเนอร์นั้นเมื่อทำการUploadดำเนินการเช่นนี้:

$("#btnStartUploads").button('loading');
$("#btnStartUploads i").removeAttr('class');
$("#btnStartUploads i").addClass('icon-spinner icon-spin icon-large');

แต่สิ่งนี้ไม่มีผลเลยนั่นคือฉันเพิ่งเห็นUploading...ข้อความบนปุ่ม

เป็นไปได้หรือไม่ที่จะเพิ่มไอคอนเมื่อปุ่มอยู่ในสถานะกำลังโหลด? ดูเหมือน Bootstrap อย่างใดเพียงแค่เอาไอคอน<i class="icon-upload icon-large"></i>ภายในปุ่มในขณะที่อยู่ในสถานะโหลด


นี่คือง่ายๆสาธิตที่แสดงให้เห็นถึงพฤติกรรมที่ผมอธิบายข้างต้น อย่างที่คุณเห็นเมื่อมันเข้าสู่สถานะการโหลดไอคอนจะหายไป มันจะปรากฏขึ้นอีกครั้งหลังจากช่วงเวลา


1
คุณสามารถตรวจสอบวิธีแก้ไขปัญหาของฉันต่อภาพลักษณ์ของตัวหมุน: stackoverflow.com/questions/15982233/…
Andrew Dryga

ฉันแนะนำให้ใช้วิธีนี้stackoverflow.com/a/15988830/437690
ขีด จำกัด

คำตอบ:


101

ถ้าคุณมองไปที่บูต-button.jsมาคุณจะเห็นว่าปลั๊กอินบูตแทนที่ปุ่ม HTML ภายในกับสิ่งที่อยู่ในข้อมูลโหลดข้อความ$(myElem).button('loading')เมื่อโทร

สำหรับกรณีของคุณฉันคิดว่าคุณน่าจะทำได้

<button type="button"
        class="btn btn-primary start"
        id="btnStartUploads"
        data-loading-text="<i class='icon-spinner icon-spin icon-large'></i> @Localization.Uploading">
    <i class="icon-upload icon-large"></i>
    <span>@Localization.StartUpload</span>
</button>

1
ใช้งานได้ดี gurch101! ฉันลืมว่าสามารถผสมHTMLกับข้อความในคุณสมบัติแท็ก :-)
Leniel Maccaferri

11
ซอไม่ทำงานกับ Safari 6.0.5 (7536.30.1), Chrome 31.0.1604.0 นกขมิ้นบน Mac OS X.
Burak Erdem

16
คงที่: jsfiddle.net/6U5q2/270หมายเหตุนี่สำหรับ v2.3.2 ไม่ทราบว่าจะใช้งานได้กับ 3.x หรือไม่
Eric Freese

13
data-loading-textเลิกใช้แล้วตั้งแต่ v3.3.5 และจะถูกลบใน v4
Jonathan

2
@Jonathan หากมีการคัดค้านใน v3.3.5 การแทนที่สำหรับทั้งสองหลังจาก v3.3.5 และ v4 คืออะไร
PaladiN

324

ทางออกที่ง่ายสำหรับBootstrap 3โดยใช้ภาพเคลื่อนไหว CSS3

ใส่สิ่งต่อไปนี้ใน CSS ของคุณ:

.glyphicon.spinning {
    animation: spin 1s infinite linear;
    -webkit-animation: spin2 1s infinite linear;
}

@keyframes spin {
    from { transform: scale(1) rotate(0deg); }
    to { transform: scale(1) rotate(360deg); }
}

@-webkit-keyframes spin2 {
    from { -webkit-transform: rotate(0deg); }
    to { -webkit-transform: rotate(360deg); }
}

จากนั้นเพิ่มspinningคลาสลงglyphiconในขณะที่กำลังโหลดเพื่อรับไอคอนการหมุนของคุณ:

<button class="btn btn-lg btn-warning">
    <span class="glyphicon glyphicon-refresh spinning"></span> Loading...    
</button>

อิงจากhttp://www.bootply.com/128062#

  • หมายเหตุ: IE9 และด้านล่างไม่รองรับภาพเคลื่อนไหว CSS3

4
ไม่ควรหรือanimationไม่-animation?
Andrey Mikhaylov - lolmaus

3
ทางออกที่ดีเยี่ยม ฉันมีปัญหากับแอนิเมชั่นนี้ใน Safari บนเดสก์ท็อปและบน iPad มันแสดงไอคอน แต่ไม่เคลื่อนไหว เคยมีประสบการณ์แบบนั้นบ้างไหม?
JayhawksFan93

@ JayhawksFan93 ใช่ฉันเพิ่งสังเกตเห็นเหมือนกันใน IE จะมองเข้าไปในไม่ช้า
Flion

2
คำตอบที่ได้รับการปรับปรุงเพื่อ แทนanimation -animationด้วยการเปลี่ยนแปลงที่ดีใน FF และ IE สำหรับฉัน ภาพเคลื่อนไหวของ Firefox นั้นดูไม่ราบรื่นนัก
Flion

1
+1 พบสิ่งที่คล้ายกันที่นี่ .... โพสต์เพื่อบันทึก ...
Fr0zenFyr

66

ตอนนี้มีปลั๊กอินที่ครบถ้วนสำหรับ:

http://msurguy.github.io/ladda-bootstrap/


1
สวัสดี @Eru Penkman อะไรคือความแตกต่างระหว่างของคุณกับของดั้งเดิม?
Ivan Wang

เฮ้อีวานจัดเรียง แต่ฉันไม่เคยได้ไปปรับปรุงสำเนาลัดดาของฉัน! เป็นเพียงต้นฉบับฉันลบความคิดเห็นก่อนหน้าของฉัน ขอโทษด้วยกับเรื่องนั้น!
roo2

13

เพื่อให้การแก้ปัญหาโดย @flion ดูยอดเยี่ยมจริงๆคุณสามารถปรับจุดกึ่งกลางสำหรับไอคอนนั้นเพื่อไม่ให้โยกขึ้นและลง นี่เหมาะสำหรับฉันที่ตัวอักษรขนาดเล็ก:

.glyphicon-refresh.spinning {
  transform-origin: 48% 50%;
}

1
.glyphicon-refresh.spinning { transform-origin: 50% 58%; }ทำงานให้ฉัน
oluckyman

ฮัม, { transform-origin: 50% 49%; }แก้ปัญหาในกรณีของฉันที่ฉันใช้cogแทน
Vitor Canova

ฉันยังสังเกตเห็นการโยกเยก แต่เหตุผลในการเปลี่ยนตัวเลขเหล่านี้คืออะไร? ฉันจะจูนมันได้อย่างไร
elachell

2

นี่คือทางออกของฉันสำหรับ Bootstrap 4:

<button id="search" class="btn btn-primary" 
data-loading-text="<i class='fa fa-spinner fa-spin fa-fw' aria-hidden='true'></i>Searching">
  Search
</button>

var setLoading = function () {
  var search = $('#search');
  if (!search.data('normal-text')) {
    search.data('normal-text', search.html());
  }
  search.html(search.data('loading-text'));
};

var clearLoading = function () {
  var search = $('#search');
  search.html(search.data('normal-text'));
};

setInterval(() => {
  setLoading();
  setTimeout(() => {
    clearLoading();
  }, 1000);
}, 2000);

ลองดูที่JSFiddle


2

สิ่งเหล่านี้เป็นของฉันขึ้นอยู่กับการเคลื่อนไหว SVG และ CSS ที่บริสุทธิ์ อย่าให้ความสนใจกับรหัส JS ในข้อมูลโค้ดมันเป็นเพียงเพื่อการสาธิต รู้สึกอิสระที่จะทำให้คนที่คุณกำหนดเองโดยใช้พื้นฐานเป็นเรื่องง่ายมาก

var svg = d3.select("svg"),
    columnsCount = 3;

['basic', 'basic2', 'basic3', 'basic4', 'loading', 'loading2', 'spin', 'chrome', 'chrome2', 'flower', 'flower2', 'backstreet_boys'].forEach(function(animation, i){
  var x = (i%columnsCount+1) * 200-100,
      y = 20 + (Math.floor(i/columnsCount) * 200);
  
  
  svg.append("text")
    .attr('text-anchor', 'middle')
    .attr("x", x)
    .attr("y", y)
    .text((i+1)+". "+animation);
  
  svg.append("circle")
    .attr("class", animation)
    .attr("cx",  x)
    .attr("cy",  y+40)
    .attr("r",  16)
});
circle {
  fill: none;
  stroke: #bbb;
  stroke-width: 4
}

.basic {
  animation: basic 0.5s linear infinite;
  stroke-dasharray: 20 80;
}

@keyframes basic {
  0%    {stroke-dashoffset: 100;}
  100%  {stroke-dashoffset: 0;}
}

.basic2 {
  animation: basic2 0.5s linear infinite;
  stroke-dasharray: 80 20;
}

@keyframes basic2 {
  0%    {stroke-dashoffset: 100;}
  100%  {stroke-dashoffset: 0;}
}

.basic3 {
  animation: basic3 0.5s linear infinite;
  stroke-dasharray: 20 30;
}

@keyframes basic3 {
  0%    {stroke-dashoffset: 100;}
  100%  {stroke-dashoffset: 0;}
}

.basic4 {
  animation: basic4 0.5s linear infinite;
  stroke-dasharray: 10 23.3;
}

@keyframes basic4 {
  0%    {stroke-dashoffset: 100;}
  100%  {stroke-dashoffset: 0;}
}

.loading {
  animation: loading 1s linear infinite;
  stroke-dashoffset: 25;
}

@keyframes loading {
  0%    {stroke-dashoffset: 0;    stroke-dasharray: 50 0; }
  50%   {stroke-dashoffset: -100; stroke-dasharray: 0 50;}
  100%  { stroke-dashoffset: -200;stroke-dasharray: 50 0;}
}

.loading2 {
  animation: loading2 1s linear infinite;
}

@keyframes loading2 {
  0% {stroke-dasharray: 5 28.3;   stroke-dashoffset: 75;}
  50% {stroke-dasharray: 45 5;    stroke-dashoffset: -50;}
  100% {stroke-dasharray: 5 28.3; stroke-dashoffset: -125; }
}

.spin {
  animation: spin 1s linear infinite;
  stroke-dashoffset: 25;
}

@keyframes spin {
  0%    {stroke-dashoffset: 0;    stroke-dasharray: 33.3 0; }
  50%   {stroke-dashoffset: -100; stroke-dasharray: 0 33.3;}
  100%  { stroke-dashoffset: -200;stroke-dasharray: 33.3 0;}
}

.chrome {
  animation: chrome 2s linear infinite;
}

@keyframes chrome {
  0%    {stroke-dasharray: 0 100; stroke-dashoffset: 25;}
  25%   {stroke-dasharray: 75 25; stroke-dashoffset: 0;}
  50%   {stroke-dasharray: 0 100;  stroke-dashoffset: -125;}
  75%    {stroke-dasharray: 75 25; stroke-dashoffset: -150;}
  100%   {stroke-dasharray: 0 100; stroke-dashoffset: -275;}
}

.chrome2 {
  animation: chrome2 1s linear infinite;
}

@keyframes chrome2 {
  0%    {stroke-dasharray: 0 100; stroke-dashoffset: 25;}
  25%   {stroke-dasharray: 50 50; stroke-dashoffset: 0;}
  50%   {stroke-dasharray: 0 100;  stroke-dashoffset: -50;}
  75%   {stroke-dasharray: 50 50;  stroke-dashoffset: -125;}
  100%  {stroke-dasharray: 0 100;  stroke-dashoffset: -175;}
}

.flower {
  animation: flower 1s linear infinite;
}

@keyframes flower {
  0%    {stroke-dasharray: 0  20; stroke-dashoffset: 25;}
  50%   {stroke-dasharray: 20 0;  stroke-dashoffset: -50;}
  100%  {stroke-dasharray: 0 20;  stroke-dashoffset: -125;}
}

.flower2 {
  animation: flower2 1s linear infinite;
}

@keyframes flower2 {
  0%    {stroke-dasharray: 5 20;  stroke-dashoffset: 25;}
  50%   {stroke-dasharray: 20 5;  stroke-dashoffset: -50;}
  100%  {stroke-dasharray: 5 20;  stroke-dashoffset: -125;}
}

.backstreet_boys {
  animation: backstreet_boys 3s linear infinite;
}

@keyframes backstreet_boys {
  0%    {stroke-dasharray: 5 28.3;  stroke-dashoffset: -225;}
  15%    {stroke-dasharray: 5 28.3;  stroke-dashoffset: -300;}
  30%   {stroke-dasharray: 5 20;  stroke-dashoffset: -300;}
  45%    {stroke-dasharray: 5 20;  stroke-dashoffset: -375;}
  60%   {stroke-dasharray: 5 15;  stroke-dashoffset: -375;}
  75%    {stroke-dasharray: 5 15;  stroke-dashoffset: -450;}
  90%   {stroke-dasharray: 5 15;  stroke-dashoffset: -525;}
  100%   {stroke-dasharray: 5 28.3;  stroke-dashoffset: -925;}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.13.0/d3.min.js"></script>
<svg width="600px" height="700px"></svg>

นอกจากนี้ยังมีใน CodePen: https://codepen.io/anon/pen/PeRazr


1

นี่คือโซลูชัน css ที่ได้รับแรงบันดาลใจจาก Bulma เพียงเพิ่ม

    .button {
      display: inline-flex;
      align-items: center;
      justify-content: center;
      position: relative;
      min-width: 200px;
      max-width: 100%;
      min-height: 40px;
      text-align: center;
      cursor: pointer;
    }

    @-webkit-keyframes spinAround {
      from {
        -webkit-transform: rotate(0deg);
        transform: rotate(0deg);
      }
      to {
        -webkit-transform: rotate(359deg);
        transform: rotate(359deg);
      }
    }
    @keyframes spinAround {
      from {
        -webkit-transform: rotate(0deg);
        transform: rotate(0deg);
      }
      to {
        -webkit-transform: rotate(359deg);
        transform: rotate(359deg);
      }
    }

    .button.is-loading {
      text-indent: -9999px;
      box-shadow: none;
      font-size: 1rem;
      height: 2.25em;
      line-height: 1.5;
      vertical-align: top;
      padding-bottom: calc(0.375em - 1px);
      padding-left: 0.75em;
      padding-right: 0.75em;
      padding-top: calc(0.375em - 1px);
      white-space: nowrap;
    }

    .button.is-loading::after  {
      -webkit-animation: spinAround 500ms infinite linear;
      animation: spinAround 500ms infinite linear;
      border: 2px solid #dbdbdb;
      border-radius: 290486px;
      border-right-color: transparent;
      border-top-color: transparent;
      content: "";
      display: block;
      height: 1em;
      position: relative;
      width: 1em;
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.