sikaku

スライダーを作った

  • 伏見稲荷神社/京都
  • 伏見稲荷神社/京都
  • 九份/台湾
  • 鉄道博物館/埼玉

いつも大概ですが、3割増しくらいで有用性のない記事です。

ただ単に「こういう動きのスライダー作る!!!」で作ったものを置いているだけで拡張性も解説もなく、改変方法も面倒です。

やりたかったこと
  • 一件のみ表示
  • 前後ボタン対応
  • スワイプ対応
  • スワイプ時の移動値が小さい場合はスライドしない
  • はみ出し部分は縁がぼやけるようにする

察しのいい人は「アレじゃん」ってなるかもしれないスライダー

余裕のあるときに色々追記するかもしれません。

source code

jQuery_プラグイン
  1. (function( $ ){
  2. $.fn.sgSlider = function(opt) {
  3. var set = $.extend({
  4. duration: 100,
  5. easing: 'swing',
  6. swipe: 10,
  7. first: 0
  8. },opt);
  9. var pc = (window.ontouchstart!==null)?true:false;
  10. var click = {
  11. start: pc ? 'mousedown':'touchstart',
  12. move: pc ? 'mousemove':'touchmove',
  13. end: pc ? 'mouseup mouseleave':'touchend'
  14. }
  15. function clickData(e) {
  16. return pc?e||window.event:e.originalEvent.touches[0];
  17. }
  18. function rangeInt(n,min,max){
  19. if( n<min ) return min;
  20. if( n>max ) return max;
  21. return n;
  22. }
  23. return this.each(function(){
  24. var $group = $(this);
  25. var $wrp = $group.find('[name="slider"]');
  26. var $tgt = $wrp.children();
  27. var $li = $tgt.children();
  28. var $prev = $group.find('[name="prev"]');
  29. var $next = $group.find('[name="next"]');
  30. var data = {
  31. w: 0,
  32. s: 0,
  33. l: $li.length-1,
  34. p: $tgt.css('position')
  35. };
  36. var flg = {
  37. n: -1,
  38. p: 0,
  39. c: false,
  40. s: false
  41. };
  42. function slide(n,t) {
  43. var b = flg.n;
  44. flg.n = rangeInt(n+b,0,data.l);
  45. flg.p = $li.eq(flg.n).position().left * -1;
  46. var css = {left:flg.p};
  47. if( t ) $tgt.css(css);
  48. else $tgt.animate(css,set.duration,set.easing);
  49. if( b==flg.n && !t ) return true;
  50. if( $next.length && check(data.l) )
  51. $next.toggleClass('false');
  52. if( $prev.length && check(0) )
  53. $prev.toggleClass('false');
  54. function check(p){ return ( b==p||flg.n==p )}
  55. }
  56. $tgt.css({
  57. 'position':data.p=='static'?'relative':data.p,
  58. 'display' :'inline-flex'
  59. });
  60. $(window).on('resize',function(){
  61. var w = $wrp.width();
  62. if( w == data.w ) return true;
  63. if( set.swipe ) data.s = w/set.swipe;
  64. data.w = w;
  65. $li.outerWidth(w);
  66. slide(flg.n<0?(set.first=='last'?data.l:set.first)+1:0,true);
  67. }).trigger('resize');
  68. $tgt.on(click.start,function(e){
  69. e = clickData(e);
  70. if( pc && e.button ) return true;
  71. flg.c = e.clientX;
  72. }).on(click.move,function(e){
  73. if( !set.swipe || !flg.c ) return true;
  74. e.preventDefault();
  75. e = clickData(e);
  76. flg.s = e.clientX;
  77. $tgt.css({left:flg.s-flg.c+flg.p});
  78. }).on(click.end,function(e){
  79. if( !flg.c ) return true;
  80. if( flg.s ) {
  81. var m = flg.c-flg.s;
  82. slide(Math.abs(m)<data.s?0:(m<0?-1:1));
  83. flg.s = false;
  84. }
  85. flg.c = false;
  86. });
  87. if($prev.length) $prev.on('click',function(){slide(-1)});
  88. if($next.length) $next.on('click',function(){slide( 1)});
  89. });
  90. };
  91. })( jQuery );
jQuery_呼び出し
  1. $('#demo').sgSlider();
HTML_必要最小限
  1. <div id="demo">
  2. <div name="slider">
  3. <ul>
  4. <li>スライド1</li>
  5. <li>スライド2</li>
  6. <li>スライド3</li>
  7. <li>スライド4</li>
  8. <li>スライド5</li>
  9. </ul>
  10. </div>
  11. <span name="prev">前へ</span>
  12. <span name="next">次へ</span>
  13. </div>
CSS_はみ出し部分の制御
  1. [name="slider"] {
  2. --fade-w: 5px;
  3. --fade-g: linear-gradient(90deg,transparent,#000 var(--fade-w),#000 calc( 100% - var(--fade-w) ),transparent);
  4. margin: 0 calc( var(--fade-w) * -1 );
  5. padding: 0 var(--fade-w);
  6. overflow: hidden;
  7. -webkit-mask: var(--fade-g);
  8. mask: var(--fade-g);
  9. }