ポイントを使ったり、増やしたりしたときに、結果のポイント数に差し替えるのではなくて、カウントアップしたり、カウントダウンして動的に動かそうと思って作ってみた。
補足1 jQueryを使っています。ただし要素の値を更新するところと表示エリアをクリックしたときにカウントアップ/カウントダウンを終了するところの2箇所だけなので、jQueryを使わない場合は適宜差し替えてもらえれば。
補足2 数字を渡している引数については、値が整数かの確認に、Number.isInteger を利用している。IEは未対応なので、IEにも対応させる場合は、別の判別方法を追加するか、判別処理のif文自体を削除するか、この例のようにIEの場合はカウントアップ/カウントダウンしないように割り切るか。
/**
* カウントアップ/カウントダウン
* (MEMO) Number.isInteger: 値が整数か判別する(IEは未対応)
*
* @param {object} *tgt: 要素
* @param {number} *st: スタートの数字(整数のみ)
* @param {number} *ed: エンドの数字(整数のみ)
* @param {number|function|object} param:
* {number} カウントアップのスピード(ミリ秒、デフォルト1秒、整数のみ)
* {function} カウント終了時に実行する関数
* {object}
* {number} speed: カウントアップのスピード(ミリ秒、デフォルト1秒)
* {number} unit: カウントアップする量(デフォルト1、整数のみ)
* {function} func: カウント終了時に実行する関数
* {boolean} is_not_click: カウント表示領域をクリックしてカウント終了できるようにするかどうか(デフォルトfalse)
*
* @return なし
*/
const countup = function(tgt, st, ed, param) {
let n = st,
speed = 1000,
unit = 1,
func = null,
countup = null,
is_not_click = false,
is_up;
// param が指定されている場合に上書きする
switch (true) {
case Number.isInteger(param):
speed = param;
break;
case typeof param == "function":
func = param;
break;
case typeof param == "object":
if (Number.isInteger(param["speed"])) {
speed = param["speed"];
}
if (Number.isInteger(param["unit"])) {
unit = param["unit"];
}
if (typeof param["func"] == "function") {
func = param["func"];
}
is_not_click = param["is_not_click"];
break;
default:
// なし
}
/**
* カウントした値の表示
*/
function countuping() {
tgt.html(n);
// カウント終了か判別する
if ((is_up && ed <= n) || (!is_up && ed >= n)) {
// カウントオーバーした場合に備えて上書きする
n = ed;
tgt.html(n);
if (func) func();
} else {
// 次のカウントを実行する
n = (is_up)? n + unit: n - unit;
if (countup) clearTimeout(countup);
countup = setTimeout(countuping, speed);
}
}
// 要素があるか判別する
if (tgt.length > 0) {
// st, ed, speed が整数か判別する
if (Number.isInteger && Number.isInteger(st) && Number.isInteger(ed) && Number.isInteger(speed)) {
// カウントアップかダウンか判別する
is_up = (ed - st > 0)? true: false;
// カウントする
countuping();
} else {
// 最後の値に差し替える
tgt.html(ed);
if (func) func();
}
// 要素をクリックしたら、エンドの数字をセットする
if (!is_not_click) {
tgt.css({cursor: "pointer"}).on("click", function(){
n = ed;
countuping();
return false;
});
}
}
}
こだわったのは、第4引数。
利用シーンとしては、基本はスピードの設定か、カウント終了時に何か処理をさせたいかの場合と考え、整数やファンクションを渡した場合にそれぞれ機能するようにした。さらにカスタマイズする可能性を考慮し、引数を増やすのではなくオブジェクトを渡すようにして、汎用性を高め、細かい設定ができるようにした。
<span class="js-count-num"></span>
200から300まで、0.01秒ごとにカウントアップして、.js-count-num のhtml内に表示する場合
countup($(".js-count-num"), 200, 300, 10);
10から1秒ごとにカウントダウンして、0のときにStart!!と表示する場合
countup($(".js-count-num"), 10, 0, function(){
$(".js-count-num").html("Start!!");
});
この書籍の中で、ライティングのユーザビリティについて触れている項目があり、激しく共感する部分だったので、ここで備忘録としてピックアップする。 ・・・
この書籍は、I部 リサーチ、II部 デザイン、III部 インプリメンテーションと三部構成になっている。この記事では、その中から、I部 リサーチ、・・・
これを知ったときはマジか!と飛び跳ねた。あらためて思い返してみると、確かに公式チュートリアルでも触れていたことをうっすら思い出す。そしてそのときとやり方がなん・・・
試したことはまだないけど、Macで編集時と書き出し後で色味が変わって困ったときのために備忘録。 プロジェクト設定 > 「カラーマネジメント・・・
プロジェクト設定と環境設定について詳しく解説されている情報がなかなか見つからないので、要所要所で知り得た情報を更新していきます。 プロジェクト設定 ・・・
Clipyが超絶便利そうだったので、macOS Big Sur にインストール&再起動して使ってみた。ところが、command + c を複数の箇所で行い、c・・・
requestAnimationFrame をはじめて見たので調べていたら、setTimeout や setInterval は requestAnimati・・・
6年ぶりに読み返したが、今なおハッとさせられることが多く見つかる。 この本で忘れないようにしたい項目をピックアップするだけでも役に立ちそ・・・
この記事では、以前に読んだ際に付箋を付けていたが、その部分だけを備忘録としてピックアップするため、本の要約ではない。実際は、何倍も濃い内容で、練・・・
もう一回、全部読み返したいところだが、書籍がありすぎるので、当時付箋紙をつけていたところだけをピックアップ。書籍内ではより具体的な説明があるので・・・
変数bnにphpファイルのファイル名を拡張子なしで取得するサンプル $bn = basename($_SERVER['PHP_SELF'], ".php");・・・
sassファイルを保存すると、cssファイルが自動生成されるという症状でしばらくの間、ストレスだったがようやく解決。 例えば、var.scssを修正して保存す・・・
記述方法は間違いないのに、文字化けしてしまう。 xhtmlはutf-8で宣言していたのだが、Javascriptで記述された日本語がブラウザで確認すると文字化け・・・
変数bnにhtmlファイルのファイル名を拡張子なしで取得するサンプル var bn = location.href.split("/"); bn = bn[b・・・
ローカル環境はMAMPを使いました。 データベースを作成する MAMPを起動し、「サーバを起動」後、「オープンWebStartの」をクリックします。 「ツ・・・
xhtmlソース <div> <ul><!-- --><li><img alt="navi1" />・・・
Webサイトに動画を利用する際には、2017年8月時点では、webmとmp4とどちらにも対応していない場合の静止画像を用意して置くことにしている。 動画を違う拡・・・
正しいCSSを記述しているにもかかわらず、表示が崩れることがある。ブラウザによる解釈の違い(バグ)が原因であるが、IE5や古いブラウザにバグが見られる。・・・
iBook G4(OS10.3.x)がある。Safariのバージョンは、1.xだ。2は10.4にしないと使えない。もっと詳しく言えば、10.4.10以下でないと・・・
ブラウザ、モバイルファースト、メディアクエリー、マルチ画面、タブレット・・・ 想定すべき画面サイズ、利用シーンに適した情報のコントロールが崩壊しつつある。 とい・・・
「test」
「>ころころさん コメントありがとうございます! 確かに、APIドキュメント見ましたが、ライブに関する情報は今のところ取得できないようですね。 インスタライ・・・」
「SIGMAから超軽量で明るい単焦点レンズが2本発売になりましたので、リストにレンズ情報追加しました!」
「>名無しさん ご指摘、ありがとうございます! 記事冒頭の「まずはサンプル」のサンプルが動いていませんでしたので修正しました。」
「>前田さん コメントありがとうございます。 環境は分かりかねますが、修正したいファイルのパーミッションを604や644に変更すると書き込みできるようになります(・・・」
「アバターを取得する「get_avatar」についても追記しました!」
「「値をクリアする」を追加しました。チェックボックスやラジオボタンの値を何も選択していない状態に戻すときについて触れています。」
「>匿名さん コメントありがとうございます。 サンプルでは、beforeは何も処理していないので期待する表示にならない、で正解です。 クリックした後が、対応・・・」
「(匿名)さん コメントありがとうございます。何も設定変更していないのに、それまで使用できていたサーバーが突然使えなくなるのは辛いですよね、、。 ここで紹介したや・・・」
「コメントありがとうございます! そもそもできるかはわかりませんが、ソースを書き換える必要はあります。 下記記事などが参考になるかもしれません。 illustra・・・」
WEB制作マークアップJavaScriptカウントアップ、カウントダウンするJavaScript | シンプルシンプルデザイン