Kullanıcı etkileşimini içeren basit web projeleri geliştirirken, CSS'deki durumdaki değişiklikleri ne kadar iyi yönetirse, düşünce için yiyecek olur. Kullanıcı bir akordeon'u genişlettiğinde veya bir menüyü değiştirdiğinde, CSS tarzı değişiklikleri nasıl uygulanmalıdır? Bir popüler çözüm, belirli sınıf isimlerini kullanan bir adlandırma sözleşmesi, aktif veya genişletilmiş stil kancaları olarak.
Bu eyaletli sınıflar genellikle JavaScript'te yönetilecektir. Sahte Android uygulamasını indirin ve aç Web sitesi şablonu metin editörünüzdeki dizin ve bunu kendiniz için görebilirsiniz. dev / js / main.js .
Burada fark edebileceğiniz bir şey, çok benzer sınıf geçişlerini tetikleyen bir sürü yinelenen kod parçacıkları var. Muhtemelen, eğer bu proje büyüklüğünde büyüyecekse, kopyaların miktarı olacaktır. Bunun yerine, aynı görevi gerçekleştiren ve tekrar tekrar tekrar kullanılabilecek ve farklı elemanlarda farklı durum sınıflarını değiştirebilen tek bir JavaScript işlevi yazmak yerine çok daha verimli bir yaklaşım olacaktır. Bu eğitimde, sadece bunun nasıl yapılacağını keşfedeceğiz.
Başlamak için, konsolunuzda, CD 'Web Sitesi Şablonu' ve Çalıştır npm yükleme Projenin düğümü bağımlılıklarını yüklemek için. Çalışıyoruz dev Buradan itibaren dizin.
İçinde index.html , bul .js-açıklama Satır 103'teki öğe ve aşağıdaki HTML5 veri özniteliklerini takın. Bilgi depolamak için bu kalıbı kullanıyor olacağız. jsdescription Tıklanır, yeniden kullanılabilir işlevimiz, geçiş yapmak istediğimiz sınıfı ve değiştirilmesi gereken unsurları bilecektir.
data-class="is-active" data-class-element ="js-description-slide, js-home-slide"
İçinde js dizin, denilen yeni bir dosya oluştur data-class.js . Yeniden kullanılabilir işlevimizi geliştireceğimiz yer burasıdır. İçinde, kodumuzu kapsayan ve ardından ithal etmek için bir Iife (hemen çağrılan işlev ifadesi) yazın. closestparent Öğreticiye daha sonra kullanacağımız yardımcı.
(işlev () {var closestParent = gerekli ("../../ node_modules / orionjs / helpers / closestparent.js");
}) ();
Yardımcı ithalatın altında, tüm unsurların bir nodelisti oluşturmamız gerekecek dataclass Nitelikler, isteğe bağlı olmayacak tek özelliktir. Sonra, daha sonra bir klasik ile onları döndüreceğiz. İÇİN Döngü böylece her bir öğeye erişebiliriz.
Var Elems = Belge .Queryselectorall ("[Data-Class]"), a; için (a = 0; a ve lt; elems.length; a ++) {
}
İçinde İÇİN Döngü, tıklama olaylarını izlemek için bir etkinlik dinleyicisi ekleyin, bu nedenle, kullanıcının sınıf değiştirmeyi tetiklemek istediğimiz öğeyi ne zaman tıkladığınızı biliyoruz (AKA tetik öğesi). İçinde, arayın ProcessChange () İşlev ve fonksiyonun kapsamında erişilebilir olan tıklanan öğeye referans verin. bu Anahtar kelime.
Elems [a] .addEventListener ("Tıkla", Function () {
proseschChange (bu); });
Olay dinleyicinin hemen altında, basını izlemek için bir tane daha ekleyin. giriş anahtar ve sonra aynı şekilde çalıştırın ProcessChange () işlevi. Fare gibi işaretleme aygıtlarını kullanamayan kullanıcıları dikkate alarak erişilebilirliği artırmak için klavye olaylarına destek ekliyoruz.
Elems [a] .addEventListener ("KeyPress", İşlev (E) {
if (e.which === 13) {e.preventDefault (); proseschChange (bu);
}});
Bir öğeyi çift tıklatmak genellikle içindeki tüm metni vurgular. Tetikleme öğesine mantık eklersek, bu işlevi önlemek istediğimiz bir şeydir. Bunu yapmak için bir mousedown Olayları aramak için etkinlik dinleyicisi önleme () Yöntem ve iptal varsayılan davranışını iptal edin.
Elems [a] .addeventlistener ("MouseDown", İşlev (E) {
e.preventDefault (); });
Hemen sonra closestparent İçe aktar, denilen bir işlev oluştur ProcessChange () bu bir öğeyi kabul eder. Bu, önceki adımlarda başvurulan aynı fonksiyondur ve tüm mantığımızı işlem sınıfını hedef öğeye geçiş yapması için tutacaktır.
İşlev içinde, elemanların içeriğini alın veri sınıfı öznitelik ve bir diziye bölün. Bu, tek veri özniteliğinde birden fazla virgülle ayrılmış sınıflara izin vermek içindir.
Var ProcessChange = İşlev (Elem) {Var DataClass = Elem .dataset.class.split (",");
}
Sonraki, işlev içinde, bir varlığını kontrol edin. Veri sınıfı kapsamı Eğer bulunursa, daha önce olduğu gibi bir diziye ayrılırsa öznitelik. Veri sınıfı kapsamı Sınıf geçişinin nerede olacağını sınırlamanızı sağlayan isteğe bağlı bir özelliktir.
Örneğin, eğer dataClass-kapsamı ayarlandı js-my-element Bu, bunun çocukları olan hedef unsurlar tetik öğesinin tıklamasından etkilenir.
if (elem.dataset.classscope) {var dataclassscope = elem.dataset.classscope.split (",");
}
veri sınıfı Öznitelik, başka bir isteğe bağlı özelliktir. Sınıf geçişinin etkilenmesi gereken elemanı belirtir. Aşağıdaki snippette, varlığını kontrol ediyoruz ve varsa içeriğini daha önce olduğu gibi bir diziye dönüştürüyoruz. Yine de, eğer bulunmazsa, hem hedef öğeyi hem de kapsamını tetik elemanına ayarlayacağız, bu, tıklandığında, sınıf değişikliğini kendi başına tetikleyecektir.
if (elem.dataset.classelement) {var datacelasselement = elem.dataset.classelement.split (",");
}
else {var datacelasselement = [elem.classlist ]; if (! DataClassScope) {
Var DataClassScope = DataSclasTelement; }}
Çünkü her ikisi de veri sınıfı ve veri sınıfı Birden fazla virgül ayrılmış değerleri kabul et, ilan etmeliyiz. datal boynu değişken ve ikisi arasındaki en büyük özelliğin uzunluğunu atayın. Bu, bir hedef öğeyi kaçırmadığımızdan emin olmak için yeterince döngü yaptığımızdan emin olmak içindir.
Var Datalenth = Math.max (DataClasselement.Length, DataClass.Length), b; için (B = 0; B, DATALLD; B ++) {
}
Veri niteliklerinin yinelenen değerlere sahip olması mümkündür. Örneğin & lt; bir veri sınıfı = "Gizli, Gizli" veri sınıfı-element = "JS-Elem, JS-Elem2" & gt; işlevin geçerli bir kullanımıdır, sadece belirtilmesi gerekmek daha iyi olur. gizlenmiş bir Zamanlar.
Bunu yapmak için, içinde mantık ekleyeceğiz. datal boynu İÇİN eğer bir döngü veri sınıfı veya veri sınıfı Giriş eksik, son geçerli olanı kullanın. Bu şu anlama gelir & lt; bir dataclass = "hidden" veri sınıfı-element = "JS-Elem, JS-Elem2" & gt; de işe yarayacaktı.
Eğer (DataClass [B]! == undefined)
var elemclass = DataClass [b]; } Eğer (DataSclassemelement [b]! == undefined) {
var dataClasselementValue = DataSaClasTelement [b]; }
Hala içinde İÇİN döngü, yine aynı, ama Veri sınıfı kapsamı öznitelik. Bir kapsamımız yoksa, son geçerli olanı kullanın. Bu, bir kapsamın birçok sınıf geçişini etkilemesini sağlar.
Eğer (DataClassscope & Amp; & Amp; DataClassScope [B]! == undefined) {
var cachedscope = dataClassscope [b]; } Diğer ise (cachedscope) {
DataClassScope [B] = CACHEDSCOPE; }
İçindeki son şey İÇİN Döngü Yapmamız gereken her şeyden önce yapmalıyız. Kapsam verilerini kontrol eden şartlı bir ifade oluşturarak başlayacağız ve hiçbiri bulunmazsa, yalnızca genel belge kapsamını kullanır.
Eğer (DATACLASSSCOPE & AMP; & AMP; DATACLASSSCOPE [B]! == "false") {
}
else {var elemref = document.queryselectorall ('. $ {dataclasselementvalue}'), c; }
Boşta, önceki adımdan itibaren açıklamada, aşağıdaki snippet'i ekleyin. Bu, tanımlanan öğeyi bulur. Veri sınıfı kapsamı ( elemparent ) ve sonra tüm çocuk elemanları eşleşen bir dizi oluşturur. veri sınıfı ( elemref ). Kapsam ve hedef elemanlar aynı ise, referansı da değiştirilecek öğelerin listesine eklenir.
var elemparent = ClosestParent (Elem, DataClassscope [b]),
elemref = [] .slice.call (elemparent .Queryselectorall ('. $ {dataclasselementvalue}')), c;
if (elemparent.classlist. İçerir (dataclasselerementvalue)) {elemref.unshift (elemparent); }
Sonunda, dibinde İÇİN Döngü, oluşturduğumuz verileri kullanalım ve tüm doğru öğelerdeki tüm doğru sınıfları değiştirelim. Bunu yapmak için yeni bir ihtiyacımız var İÇİN geçmek için döngü Elemref'nodelist / dizi , her bir elemana erişin sınıf listesi API ve sonra kullanın Geçiş () değerini eklemek veya kaldırmak için yöntem elemcless .
için (C = 0; C) Elemref.Length; C ++) {ElemRef [C] .Classlist.Toggle (ElemClass); }
Şimdi işlev tamamlandı, dahil etmeliyiz. main.js . Bunu yapmak için, snippet'i aşağıya kopyalayın ve dosyanın en üstüne ekleyin. İve işlevi. Ayrıca kodun çoğuna ihtiyacımız yok main.js , bu yüzden her şeyi tekrar sil STOP BOX SANT GÖRÜNTÜNÜ Olay Kabarcık snippet.
gerektirir ("./ data-class.js");
İşlevi kullanmak için. İçinde index.html , favori simgesinin tüm örneklerini bir js yıldızı sınıf. Aşağıdaki özniteliği ekleyin ve tıklandığında eklenmelidir. aktif kendisine, yokluğunda olduğu gibi veri sınıfı , tetikleyici eleman kendini hedef öğe olarak kullanır.
Daha sonra, tıklandığında, ev slaytındaki oyun kutusu sanatlarını bağlamamız gerekir. aktif Doğru video oyun slaytına eklenirken, mevcut ev slaytından da çıkarılır. Aşağıda, eklemeniz gereken özelliklerdir. JS-TEST-GAME-1 img. Diğerleri aynı deseni takip ediyor, sadece değiştirin Test Oyunu-1 Yeni oyun başlığı ile.
data-class = "IS-Active" veri sınıfı-eleman = "JS-TEST-GAME1 - Slayt-Slayt, JS-Home-slide"
Her oyunda, kutu sanatının önünü ve arkasını değiştiren bir anahtardır. Bu çalışmaları yapmak için, her bir örneğine snippet'i ekleyin. js-boxart-geçiş . Birkaç şeye tıklandığında: saygısız açılır js-boxart ebeveyni kapsamında js-slayt , İken kontrol edildi tetik elemanında geçiş yapılır.
Data-Class = "IS-Clipped, IS Kontrol Edildi" Veri sınıfı-element = "JS-Boxart, JS-BoxArt-Toggle" Data-Score-Scope = "JS- Slayt, JS-BoxArt-Toggle "
Son olarak, aşağıdaki nitelikleri tüm örneklerine eklememiz gerekir. JS-CanceldDescription ve JS-Cancel oyunu Buna tıklandığında, ev slaydına geri dönersiniz.
Terminalde, projeyi oluşturmak için aşağıdaki komutu çalıştırın. Bu, projenin yeni bir şekilde derlenmiş bir versiyonunu oluşturacak dist dizin. Bu komut NPM komut dosyalarını kullanır - homurdanma veya Gulp gibi tam işlevsel yapı araçlarına basit, yerel bir NPM alternatifi.
NPM Run Build
Son olarak, terminalde, hizmet vermek için yerel bir sunucu oluşturmak için aşağıdaki komutu çalıştırın. dist Klasör. Terminalde döndürülen bağlantı noktası numarasını not edin. Tarayıcıda gezin http: // localhost: Port numarası bitmiş projeyi görüntülemek için.
NPM Run servisi
Şimdi projeyi bitirdiniz, tüm sınıf mantığı şimdi yeniden kullanılabilir fonksiyonumuz tarafından ele alınmaktadır. Bu bir canlı proje olsaydı, zaman geçtikçe daha fazla sayfa veya bileşen eklenmişse, bunlar için yeni bir sınıf mantığı ekleme kolaylığı, her bir örnek için ısmarlama işlevselliği yazmak zorunda kalmayacağımız için büyük ölçüde azalır.
Bu makale başlangıçta Web Tasarımcısı, Creative Web Design Magazine, uzman öğreticiler, son teknoloji trendler ve ücretsiz kaynaklar sunan. Burada web tasarımcısına abone olun .
İlgili Makaleler:
(Görüntü Kredi: Amazon) Henüz tam tarihi bilmemize rağmen Amazon Başbakan Günü 2020 Yine de, b..
(Resim Kredi: PEEXELS.COM) İlk bakışta, bedava öğle yemeğine davetiye benzeyen paralel işleme sesleri - çok �..
Sayfa 1/2: Bir at nasıl çizilir: Adım adım Bir at nasıl çizilir: Ad..
Houdini hakkında daha fazla bilgi edinmekle ilgileniyorsanız, New York'u oluşturduğunuzdan emin olun (24-25 Nisan). Konf..
Bir burun nasıl çizileceğini ustalaşmak, bir yüz çizmenin en kötü parçalarından biridir. Belki de her gün gördüğüm..
Typscript, kullanan bir dil grubundan biridir. Javascript Yürütme ortamı olarak çalışma zamanı:. Ticture ko..
NODE.JS'nin en son büyük sürümü, güncellenmiş bir JavaScript motoru, NPM sürüm 5, Google'ın V8, NODE.JS API, Async_hook..
Sayfa 1/2: Sayfa 1 Sayfa 1 Sayfa 2 ..