Twitterのスピナーを作成しようとしているBootstrapボタン。スピナーは進行中の作業(つまり、ajaxリクエスト)を示す必要があります。
ここに小さな例があります: http://jsfiddle.net/AndrewDryga/zcX4h/1/
HTML(jsfiddleでフル):
Unknown element (no animation here!):
<p>
<button class="btn-success has-spinner">
<span class="spinner"><i class="icon-spin icon-refresh"></i></span>
Foo
</button>
</p>
Works when width is defined:
<p>
<a class="btn btn-success has-spinner">
<span class="spinner"><i class="icon-spin icon-refresh"></i></span>
Foo
</a>
</p>
CSS:
.spinner {
display: inline-block;
opacity: 0;
width: 0;
-webkit-transition: opacity 0.25s, width 0.25s;
-moz-transition: opacity 0.25s, width 0.25s;
-o-transition: opacity 0.25s, width 0.25s;
transition: opacity 0.25s, width 0.25s;
}
/* ... */
.has-spinner.active .spinner {
opacity: 1;
width: auto; /* This doesn't work, just fix for unkown width elements */
}
/* ... */
.has-spinner.btn.active .spinner {
width: 16px;
}
.has-spinner.btn-large.active .spinner {
width: 19px;
}
対処法は、css "margin:auto"は期待されるアニメーションを生成せず、すべての要素のスピナー幅はcssを介して定義する必要があるということです。この問題を解決する方法はありますか?また、スピナーを整列/表示するより良い方法がありますか?
そして、ボタンのパディングで遊んで、スピナーが表示されたり、幅を変更するボタンが大丈夫なときに、ボタンの幅が変わらないようにする必要がありますか? (病気の場合、スニペットとしてどこかに配置する)
幅の代わりにmax-widthを使用して、この問題を修正できました。また、これは純粋なCSSソリューションであるため、ほぼすべての場所で使用できます(たとえば、タグにXマークを表示する、ユーザーがマウスポインターを重ねるなど)。
デモ: http://jsfiddle.net/AndrewDryga/GY6LC/
新しいCSS:
.spinner {
display: inline-block;
opacity: 0;
max-width: 0;
-webkit-transition: opacity 0.25s, max-width 0.45s;
-moz-transition: opacity 0.25s, max-width 0.45s;
-o-transition: opacity 0.25s, max-width 0.45s;
transition: opacity 0.25s, max-width 0.45s; /* Duration fixed since we animate additional hidden width */
}
/* ... */
.has-spinner.active .spinner {
opacity: 1;
max-width: 50px; /* More than it will ever come, notice that this affects on animation duration */
}
@ andrew-dryga 現在最新のBootstrap(3.3.5)、font-awesome(4.3.0)、jQuery(2.1.3)を使用するソリューションを更新しました。 )わずかに変更しました。
ここにあります:
<button class="btn btn-success has-spinner">
<i class="fa fa-spinner fa-spin"></i>
Foo
</button>
$('a.has-spinner, button.has-spinner').click(function() {
$(this).toggleClass('active');
});
さらに、適切なCSSの変更が必要です( JSFiddle )。
私のために働いた非常に簡単な解決策は、要素を
<i></i>
with
<em></em>
これが私が行った唯一の変更でした。
あなたのコードは非常に役立つことがわかりました。 1年が経過したことは知っていますが、コードを改善しました。 span要素とiタグを各要素に手動で追加する必要がありませんでした。 JavaScriptコードを調整して、これらのタグを自動的に追加しました。ボタン/リンクにスピナーを追加するには、has-spinnerクラスを追加してdata-spinner = "[left | right]"タグ(ボタンテキストのどちら側にスピナーを決定するか)を追加するだけです。配置する必要があります)。
変更されたJavaScriptは次のとおりです。
$(function(){
var spinnerHTML = "<span class='spinner'><i class='fa fa-refresh fa-spin'></i></span>",
spinnerObjects = $(".has-spinner");
spinnerObjects.filter("[data-spinner=left]").prepend(spinnerHTML + " ")
spinnerObjects.filter("[data-spinner=right]").append(" " + spinnerHTML)
spinnerObjects.click(function() {
$(this).toggleClass('active');
});
});
すべての変更(CSS、HTML)を含むフィドルへのリンクは次のとおりです。