2014-11-12 12 views
9

Sayfadaki öğeleri marj-sol ve kenar boşluğu otomatik olarak ayarlanmış olan konumlarda bulmak için kolay bir yol arıyorum.Tüm öğeleri kenar boşluğuyla bulmak için Javascript yolu: auto

aldım bana biraz zaman yardımcı olan bu senaryo,:

(function() { 
 
    var elementsList = []; 
 
    for (var i = 0; i < document.styleSheets.length; i++) { 
 
    var styleSheet = document.styleSheets[i]; 
 
    if (styleSheet.rules) { 
 
     for (var j = 0; j < styleSheet.rules.length; j++) { 
 
     var rule = styleSheet.rules[j]; 
 
     if (rule && rule.style && rule.style.marginLeft == 'auto' && rule.style.marginRight == 'auto') { 
 
      var smallList = document.querySelectorAll(rule.selectorText); 
 
      if (smallList.length) 
 
      elementsList = elementsList.concat(smallList); 
 

 
     } 
 

 
     } 
 
    } 
 
    } 
 
    return elementsList 
 
})();
bu fonksiyon yapılan işin bazı alırken

, bu margin: auto I çoğu durumlarda yakalamak değil web sitelerinde görülüyor.

Bana daha iyi bir yol gösterebilir misin?

+0

Daha kolay bir yol var. Neden bir sınıf yaratmıyorsun? .margin-auto gibi bir şey ve tüm bu elementler ile arama? –

+0

Bu, jQuery seçici sorununa benziyor. Bunu istiyor musun? – Paul

+0

Eğer jquery içerir ve sadece orada seçiciler kullanın eğer çok daha kolay olacak. @MDeSchaepmeester BİTENİZ İÇİN;) – Dwza

cevap

2

Eğer Yonatan en cevabını Martin Ernst söylediği gibi JQuery

kullanmak sorununuz yoksa: 'Bu marginLeft/Sağ = "auto sadece unsurları seçecektir ".' Ayrıca, yorumlarda belirtildiği gibi, FF ve safari ile çalışmak için öğeler gizlenmelidir.

Bu kullanarak çalışmalıdır JQuery:

$(document).ready(function() { 
    var visibleElements = $('body *:visible'); 
    $('body *').hide(); 
    var elements = $('body *').filter(function() { 
     return $(this).css('margin-left') == 'auto' && $(this).css('margin-right') == 'auto'; 
    }) 
    // show only elements that were visible 
    visibleElements.show(); 
}); 

İpucu: Bazı nedenlerden dolayı, dış komut yüklenmez gerekiyorsa, sadece senin başında minified jquery komut içeriğini kopyalamak .

+0

Ne yazık ki bu, FF ve Safari'de başarısız oluyor; her ikisi de, ortaları doğru bir şekilde oluşturduklarında bile kenar boşlukları "otomatik" olarak ayarlandığında, "0px" değerini döndürüyor. –

+0

Dom üzerinde istediğiniz tüm eylemleri yapabilir misiniz? Eğer yapabiliyorsanız, $ ('*'). Hide(); senaryonun en başında. Bunu yaparak, 'auto' değeri hesaplanmayacaktır (iyi, sanırım ...;)). Çalışırsa, cevabımı güncellerim. – Nicolas

+0

Doğru, ancak gizle() bu hesaplamaları geri almalıdır (bu tür 'brachial' şeyleri yaptım^^). – Nicolas

0

kullanım jQuery:
$('*').filter(function(i, d){return d.style.marginLeft == "auto" && d.style.marginRight == 'auto';});

+0

$ ('body *') kullanması daha iyi olur, bu gereksiz elemanlara (kafa, meta, vb.) Dönüşmesini engeller. – enguerranws

+0

Bu sadece "marginLeft/Right =" auto "' kendi "style-attribute" değerlerinde ayarlanmış, ancak CSS tarafından ayarlanmış olan öğeleri seçmez. –

0

Bunu söylemekten nefret ediyorum, ama bu daha az başarıya sahip, kendi versiyonum.

+0

Sorununuz ** önemsiz değil ** Denediniz mi ** Nicolas ** cevap? Safari dışında çalışması gerekir –

0

Bu sorun değil trivial. window.getComputedStyle() günlerinde bile, kenar boşlukları auto olarak ayarlandığında, çapraz-rant için güvenli bir yanıt elde etmek zordur. Yani bu tam bir cevap değil, ama bir tane bulmaya yardım edecek. margin-steno kullanıldığında

margin-left ve margin-right da auto şunlardır:

#elem {margin: auto;} // or: 
#elem {margin: 100px auto;} // or: 
#elem {margin: 100px auto 30px;} // or: 
#elem {margin: 100px auto 30px auto;} 

Sen stil içinde ararken çok bu gösterimler bulmalıyız. Sadece kodunuzu var elementsList=[]; önce bu işlevi ekleyin: Artık ayrıca margin kullanıldığı kuralları olsun

if (rule && rule.style && 
    (rule.style.marginLeft == 'auto' && rule.style.marginRight == 'auto' || expand(rule.style.margin)) 
) { 
    var smallList = document.querySelectorAll(rule.selectorText); 
    if (smallList.length) elementsList = elementsList.concat(smallList); 
} 

: İçinizdeki if-condition için

function expand(margin) { 
    var parts = margin.split(' '); 
    for (var i = 3; i; i--) parts[i] = parts[i] || parts[i - 2] || parts[0]; 
    return parts[1] == 'auto' && parts[3] == 'auto'; 
} 

Sonra değiştirin. Ancak bazı sorunlar kodu ile kalmak:

  • aynı elemanları birden çok kez listelenmiş olabilir, birden fazla kural
  • Tüm listet elemanları gerçekten marginLeft/Sağ = oto ile yansıtılmalarıdır shure değil eşleştiğinde. Belki bu css başka bir kural tarafından geçersiz kılınır.
  • dfsq'da yaptığı yorumda, bu şekilde bulamayacağınız satır içi stilleri olabilir.
+0

Çapraz tarayıcı uyumluluğu hakkında umurumda değil Herhangi bir tarayıcıya, marj otomatik elemanlarını algılayacak bir eklenti oluşturmak istiyorum (ve yapmanız gereken şey, bilmeniz gereken :)) – GuruYaya

İlgili konular