JqueryとCSSでローディング画像

読み込み中のグルグル画像を出しておきたい。できれば画像ファイルを使わずに。

作成日:2017-12-07, 更新日:2019-05-17

特定のリンク等をトリガーにして、ローディングを表示させる。

▼Jquery側

(function($) {
  $.extend({
    /** オプション(連想配列)から値のセット **/
    getOpt: function(opt, key, defVal) {
      var defVal = $.getDefValNoArg(defVal, '');
      
      var tmpVal = defVal;
      if ( opt!=null && opt!=undefined ) {
        if ( opt[key]!=null && opt[key]!=undefined ) {
          if ( opt[key]!='' || opt[key]===true || opt[key]===false ) {
            tmpVal = opt[key];
          }
        }
      }
      return tmpVal;
    },
    
    /** 引数が無い時は初期値を返す **/
    getDefValNoArg: function(tmpArg, defVal) {
      var defVal = (defVal!=null && defVal!=undefined)? defVal: '';
      return (tmpArg!=null && tmpArg!=undefined)? tmpArg: defVal;
    }
    
  });
})(jQuery);

/** ローディング **/
var objLoading = function(opt) {
  var self = this;
  self.id = 'idLoad';
  
  self.delLoding = function() {
    $('#'+self.id).remove();
  }
  
  self.setLoding = function() {
    // ローディングCSS:https://codepen.io/Manoz/pen/pydxK
    var html = '<div id="'+self.id+'"><div class="ring-2"><div class="ball-holder"><div class="ball"></div></div></div></div>';
    $('body').append(html);
  }
  
  var hackElmCss = function(elm, val) {
    var style = elm + ':' + val + ';'
              + '-moz-' + elm + ':' + val + ';'
              + '-webkit-' + elm + ':' + val + ';';
    return style;
  }
  var hackKeyframes = function(elm, val) {
    var style = '@keyframes ' + elm + '{' + val + '}'
              + '@-moz-keyframes ' + elm + '{' + val + '}'
              + '@-webkit-keyframes ' + elm + '{' + val + '}';
    return style;
  }
  var setCss = function(opt) {
    var defW = $.getOpt(opt, 'defW', 20);            // ベースになるサイズ
    var colBig = $.getOpt(opt, 'colBig', '#4b9cdb'); // 大きい円
    var colSml = $.getOpt(opt, 'colSml', '#4282B3'); // 小さい円
    var rateBig    = $.getOpt(opt, 'rateBig', 10);   // 大きい円とベースサイズの比率
    var rateborder = $.getOpt(opt, 'rateborder', 1); // 大きい円の線とベースサイズの比率
    var rateSml    = $.getOpt(opt, 'rateSml', 3);    // 小さい円とベースサイズの比率
    
    var key000 = hackElmCss('transform', 'rotate(0deg)');
    var key100 = hackElmCss('transform', 'rotate(360deg)');
    var cssKeyFrame = hackKeyframes('loadingCss', '0{'+key000+'}100%{'+key100+'}');
    
    var style = 'html,body{height:100%;margin:0;}body{position:relative;top:0;left:0;}'
              + '#'+self.id+'{background-color:rgba(0,0,0,0.8);position:fixed;top:0;left:0;width:100%;height:100%;}'
              + '#'+self.id+' .ring-2{'
              + 'position:relative;top:50%;left:50%;border-radius:100%;'
              + hackElmCss('transform','translate(-50%,-50%)')
              + 'width:'+(defW*rateBig)+'px;height:'+(defW*rateBig)+'px;'
              + 'border:'+(defW*rateborder)+'px solid '+colBig+';'
              + '}'
              + '#'+self.id+' .ball-holder{position:absolute;width:100%;height:1px;left:0;'
              + 'top:50%;'
              + '}'
              + cssKeyFrame
              + '#'+self.id+' .ball-holder{'
              + hackElmCss('animation-name','loadingCss')
              + hackElmCss('animation-duration','1.3s')
              + hackElmCss('animation-timing-function','linear')
              + hackElmCss('animation-delay','0s')
              + hackElmCss('animation-iteration-count','infinite')
              + '}'
              + '#'+self.id+' .ball{position:absolute;border-radius:100%;'
              + 'top:-'+(defW*rateSml/2)+'px;'
              + 'left:-'+(defW*rateSml/2+(defW*rateborder/2))+'px;'
              + 'width:'+(defW*rateSml)+'px;'
              + 'height:'+(defW*rateSml)+'px;'
              + 'background:'+colSml+';'
              + '}';
    $('body').append('<style>'+style+'</style>');
  }
  
  var init = function(opt){
    self.loading = $.getOpt(opt, 'loading', self.id);
    setCss(opt);
  }
  init(opt);
}

