Làm cách nào để thêm biểu tượng con quay vào nút khi nó ở trạng thái Đang tải?


189

Các nút của Twitter BootstrapLoading... có sẵn trạng thái đẹp .

Có điều là nó chỉ hiển thị một thông báo như Loading...được chuyển qua data-loading-textthuộc tính như thế này:

<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>

Nhìn vào Font Awesome, bạn thấy rằng giờ đây đã có một biểu tượng spinner hoạt hình .

Tôi đã cố gắng tích hợp biểu tượng spinner đó khi thực hiện một Uploadthao tác như thế này:

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

nhưng điều này không có tác dụng gì cả, đó là tôi chỉ thấy Uploading...văn bản trên nút.

Có thể thêm biểu tượng khi nút ở trạng thái Đang tải không? Có vẻ như bằng cách nào đó Bootstrap chỉ xóa biểu tượng <i class="icon-upload icon-large"></i>bên trong nút trong khi ở trạng thái Đang tải.


Đây là một bản demo đơn giản cho thấy hành vi tôi mô tả ở trên. Như bạn thấy khi nó vào trạng thái Đang tải, biểu tượng sẽ biến mất. Nó xuất hiện lại ngay sau khoảng thời gian.


1
Bạn có thể kiểm tra giải pháp của tôi để xuất hiện hoạt hình spinner: stackoverflow.com/questions/15982233/NH
Andrew Dryga

Tôi khuyên bạn nên sử dụng phương pháp này stackoverflow.com/a/15988830/437690
limium

Câu trả lời:


101

Nếu bạn nhìn vào nguồn bootstrap-button.js , bạn sẽ thấy plugin bootstrap thay thế các nút bên trong html bằng bất cứ thứ gì có trong văn bản tải dữ liệu khi gọi $(myElem).button('loading').

Đối với trường hợp của bạn, tôi nghĩ bạn chỉ cần có thể làm điều này:

<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
Công trình tuyệt vời! Tôi quên rằng người ta có thể trộn HTMLvới văn bản trong thuộc tính thẻ. :-)
Leniel Maccaferri

11
Fiddle không hoạt động cho Safari 6.0.5 (7536.30.1), Chrome 31.0.1604.0 hoàng yến trên Mac OS X.
Burak Erdem

16
Đã sửa lỗi : jsfiddle.net/6U5q2/270 Lưu ý đây là phiên bản v2.3.2. Không biết nếu nó hoạt động cho 3.x
Eric Freese

13
data-loading-textkhông được chấp nhận kể từ v3.3.5 và sẽ bị xóa trong v4.
Jonathan

2
@Jonathan Nếu nó không được dùng trong v3.3.5 thì cái gì thay thế cho cả hai sau v3.3.5 và v4?
PaladiN

322

Giải pháp đơn giản cho Bootstrap 3 bằng cách sử dụng hoạt hình CSS3.

Đặt phần sau vào CSS của bạn:

.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); }
}

Sau đó, chỉ cần thêm spinninglớp vào một glyphiconlúc đang tải để có được biểu tượng quay của bạn:

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

Dựa trên http://www.bootply.com/128062#

  • Lưu ý: IE9 trở xuống không hỗ trợ hoạt ảnh CSS3.

4
Có nên animationvà không -animation?
Andrey Mikhaylov - lolmaus 6/2/2015

3
Giải pháp tuyệt vời. Tôi đang gặp vấn đề với hoạt hình này trong Safari trên máy tính để bàn và trên iPad. Nó hiển thị biểu tượng nhưng không làm động nó. Bao giờ trải nghiệm một cái gì đó như thế?
JayhawksFan93

@ JayhawksFan93 có Tôi gần đây đã nhận thấy điều tương tự trong IE. Sẽ xem xét sớm
Flion 19/03/2015

2
câu trả lời đã được cập nhật animationthay vì -animation. Với sự thay đổi tốt trong FF và IE đối với tôi. Các hoạt hình firefox không nhìn rất mịn mặc dù.
Flion

1
+1. Tìm thấy một cái tương tự ở đây .... Đăng bài để ghi lại ...
Fr0zenFyr

66

Giờ đây đã có một plugin đầy đủ cho điều đó:

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


1
Xin chào @Eru Penkman. Sự khác biệt giữa bạn và bản gốc là gì?
Ivan Wang

Này Ivan, sắp xếp nhưng tôi chưa bao giờ cập nhật bản sao ladda của mình! Nó chỉ là bản gốc, tôi đã xóa bình luận trước đó của tôi. Xin lỗi vì điều đó!
roo2

13

Để làm cho giải pháp của @flion trông thực sự tuyệt vời, bạn có thể điều chỉnh điểm trung tâm cho biểu tượng đó để nó không bị lung lay lên xuống. Điều này có vẻ phù hợp với tôi ở một cỡ chữ nhỏ:

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

1
.glyphicon-refresh.spinning { transform-origin: 50% 58%; }làm việc cho tôi
oluckyman

hum, { transform-origin: 50% 49%; }giải quyết trong trường hợp của tôi khi tôi đang sử dụng cogthay thế.
Vitor Canova

Tôi cũng nhận thấy sự chao đảo, nhưng lý do để thay đổi những con số này là gì? Làm thế nào tôi nên điều chỉnh chúng?
elachell

2

Đây là giải pháp của tôi cho 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);

Hãy xem thử trên JSFiddle


1

Đây là của tôi, dựa trên hoạt ảnh thuần SVG và CSS. Đừng chú ý đến mã JS trong đoạn trích dưới đây, nó chỉ dành cho mục đích demo. Hãy thoải mái thực hiện những tùy chỉnh của bạn dựa trên cơ sở của tôi, thật dễ dàng.

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>

Cũng có sẵn trên CodePen: https://codepen.io/anon/pen/PeRazr


0

Dưới đây là một giải pháp css đầy đủ lấy cảm hứng từ Bulma. Chỉ cần thêm

    .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;
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.