スライダーを作った
- 記事公開
-
伏見稲荷神社/京都
-
伏見稲荷神社/京都
-
九份/台湾
-
鉄道博物館/埼玉
いつも大概ですが、3割増しくらいで有用性のない記事です。
ただ単に「
作る!!!」で作ったものを置いているだけで拡張性も解説もなく、改変方法も面倒です。やりたかったこと
- 一件のみ表示
- 前後ボタン対応
- スワイプ対応
- スワイプ時の移動値が小さい場合はスライドしない
- はみ出し部分は縁がぼやけるようにする
察しのいい人は「アレじゃん」ってなるかもしれないスライダー
余裕のあるときに色々追記するかもしれません。
source code
jQuery_プラグイン
- (function( $ ){
- $.fn.sgSlider = function(opt) {
- var set = $.extend({
- duration: 100,
- easing: 'swing',
- swipe: 10,
- first: 0
- },opt);
- var pc = (window.ontouchstart!==null)?true:false;
- var click = {
- start: pc ? 'mousedown':'touchstart',
- move: pc ? 'mousemove':'touchmove',
- end: pc ? 'mouseup mouseleave':'touchend'
- }
- function clickData(e) {
- return pc?e||window.event:e.originalEvent.touches[0];
- }
- function rangeInt(n,min,max){
- if( n<min ) return min;
- if( n>max ) return max;
- return n;
- }
- return this.each(function(){
- var $group = $(this);
- var $wrp = $group.find('[name="slider"]');
- var $tgt = $wrp.children();
- var $li = $tgt.children();
- var $prev = $group.find('[name="prev"]');
- var $next = $group.find('[name="next"]');
- var data = {
- w: 0,
- s: 0,
- l: $li.length-1,
- p: $tgt.css('position')
- };
- var flg = {
- n: -1,
- p: 0,
- c: false,
- s: false
- };
- function slide(n,t) {
- var b = flg.n;
- flg.n = rangeInt(n+b,0,data.l);
- flg.p = $li.eq(flg.n).position().left * -1;
- var css = {left:flg.p};
- if( t ) $tgt.css(css);
- else $tgt.animate(css,set.duration,set.easing);
- if( b==flg.n && !t ) return true;
- if( $next.length && check(data.l) )
- $next.toggleClass('false');
- if( $prev.length && check(0) )
- $prev.toggleClass('false');
- function check(p){ return ( b==p||flg.n==p )}
- }
- $tgt.css({
- 'position':data.p=='static'?'relative':data.p,
- 'display' :'inline-flex'
- });
- $(window).on('resize',function(){
- var w = $wrp.width();
- if( w == data.w ) return true;
- if( set.swipe ) data.s = w/set.swipe;
- data.w = w;
- $li.outerWidth(w);
- slide(flg.n<0?(set.first=='last'?data.l:set.first)+1:0,true);
- }).trigger('resize');
- $tgt.on(click.start,function(e){
- e = clickData(e);
- if( pc && e.button ) return true;
- flg.c = e.clientX;
- }).on(click.move,function(e){
- if( !set.swipe || !flg.c ) return true;
- e.preventDefault();
- e = clickData(e);
- flg.s = e.clientX;
- $tgt.css({left:flg.s-flg.c+flg.p});
- }).on(click.end,function(e){
- if( !flg.c ) return true;
- if( flg.s ) {
- var m = flg.c-flg.s;
- slide(Math.abs(m)<data.s?0:(m<0?-1:1));
- flg.s = false;
- }
- flg.c = false;
- });
- if($prev.length) $prev.on('click',function(){slide(-1)});
- if($next.length) $next.on('click',function(){slide( 1)});
- });
- };
- })( jQuery );
jQuery_呼び出し
- $('#demo').sgSlider();
HTML_必要最小限
- <div id="demo">
- <div name="slider">
- <ul>
- <li>スライド1</li>
- <li>スライド2</li>
- <li>スライド3</li>
- <li>スライド4</li>
- <li>スライド5</li>
- </ul>
- </div>
- <span name="prev">前へ</span>
- <span name="next">次へ</span>
- </div>
CSS_はみ出し部分の制御
- [name="slider"] {
- --fade-w: 5px;
- --fade-g: linear-gradient(90deg,transparent,#000 var(--fade-w),#000 calc( 100% - var(--fade-w) ),transparent);
- margin: 0 calc( var(--fade-w) * -1 );
- padding: 0 var(--fade-w);
- overflow: hidden;
- -webkit-mask: var(--fade-g);
- mask: var(--fade-g);
- }