HTML側

<script>
  window.onunload = function(){};
  var objLoad = new objLoading();
  $(〇〇〇).on('click', '〇〇〇', function(){ objLoad.setLoding() });
</script>

※「window.onunload = function(){};」が無いとFirefoxでブラウザの「戻る」で戻ってきたとき、ローディングが出た状態になってしまう。

css

JqueryでCSSを出力しているので不要だけど・・・下記のような感じのCSSになっている。

html,body{
  height:100%;
  margin:0;
}
body{
  position:relative;
  top:0;
  left:0;
}
#idLoad{
  background-color:rgba(0,0,0,0.8);
  position:fixed;
  top:0;
  left:0;
  width:100%;
  height:100%;
}
#idLoad .ring-2{
  position:relative;
  top:50%;
  left:50%;
  border-radius:100%;
  transform:translate(-50%,-50%);
  -moz-transform:translate(-50%,-50%);
  -webkit-transform:translate(-50%,-50%);
  width:200px;
  height:200px;
  border:20px solid #4b9cdb;
}
#idLoad .ball-holder{
  position:absolute;
  width:100%;
  height:1px;
  left:0;
  top:50%;
}
@keyframes loadingCss{
  0{
    transform:rotate(0deg);
    -moz-transform:rotate(0deg);
    -webkit-transform:rotate(0deg);
  }
  100%{
    transform:rotate(360deg);
    -moz-transform:rotate(360deg);
    -webkit-transform:rotate(360deg);
  }
}
@-moz-keyframes loadingCss{
  0{
    transform:rotate(0deg);
    -moz-transform:rotate(0deg);
    -webkit-transform:rotate(0deg);
  }
  100%{
    transform:rotate(360deg);
    -moz-transform:rotate(360deg);
    -webkit-transform:rotate(360deg);
  }
}
@-webkit-keyframes loadingCss{
  0{
    transform:rotate(0deg);
    -moz-transform:rotate(0deg);
    -webkit-transform:rotate(0deg);
  }
  100%{
    transform:rotate(360deg);
    -moz-transform:rotate(360deg);
    -webkit-transform:rotate(360deg);
  }
}
#idLoad .ball-holder{
  animation-name:loadingCss;
  -moz-animation-name:loadingCss;
  -webkit-animation-name:loadingCss;
  animation-duration:1.3s;
  -moz-animation-duration:1.3s;
  -webkit-animation-duration:1.3s;
  animation-timing-function:linear;
  -moz-animation-timing-function:linear;
  -webkit-animation-timing-function:linear;
  animation-delay:0s;
  -moz-animation-delay:0s;
  -webkit-animation-delay:0s;
  animation-iteration-count:infinite;
  -moz-animation-iteration-count:infinite;
  -webkit-animation-iteration-count:infinite;
}
#idLoad .ball{
  position:absolute;
  border-radius:100%;
  top:-30px;
  left:-40px;
  width:60px;
  height:60px;
  background:#4282B3;
}

関連項目

javascript ブラウザの「戻る」で前のページのjquery等が実行されたままなので防ぐ

サンプル

CSS+jqueryで画面全体をローディングで覆う
CSS+jqueryで指定箇所をローディングに差替える