Jquery kütüphanesi kullanarak hem PC hem Mobil üzerinde kaydırma işlemi yapılabilen, harici bir eklentiye gerek duymadan tamamen kendi kodlamamız ile çalışan mobil uyumlu, responsive dokunmatik slider yapımını göreceğiz. Yazının en altındaki vereceğim bağlantıya tıklayarak sliderin çalışma halini indirebilir, istediğiniz düzenlemeyi yapabilirsiniz.
Dokunmatik Slider Görünümü
Büyük ve küçük slider olmak üzere 2 çeşit slider görünümü var diyebiliriz. Aslında yükseklik değeri azalınca kendi kendine bu görünüm oluşuyor. Media etiketleri ile cihazlara göre biraz daha farklı bir görünüm elde edebiliyoruz.
Slider içerisinde 2 sayfalama tipi bulunmakta. İlk sayfa tipinde sayfa ikiye bölünüp sol tarafın yazı kısmı olması, sağ tarafın resim kısmı olması.
İkinci sayfa tipinde ise arka plana resim eklemek, yazının ise sayfaya ortalanmış halde olması.
Kodlamaya geçelim.
Slider Kodlama
Slider için jquery kütüphanesini kullanıyoruz. Kod satırlarında uygulamanın işleyişiyle ilgili gerekli açıklamarı mevcut
HTML Kodu
Sliderin alt kısmında slider sayfalarını temsil eden slider butonları bulunmakta. Bu butonlar daha sonra özelleşebilir, her biri için ayrı resim, stil kullanılabileceğinden otomatik olarak değil de ayrı olarak html içerisinde bulunmasını daha uygun gördüm.
CSS Kodu
Sliderin kendisi responsive özelliği taşıyor. Slider içerinde yazılar ve resimler yatay ve dikey olarak ortalanıyor, resimler sliderin boyutuna göre otomatik küçülüp büyüyor. Ancak sayfa görünümü değiştikçe ufak çapta bazı görünüm bozuklukları olabiliyor. Bunu kodların en altında olan media etiketleri ile aşıyoruz.
body{
font-family:sans-serif;
}
ol, ul {
list-style: none;
}
/*----------Slider----------*/
.my-simple-slider {
position: relative;
overflow: hidden;
padding-left: 0;
padding-right: 0;
margin-bottom:0;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none; /*Belirtilen yerde (özellikle yazıda) seçim yapma*/
box-shadow:
0px 11px 8px -10px #f1f1f1,
0px -11px 8px -10px #f1f1f1;
width:100%;
}
.my-simple-slider li {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
transform: translateX(100%);
cursor: move;
}
.my-simple-slider li.selected { /*secilen sayfa, aktif sayfa*/
position: relative;
transform: translateX(0)
}
.my-simple-slider li.move-left { /*gecis yonu efekti*/
transform: translateX(-100%)
}
.my-simple-slider li.is-moving,
.my-simple-slider li.selected { /*gecis efektinin yavasligi*/
transition: transform .5s
}
.my-simple-slider .mys-full-width, /*ful ekran slider sayfa*/
.my-simple-slider .mys-harf-width { /*iki bolmeli slider sayfa*/
position: absolute;
width: 100%;
height: 100%;
z-index: 1;
left: 0;
top: 0;
text-align: center;
backface-visibility: hidden;
display: table;
table-layout: fixed;
}
.my-simple-slider .mys-harf-width {
width: 50%;
float: left;
position: relative;
}
.my-simple-slider h2,
.my-simple-slider p {
margin: 0 auto 10px;
width: 90%;
text-shadow:0px 1px 5px #ccc
}
.my-simple-slider h2 {
font-size: 24px
}
.my-simple-slider p {
font-size: 17px;
}
.my-simple-slider .mys_content { /*slider sayfa icerik*/
display: table-cell;
vertical-align: middle;
}
.my-simple-slider .mys_content img { /*slider icerisindeki resim*/
position:absolute;
top:0;
bottom:0;
right:0;
max-height:100%;
max-width:100%;
/* resim ortala */
display:block;
margin: auto;
user-drag: none;
user-select: none;
-moz-user-select: none;
-webkit-user-drag: none;
-webkit-user-select: none;
-ms-user-select: none;
}
.my-simple-slider .mys_content a{
color:#444
}
/*----------Slider Nav----------*/
.mys-slider-nav {
width: 100%;
text-align: center;
font-weight:700;
}
.mys-slider-nav li {
display: inline-block;
border-radius: 50%;
background: #f1f1f1;
margin: 8px;
}
.mys-slider-nav .selected {
background:#0377ef;
box-shadow:0px 0px 1px 0px #eaeaea;
}
.mys-slider-nav .selected a{
color:#fff
}
.mys-slider-nav a {
display: block;
padding: 10px 15px;
color: #444;
cursor: pointer;
}
.mys-slider-nav a::before {
top: 18px
}
/*----------Slider Device Views----------*/
@media (min-width: 1281px){
.mini-mys-slider{
height: 150px;
}
.big-mys-slider{
height: 380px;
}
/*
##Device = Desktops
##Screen = 1281px to higher resolution desktops
*/
}
@media (min-width: 1025px) and (max-width: 1280px){
.mini-mys-slider{
height: 150px;
}
.big-mys-slider{
height: 380px;
}
/*
##Device = Laptops, Desktops
##Screen = B/w 1025px to 1280px
*/
}
@media (min-width: 768px) and (max-width: 1024px){
.mini-mys-slider{
height: 150px;
}
.big-mys-slider{
height: 280px;
}
/*
##Device = Tablets, Ipads (portrait)
##Screen = B/w 768px to 1024px
*/
}
@media (min-width: 768px) and (max-width: 1024px) and (orientation: landscape){
.mini-mys-slider{
height: 150px;
}
.big-mys-slider{
height: 280px;
}
/*
##Device = Tablets, Ipads (landscape)
##Screen = B/w 768px to 1024px
*/
}
@media (min-width: 481px) and (max-width: 767px){
.mini-mys-slider{
height: 150px;
}
.big-mys-slider{
height: 260px;
}
/*
##Device = Low Resolution Tablets, Mobiles (Landscape)
##Screen = B/w 481px to 767px
*/
}
@media (max-width: 480px) {
.mini-mys-slider{
height: 150px;
}
.big-mys-slider{
height: 240px;
}
/*
##Device = Most of the Smartphones Mobiles (Portrait)
##Screen = B/w 320px to 479px
*/
}
JS Kodu
Slider geçişleri, üzerinde sağa yada sola yeterli bir ivmeyle kaydırılması, altında bulunan butonlara tıklanması ve otomatik geçiş olarak 3 şekilde oluyor. Otomatik geçiş özelliği slider etiketine ‘mys-autoplay’ class ismi girilerek atanabiliyor, her sliderde kullanılması istenmeyebilir. Koda geçelim. Kodları ilk olarak anlatarak parça parça daha sonra da en alta tüm olarak hepsini birden ekleyeceğim. Kod satırlarında gerekli açıklamalar da mevcut.
İlk olarak web sayfasında slider var mı kontrol edelim. Varsa if koşulu içerisinde slider kodlarımızı çalıştıralım. Slider kodlamamız içerisinde kullanacağımız değişkenleri oluşturuyoruz. Otomatik geçişi sağlayan ‘setAutoplay’ fonksiyonuna da bekleme süresini parametre olarak göndererek çalıştırıyoruz.
if ($(".my-simple-slider").length > 0) {
var slidesWrapperLi = $(".my-simple-slider li"),
autoPlayId = {}, //her slider icin ayri gecis ozelliginin tutuldugu dizi
ts,te,upDown = 0, //ts: tiklandiginde ve basili tutultugunda, te: tiklama, dokunma kaldirildiginde, upDown=1 ise tiklandi, upDown=0 ise birakildi
autoPlayDelay = 5000; //gecis bekleme suresi
setAutoplay(autoPlayDelay); //otomatik gecis
}
Slider ileri ve geri yönlendirmesi için aşağıdaki fonksiyonları kullanacağız. Sliderin aşağısında bulunan slider sayfa butonlarına tıklama, sağa sola kaydırma veya otomatik geçişte bu fonksiyonlar kullanılacak. Aktif seçili olan sayfanın önünde yada arkasındaki sayfaya göre ‘nextSlide’ veya ‘prevSlide’ fonksiyonu çalışacak. Ayrıca sliderda aktif olan sayfa son sayfa ise ilk sayfaya dönmek için ‘prevSlide’, ilk sayfa ise son sayfaya gitmek için ‘nextSlide’ fonksiyonu kullanılacak.
Bu fonksiyonlar ile parametre olarak geçiş yapılan, aktif olacak sayfayı temsil eden ‘visibleSlide’ değeri, o sayfanın sliderini temsil eden ‘container’ değeri ve geçiş yapılan sayfanın diğer sayfalara göre konumunu belirten ‘n’ index değeri alınıyor.
Aktif olan sayfanın index id alınarak bu sayfanın ‘selected’ class özelliği silinecek ve önündeki yada arkasındaki sayfaya ‘selected’ class eklenerek aktif sayfa yapılacak, diğer sayfalara da ‘move-left’ class değeri verilerek hareket efekti verilecek ve sayfalarda geçiş yapılacak.
function nextSlide(visibleSlide, container, n){ //sayfalar arasi sagdan sola gecis efekti
visibleSlide.removeClass("selected").addClass("is-moving").one("webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend", function(){
$(this).css("left","0px");
}); //sayfalar arasi gecis efekti
var selectedLi = container.children("li").eq(n); //tiklanilan sayfa
selectedLi.addClass("selected").prevAll().addClass("move-left"); //secili, aktif hale getir, diger butun sayfalari pasif yap
}
function prevSlide(visibleSlide, container, n){ //sayfalar arasi soldan saga gecis efekti
visibleSlide.removeClass("selected").addClass("is-moving").one("webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend", function(){
$(this).css("left","0px");
}); //sayfalar arasi gecis efekti
var selectedLi = container.children("li").eq(n); //tiklanilan sayfa
selectedLi.addClass("selected").removeClass("move-left").nextAll().removeClass("move-left"); //secili, aktif hale getir, diger butun sayfalari pasif yap
}
Sayfalar arası geçiş olduğunda sliderin altında bulunan butonların güncellenmesi gerekecek. Parametre olarak geçiş yapılan sliderin butonlarının bulunduğu container nesnesini temsilen ‘pagination’ ve aktif olan slider sayfayı temsilen ‘n’ değeri geliyor. Bu verilere göre istenilen buton grubundan istenilen sıradaki butonu seçili hale getiriyoruz.
function updateSliderNavigation(pagination, n) { //slider menu buton
var navigationDot = pagination.find(".selected"); //butonlarda secili, aktif, selected butonu bul
navigationDot.removeClass("selected"); //selected classı sil
pagination.find("li").eq(n).addClass("selected"); //gecis yapilan, yeni aktif olan slider sayfanin butonuna selected class ekle, aktif yap
}
Ardından slider üzerinde otomatik geçiş yapılmasını sağlayan fonksiyonları ekliyoruz. İki parametre ile çalışabilir ancak sürükle bırak veya butonlara tıklama yoluyla manuel olarak slider üzerinde sayfalar arası geçiş yapılmak istenirse ikinci parametre ile geçiş yapılmak istenen sliderin container elemanını alıyoruz ve sadece bu slider üzerindeki otomatik geçiş ayarlamalarını güncelliyoruz.
function setAutoplay(delay,slidesWrapper) { //class="mys-autoplay" degerine sahip slider elemanlara otomatik gecis ozelligi
slidesWrapper = slidesWrapper?slidesWrapper:""; //ie hatasi cozumu
/*
slidesWrapper: Gecis yapmak istenilen, tiklanilan sayfanin slider nesnesi
bu deger var ise sayfada tiklanarak veya dokunarak gecis yapilmak istenmis demektir.
*/
if ($(".mys-autoplay").length > 0 && !slidesWrapper){ //site ilk yuklendiginde
var i=0;
$(".mys-autoplay").each(function(){ //otomatik gecis istenen butun slider elemanlarini gez
var slidesWrapper = $(this), //slideri al
mysID = ''; //autoPlayID icin kullanilacak, her slider icin belirtec id
if (!slidesWrapper.attr("id")){ //clearInterval isleminin basarili olmasi icin sliderlere id atamasi yapiyoruz, sadece sayfa yuklendiginde 1 kere calissin
mysID = "mys-id-"+i;
slidesWrapper.attr("id",mysID)
i++;
}
var sliderElementLength = slidesWrapper.children("li").length; //slider sayfa sayisi
/*
her slider icin otomatik gecis dongu islemi ayri ayri uygulansin ve bu islem bir diziye aktarilsin
slider menuye veya slidere tiklanilip sayfalar arasi gecis yapilmak istenir ise bu dizi degerleri uzerinden
erisim saglayip, o ssliderin slider gecis silecegiz ve tekrar olusturacagiz
yani her slider icin gecis efekti bekleme suresini guncelliyoruz.
Boylelikle gecis efekti hatasi olmayacak, sliderlar arasi gecis karisikligi olmayacak
*/
/*
site acildiginde otomatik gecis guncellenir ve aktif olur
autoPlayDelay degerine yazilan saniye kadar sonra otomatik olarak sayfa gecisleri baslar
*/
autoPlayId[mysID] = window.setInterval(function(){ //autoPlayDelay saniye de bir autoplaySlider fonksiyonu calisir
autoplaySlider(slidesWrapper,sliderElementLength)
}, autoPlayDelay); //autoPlayDelay deki saniye degeri kadar otomatik gecis bekleme suresi
});
}else if ($(".mys-autoplay").length > 0 && slidesWrapper && slidesWrapper.hasClass("mys-autoplay")){ //sayfaya tiklanildiginde
var mysID = slidesWrapper.attr("id"),
sliderElementLength = slidesWrapper.children("li").length;
clearInterval(autoPlayId[mysID]); //sayfa gecisi yapilmak istenen slider uzerindeki gecis efekti sıfırlansin, silinsin
/*
sayfa tiklenilip gecis yapildiginde otomatik gecis guncellenir ve aktif olur
autoPlayDelay degerine yazilan saniye kadar sonra otomatik olarak sayfa gecisleri baslar
*/
autoPlayId[mysID] = window.setInterval(function(){ //gecis efektini tekrar olusturalım
autoplaySlider(slidesWrapper,sliderElementLength)
}, autoPlayDelay);
}
}
function autoplaySlider(slidesWrapper,length) {
var selectedPosition = slidesWrapper.find(".selected").index();
if( selectedPosition < length - 1) {
selectedPosition +=1;
nextSlide(slidesWrapper.find(".selected"), slidesWrapper, selectedPosition); //ileri efekti verilsin
} else {
selectedPosition = 0;
prevSlide(slidesWrapper.find(".selected"), slidesWrapper, selectedPosition); //geri efekti verilsin
}
var sliderNav = slidesWrapper.next();
updateSliderNavigation(sliderNav, selectedPosition); //slider menu guncelle
}
Devamında slider butonlara tıklanıldığında sayfalar arası geçiş yapılmasını sağlayan aşağıdaki click eventli fonksiyonumuzu ekliyoruz.
$(".mys-slider-nav").on("click", "li", function(event){ //slider buton tiklanildiginde
event.preventDefault();
var selectedItem = $(this), //tiklanilan li etiketi
sliderNav = selectedItem.closest(".mys-slider-nav"), //tiklanilan sliderin menu buton kapsayici div
slidesWrapper = sliderNav.prev(), //tiklanilan slider
slidesNumber = slidesWrapper.children("li").length; //tiklanilan sliderin sayfa sayisi
if(!selectedItem.hasClass("selected")) { //tiklanilan sayfa selected olarak atanmadiysa, class i selected degil ise
var selectedPosition = selectedItem.index(), //tiklanilan li etiketinin index numarasini al
activePosition = slidesWrapper.find("li.selected").index(); //su an ki aktif slider sayfanin index id sini al
if( activePosition < selectedPosition) { //tiklanilan sayfa id degeri su an ki aktif sayfa id degerinden buyuk ise
nextSlide(slidesWrapper.find(".selected"), slidesWrapper, selectedPosition); //ileri efekti verilsin
} else { //degil ise
prevSlide(slidesWrapper.find(".selected"), slidesWrapper, selectedPosition); // geri efekti verilsin
}
updateSliderNavigation(sliderNav, selectedPosition); //slider menu guncellensin
setAutoplay(autoPlayDelay,slidesWrapper); //otomatik gecis guncellensin
}
});
Slider uygulamamız bu kodlama ile normal çalışır vaziyette. Bu uygulamaya jquery ile dokunmatik özelliğini vermemiz gerekiyor.
PC üzerinde veya mobil üzerinde sürükle bırak özelliğinin mantığı şu:
- Tıklama veya dokunma anındaki ekrandaki pozisyonun yatay olarak (x) piksel cinsinden konumunu alınır
- Tıklandıktan veya dokunduktan sonra elimizi kaldırdığımız andaki yatay konum alınır
- İkinci konum birinci konuma göre yatay olarak sağında yada solunda olduğu birbiriyle çıkarma işlemi yapılarak bulunur. Böylelikle sağa yada sola kaydırma işlemi yaptığı belirlenir. Ayrıca bu çıkarma işleminin farkının büyüklüğüne göre de sürükleme şiddeti belirlenir. Yeterli derece sürükleme ivmesi, şiddeti yok ise slider üzerinde kaydırma işlemi yapılmaz.
- Tıklanılan ve bırakılan pozisyonun slider elemanının içerisinde olması gerekir. Değil ise sürüklenerek kaydırılan sayfa eski haline geri döner.
Bu işlemleri gerçekleştirmek için slider üzerindeki olayları yakalayabilmemiz gerekir. Tıklama ve dokunma işlemi mobil ve PC olarak 2 ayrı platform üzerinde işlenen mantığı aynı olayları farklı işlemler. Birinde el ile birinde mouse ile istenilen yere dokunma, tıklama işlemi yapıyoruz ancak kodlama da 2 farklı kod ile belirtiyoruz. Bu olaylar ile tıklanılan yada dokunulan kordinatları bulacağız. Aşağıda yakalamamız gereken olayları listeliyorum.
- Touchstart – dokunma anını —— Mousedown – tıklama anı
- Touchend – dokunmayı bırakma, elimizi çektiğimizde —— Mouseup – tıklamayı bırakma anı, fareden elimizi çektiğimizde
- Touchmove – ekran üzerindeki hareketleri —— Mousemove – fare hareketleri
- Mouseleave – mpuse belirtilen nesnenin üzerinden ayrıldıysa
İlk olarak tıklanma ve dokunma olayını yakalayalım. Bind fonksiyonu ile birden fazla olayı izleme işlemini yaparak ayrı ayrı fazladan kod yazmamıza gerek kalmıyor. Yukarıdaki kodlarla tıklanılan veya dokunulan bölgenin konumunu alıyoruz. Eğer PC üzerinde konum alamıyorsak mobil üzerindeyiz demektir o zaman mobilde dokunma konumunu alıyoruz. Kaydırmanın başladığını belirtmek için ‘upDown’ değişkenine 1 değerini veriyoruz, tıklanma konumunu da ‘ts’ değişkenine aktarıyoruz.
slidesWrapperLi.bind("touchstart mousedown", function (e){ //dokunulduğunda (touchstart:Mobil, mousedown:PC)
upDown = 1; //kaydirma baslandi, tiklandi
ts = e.pageX; //PC tiklama pozisyonu
if (!ts){
ts = e.originalEvent.touches[0].clientX; //Mobil dokunma pozisyonu
}
});
Ardından tıklandığında veya dokunduğunda slider üzerinde, ekranda elimizi veya faremizi hareket ettirme olaylarını izliyoruz. Önceden slider sayfa üzerinde tıklama yapıldı ama hala bırakılmadan hareket halinde ise sayfayı sağa veya sola kaydırma işlemini yapıyoruz ve bu işlem sırasında da sürekli ‘te’ değişkenine fare veya dokunmanın konumunu aktarıyoruz. Bu konumu da sayfanın stil özelliği olan ‘left’ değerine aktararak sayfanın sağa veya sola kaydırılmasını anlık olarak sağlıyoruz.
slidesWrapperLi.bind("touchmove mousemove", function (e){ //ekran üzerindeki dokunmayı ve fareyi izleme
//tiklama ve birakma arasındaki fare hareketi, sayfayi saga yada sola surukleme hali
if (upDown){ //slider sayfa uzerine tiklama yapildi ama birakilmadiysa
te = e.pageX; //PC hareket halindeki fare pozisyonu
if (!te){
te = e.originalEvent.changedTouches[0].clientX; //Mobil hareket halindeki dokunma hareketi pozisyonu
}
//ekranda acik olan sayfa ile onun onundeki ve arkasındaki sayfalar suruklenme pozisyonu kadar saga yada sola hareketlensin, kaysin
$(this).css("left",(te-ts)+"px");
$(this).next().css("left",(te-ts)+"px");
$(this).prev().css("left",(te-ts)+"px");
}
});
Eğer fare hareketini sonlandırma yani fareden elimizi çektiğimiz konum slider sayfa üzerinde değil ise sayfayı eski haline getiriyoruz ve tıklama ve dokunma işleminin bittiğini belirtmek, kandırma işlemini sonlandırmak için ‘upDown’ değişkenine 0 değerini atıyoruz.
slidesWrapperLi.bind("mouseleave", function (e){ //slider sayfa uzerinde dokunma, tiklama birakildiysa
upDown = 0; //tiklama, dokunma birakildi
//ekranda acik olan sayfa ile onun onundeki ve arkasındaki sayfalar eski haline yavasca hareketlensin, kaysin
$(this).animate({"left":"0px"}, 200); //aktif olan sayfa eski hale gelsin
$(this).next().animate({"left":"0px"}, 200);
$(this).prev().animate({"left":"0px"}, 200);
});
Slider sayfa üzerinde dokunma veya fare hareketimiz devam ediyorken ise tıklama veya dokunma işlemini kaldırdığımızda ‘upDown’ değişkenine kaydırmanın sonlandığını belirtmek için 0 değerini giriyoruz ve tıklamayı veya dokunmayı bırakma konumunu ‘te’ değişkenine aktarıyoruz. Tıklama veya dokunma anı ile bırakma anı kordinatlarını birbirine kıyaslıyoruz ve bu kıyaslama ile sayfanın sağa yada sola kaydırıldığını belirleyip bu doğrultuda slider kaydırma işlemini tamamlıyoruz. Slider sayfa geçişi yapıldığında slider otomatik geçiş işlemini ve slider butonlarını güncelliyoruz.
slidesWrapperLi.bind("touchend mouseup", function (e){ //bırakıldığında (touchend:Mobil, mouseup:PC)
upDown = 0; //kaydirma sonlandi
te = e.pageX; //PC birakma pozisyonu
if (!te){
te = e.originalEvent.changedTouches[0].clientX; //Mobil birakma pozisyonu
}
var slidesWrapper = $(this).closest(".my-simple-slider"),
sliderNav = slidesWrapper.next(),
selectedPosition = slidesWrapper.children("li.selected").index(), //su an aktif slider sayfa
notUpdatedPosition = selectedPosition,
slidesNumber = slidesWrapper.children("li").length;
if(ts > te+65){
/*
tıklanılan yer, bırakılan yerden en az 65 piksel daha sağda ise,
yani sağdan sola doğru sürükle bırak yapıldıysa ve 5 piksellik bir sürükleme söz konusu ise
*/
if( selectedPosition < slidesNumber - 1) { //su an aktif sayfa sliderin sonuncu sayfasi degil ise
selectedPosition +=1;
nextSlide(slidesWrapper.find(".selected"), slidesWrapper, selectedPosition);
}else{ //sonuncu sayfa ise
selectedPosition = 0;
prevSlide(slidesWrapper.find(".selected"), slidesWrapper, selectedPosition);
}
}else if(ts < te-65){
/*
tıklanılan yer, bırakılan yerden en az 65 piksel daha solda ise
*/
if( selectedPosition > 0) { //su an aktif sayfa sliderin ilk sayfasi degil ise
selectedPosition -=1;
prevSlide(slidesWrapper.find(".selected"), slidesWrapper, selectedPosition);
}else{ //ilk sayfa ise
selectedPosition = slidesNumber - 1;
nextSlide(slidesWrapper.find(".selected"), slidesWrapper, selectedPosition);
}
}else{ //gecis yapmak icin sayfa surukleme kuvveti yeterli degil
$(this).animate({"left":"0px"}, 200); //sayfa suruklenmeden onceki eski haline yavasca kaysin
}
//sayfa gecisleri yumusak olsun
if( notUpdatedPosition == slidesNumber - 1 && selectedPosition == 0) { //slider de tek sayfa varsa
$(this).css("left","0px");
$(this).next().css("left","0px");
$(this).prev().css("left","0px");
}else{
$(this).next().animate({"left":"0px"}, 500);
$(this).prev().animate({"left":"0px"}, 500);
}
updateSliderNavigation(sliderNav, selectedPosition); //surukle bırak yontemi ile sayfa gecisi yapildiginde slider butonlari guncelle
setAutoplay(autoPlayDelay,slidesWrapper); //otomatik gecis guncelle
});
JS tarafını da bitirmiş oluyoruz. Javascript sürükle bırak slider uygulaması kodlarının bütün hali aşağıdaki gibidir.
$(function(){
/*------------Slider------------*/
if ($(".my-simple-slider").length > 0) {
var slidesWrapperLi = $(".my-simple-slider li"),
autoPlayId = {}, //her slider icin ayri gecis ozelliginin tutuldugu dizi
ts,te,upDown = 0, //ts: tiklandiginde ve basili tutultugunda, te: tiklama, dokunma kaldirildiginde, upDown=1 ise tiklandi, upDown=0 ise birakildi
autoPlayDelay = 5000; //gecis bekleme suresi
setAutoplay(autoPlayDelay); //otomatik gecis
$(".mys-slider-nav").on("click", "li", function(event){ //slider buton tiklanildiginde
event.preventDefault();
var selectedItem = $(this), //tiklanilan li etiketi
sliderNav = selectedItem.closest(".mys-slider-nav"), //tiklanilan sliderin menu buton kapsayici div
slidesWrapper = sliderNav.prev(), //tiklanilan slider
slidesNumber = slidesWrapper.children("li").length; //tiklanilan sliderin sayfa sayisi
if(!selectedItem.hasClass("selected")) { //tiklanilan sayfa selected olarak atanmadiysa, class i selected degil ise
var selectedPosition = selectedItem.index(), //tiklanilan li etiketinin index numarasini al
activePosition = slidesWrapper.find("li.selected").index(); //su an ki aktif slider sayfanin index id sini al
if( activePosition < selectedPosition) { //tiklanilan sayfa id degeri su an ki aktif sayfa id degerinden buyuk ise
nextSlide(slidesWrapper.find(".selected"), slidesWrapper, selectedPosition); //ileri efekti verilsin
} else { //degil ise
prevSlide(slidesWrapper.find(".selected"), slidesWrapper, selectedPosition); // geri efekti verilsin
}
updateSliderNavigation(sliderNav, selectedPosition); //slider menu guncellensin
setAutoplay(autoPlayDelay,slidesWrapper); //otomatik gecis guncellensin
}
});
function nextSlide(visibleSlide, container, n){ //sayfalar arasi sagdan sola gecis efekti
visibleSlide.removeClass("selected").addClass("is-moving").one("webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend", function(){
$(this).css("left","0px");
}); //sayfalar arasi gecis efekti
var selectedLi = container.children("li").eq(n); //tiklanilan sayfa
selectedLi.addClass("selected").prevAll().addClass("move-left"); //secili, aktif hale getir, diger butun sayfalari pasif yap
}
function prevSlide(visibleSlide, container, n){ //sayfalar arasi soldan saga gecis efekti
visibleSlide.removeClass("selected").addClass("is-moving").one("webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend", function(){
$(this).css("left","0px");
}); //sayfalar arasi gecis efekti
var selectedLi = container.children("li").eq(n); //tiklanilan sayfa
selectedLi.addClass("selected").removeClass("move-left").nextAll().removeClass("move-left"); //secili, aktif hale getir, diger butun sayfalari pasif yap
}
function setAutoplay(delay,slidesWrapper) { //class="mys-autoplay" degerine sahip slider elemanlara otomatik gecis ozelligi
slidesWrapper = slidesWrapper?slidesWrapper:""; //ie hatasi cozumu
/*
slidesWrapper: Gecis yapmak istenilen, tiklanilan sayfanin slider nesnesi
bu deger var ise sayfada tiklanarak veya dokunarak gecis yapilmak istenmis demektir.
*/
if ($(".mys-autoplay").length > 0 && !slidesWrapper){ //site ilk yuklendiginde
var i=0;
$(".mys-autoplay").each(function(){ //otomatik gecis istenen butun slider elemanlarini gez
var slidesWrapper = $(this), //slideri al
mysID = ''; //autoPlayID icin kullanilacak, her slider icin belirtec id
if (!slidesWrapper.attr("id")){ //clearInterval isleminin basarili olmasi icin sliderlere id atamasi yapiyoruz, sadece sayfa yuklendiginde 1 kere calissin
mysID = "mys-id-"+i;
slidesWrapper.attr("id",mysID)
i++;
}
var sliderElementLength = slidesWrapper.children("li").length; //slider sayfa sayisi
/*
her slider icin otomatik gecis dongu islemi ayri ayri uygulansin ve bu islem bir diziye aktarilsin
slider menuye veya slidere tiklanilip sayfalar arasi gecis yapilmak istenir ise bu dizi degerleri uzerinden
erisim saglayip, o ssliderin slider gecis silecegiz ve tekrar olusturacagiz
yani her slider icin gecis efekti bekleme suresini guncelliyoruz.
Boylelikle gecis efekti hatasi olmayacak, sliderlar arasi gecis karisikligi olmayacak
*/
/*
site acildiginde otomatik gecis guncellenir ve aktif olur
autoPlayDelay degerine yazilan saniye kadar sonra otomatik olarak sayfa gecisleri baslar
*/
autoPlayId[mysID] = window.setInterval(function(){ //autoPlayDelay saniye de bir autoplaySlider fonksiyonu calisir
autoplaySlider(slidesWrapper,sliderElementLength)
}, autoPlayDelay); //autoPlayDelay deki saniye degeri kadar otomatik gecis bekleme suresi
});
}else if ($(".mys-autoplay").length > 0 && slidesWrapper && slidesWrapper.hasClass("mys-autoplay")){ //sayfaya tiklanildiginde
var mysID = slidesWrapper.attr("id"),
sliderElementLength = slidesWrapper.children("li").length;
clearInterval(autoPlayId[mysID]); //sayfa gecisi yapilmak istenen slider uzerindeki gecis efekti sıfırlansin, silinsin
/*
sayfa tiklenilip gecis yapildiginde otomatik gecis guncellenir ve aktif olur
autoPlayDelay degerine yazilan saniye kadar sonra otomatik olarak sayfa gecisleri baslar
*/
autoPlayId[mysID] = window.setInterval(function(){ //gecis efektini tekrar olusturalım
autoplaySlider(slidesWrapper,sliderElementLength)
}, autoPlayDelay);
}
}
function autoplaySlider(slidesWrapper,length) {
var selectedPosition = slidesWrapper.find(".selected").index();
if( selectedPosition < length - 1) {
selectedPosition +=1;
nextSlide(slidesWrapper.find(".selected"), slidesWrapper, selectedPosition); //ileri efekti verilsin
} else {
selectedPosition = 0;
prevSlide(slidesWrapper.find(".selected"), slidesWrapper, selectedPosition); //geri efekti verilsin
}
var sliderNav = slidesWrapper.next();
updateSliderNavigation(sliderNav, selectedPosition); //slider menu guncelle
}
function updateSliderNavigation(pagination, n) { //slider menu buton
var navigationDot = pagination.find(".selected"); //butonlarda secili, aktif, selected butonu bul
navigationDot.removeClass("selected"); //selected classı sil
pagination.find("li").eq(n).addClass("selected"); //gecis yapilan, yeni aktif olan slider sayfanin butonuna selected class ekle, aktif yap
}
/*------SürükleBırak------*/
slidesWrapperLi.bind("touchstart mousedown", function (e){ //dokunulduğunda (touchstart:Mobil, mousedown:PC)
upDown = 1; //kaydirma baslandi, tiklandi
ts = e.pageX; //PC tiklama pozisyonu
if (!ts){
ts = e.originalEvent.touches[0].clientX; //Mobil dokunma pozisyonu
}
});
slidesWrapperLi.bind("touchend mouseup", function (e){ //bırakıldığında (touchend:Mobil, mouseup:PC)
upDown = 0; //kaydirma sonlandi
te = e.pageX; //PC birakma pozisyonu
if (!te){
te = e.originalEvent.changedTouches[0].clientX; //Mobil birakma pozisyonu
}
var slidesWrapper = $(this).closest(".my-simple-slider"),
sliderNav = slidesWrapper.next(),
selectedPosition = slidesWrapper.children("li.selected").index(), //su an aktif slider sayfa
notUpdatedPosition = selectedPosition,
slidesNumber = slidesWrapper.children("li").length;
if(ts > te+65){
/*
tıklanılan yer, bırakılan yerden en az 65 piksel daha sağda ise,
yani sağdan sola doğru sürükle bırak yapıldıysa ve 5 piksellik bir sürükleme söz konusu ise
*/
if( selectedPosition < slidesNumber - 1) { //su an aktif sayfa sliderin sonuncu sayfasi degil ise
selectedPosition +=1;
nextSlide(slidesWrapper.find(".selected"), slidesWrapper, selectedPosition);
}else{ //sonuncu sayfa ise
selectedPosition = 0;
prevSlide(slidesWrapper.find(".selected"), slidesWrapper, selectedPosition);
}
}else if(ts < te-65){
/*
tıklanılan yer, bırakılan yerden en az 65 piksel daha solda ise
*/
if( selectedPosition > 0) { //su an aktif sayfa sliderin ilk sayfasi degil ise
selectedPosition -=1;
prevSlide(slidesWrapper.find(".selected"), slidesWrapper, selectedPosition);
}else{ //ilk sayfa ise
selectedPosition = slidesNumber - 1;
nextSlide(slidesWrapper.find(".selected"), slidesWrapper, selectedPosition);
}
}else{ //gecis yapmak icin sayfa surukleme kuvveti yeterli degil
$(this).animate({"left":"0px"}, 200); //sayfa suruklenmeden onceki eski haline yavasca kaysin
}
//sayfa gecisleri yumusak olsun
if( notUpdatedPosition == slidesNumber - 1 && selectedPosition == 0) { //slider de tek sayfa varsa
$(this).css("left","0px");
$(this).next().css("left","0px");
$(this).prev().css("left","0px");
}else{
$(this).next().animate({"left":"0px"}, 500);
$(this).prev().animate({"left":"0px"}, 500);
}
updateSliderNavigation(sliderNav, selectedPosition); //surukle bırak yontemi ile sayfa gecisi yapildiginde slider butonlari guncelle
setAutoplay(autoPlayDelay,slidesWrapper); //otomatik gecis guncelle
});
slidesWrapperLi.bind("touchmove mousemove", function (e){ //ekran üzerindeki dokunmayı ve fareyi izleme
//tiklama ve birakma arasındaki fare hareketi, sayfayi saga yada sola surukleme hali
if (upDown){ //slider sayfa uzerine tiklama yapildi ama birakilmadiysa
te = e.pageX; //PC hareket halindeki fare pozisyonu
if (!te){
te = e.originalEvent.changedTouches[0].clientX; //Mobil hareket halindeki dokunma hareketi pozisyonu
}
//ekranda acik olan sayfa ile onun onundeki ve arkasındaki sayfalar suruklenme pozisyonu kadar saga yada sola hareketlensin, kaysin
$(this).css("left",(te-ts)+"px");
$(this).next().css("left",(te-ts)+"px");
$(this).prev().css("left",(te-ts)+"px");
}
});
slidesWrapperLi.bind("mouseleave", function (e){ //slider sayfa uzerinde dokunma, tiklama birakildiysa
upDown = 0; //tiklama, dokunma birakildi
//ekranda acik olan sayfa ile onun onundeki ve arkasındaki sayfalar eski haline yavasca hareketlensin, kaysin
$(this).animate({"left":"0px"}, 200); //aktif olan sayfa eski hale gelsin
$(this).next().animate({"left":"0px"}, 200);
$(this).prev().animate({"left":"0px"}, 200);
});
}
});
Jquery ile kaldırmalı slider örneği bu kadar. Uygulamanın çalışır vaziyetteki halini DokunmatikSliderYapimi adlı dosyayı indirerek ulaşabilirsiniz. Kalın sağlıcakla…