2015-02-03 4 views
7

spec राज्यों की गणना संबंधी सीएसएस विशिष्टता: (बोल्ड मेरा)विनिर्देशों को बढ़ाने के लिए चयनकर्ताओं को दोहराया जा सकता है?

नोट: एक ही सरल चयनकर्ता के बार-बार घटनाओं अनुमति दी जाती है और विशिष्टता वृद्धि करते हैं।

इसलिए उदाहरण .class.class {} के लिए .class {} से दो बार विशिष्टता है - DEMO

हालांकि, इस शब्द 'सरल चयनकर्ता' the spec यह कहना है के बारे में: (बोल्ड मेरा)

एक सरल चयनकर्ता या तो प्रकार चयनकर्ता या सार्वभौमिक चयनकर्ता तुरंत शून्य या अधिक विशेषता चयनकर्ताओं द्वारा पीछा किया गया है , किसी भी क्रम में आईडी चयनकर्ता, या छद्म-वर्ग।

तो कल्पना का कहना है के बाद से है कि एक ही सरल चयनकर्ता की दोहराया घटनाओं अनुमति दी जाती है - यह अर्थ होगा कि आप के रूप में अच्छी type selectors दोहराने सकता है।

खैर काफी स्पष्ट रूप से कुछ इस तरह काम नहीं करेगा: h1[]h1[] {} - जो या तो काम नहीं करता है, अगर वहाँ के लिए एक रास्ता है

तो मैं सोच रहा हूँ: h1h1 { },

तो मैं इस कोशिश की यह करो?

+0

मुझे लगता है यह वास्तव में जिस तरह से कल्पना ऊपर लिखा गया है में एक गलती है .. – SW4

+0

मैं मानता हूँ करने के लिए होता है, मुझे नहीं लगता कि मैं पहले कभी ऐसा कुछ देखा है है। मुझे इसके साथ गड़बड़ होनी चाहिए और इसका परीक्षण करना पड़ सकता है लेकिन ऐसा लगता है कि यह सही नहीं होगा। – Ruddy

उत्तर

11

टाइप चयनकर्ताओं का उपयोग करके चयनकर्ता की विशिष्टता में वृद्धि करना संभव है, लेकिन परंपरागत रूप से नहीं। इसका कारण नीचे बताया गया है, लेकिन उन लोगों के लिए जो केवल एक विकल्प की तलाश में हैं, इनमें से दो हैं। आप या तो श्रृंखला :not() छद्म कक्षाएं एक भी यौगिक चयनकर्ता में प्रकार चयनकर्ताओं युक्त

h1      {} /* 1 type -> specificity = 0-0-1 */ 
h1:not(_)    {} /* 2 types -> specificity = 0-0-2 */ 
h1:not(_):not(_)  {} /* 3 types -> specificity = 0-0-3 */ 
h1:not(_):not(_):not(_) {} /* 4 types -> specificity = 0-0-4 */ 

या, यदि आप लीगेसी ब्राउज़र कि :not() का समर्थन नहीं करते समर्थन करने के लिए की जरूरत है, आप इस तरह के html के रूप में अनावश्यक प्रकार चयनकर्ताओं जोड़ सकते हैं और एक जटिल चयनकर्ता की शुरुआत करने के लिए body, यद्यपि आप इस मामले में कहीं अधिक सीमित आप सभी तत्वों को प्राप्त करने में सक्षम नहीं हो सकता है के रूप में कर रहे हैं:

h1    {} /* 1 type -> specificity = 0-0-1 */ 
body h1   {} /* 2 types -> specificity = 0-0-2 */ 
html body h1  {} /* 3 types -> specificity = 0-0-3 */ 
html body tr > td {} /* 4 types -> specificity = 0-0-4, assumes every td is a child of tr */ 

जरूरत नहीं कहने के लिए, इन पर विचार कर रहे विशिष्टता हैक; जैसा कि अन्य सभी सीएसएस हैक्स के साथ, कम से कम उनका उपयोग करें, अगर बिलकुल भी।


एक यौगिक चयनकर्ता केवल ज्यादा से ज्यादा ठीक एक प्रकार चयनकर्ता अन्य सभी सरल चयनकर्ताओं पूर्ववर्ती हो सकता है। Selectors 3 से (जो इस सरल चयनकर्ताओं का एक अनुक्रम कॉल):

सरल चयनकर्ताओं का एक अनुक्रम सरल चयनकर्ताओं कि एक Combinator द्वारा अलग नहीं कर रहे हैं की एक श्रृंखला है। यह हमेशा एक प्रकार के चयनकर्ता या सार्वभौमिक चयनकर्ता के साथ शुरू होता है। अनुक्रम में कोई अन्य प्रकार चयनकर्ता या सार्वभौमिक चयनकर्ता की अनुमति नहीं है।

और Selectors 4:

एक यौगिक चयनकर्ता सरल चयनकर्ताओं कि एक Combinator द्वारा अलग नहीं कर रहे हैं का एक क्रम है। यदि इसमें एक प्रकार चयनकर्ता या सार्वभौमिक चयनकर्ता है, तो चयनकर्ता अनुक्रम में पहले आता है। अनुक्रम में केवल एक प्रकार का चयनकर्ता या सार्वभौमिक चयनकर्ता की अनुमति है।

केवल प्रकार और सार्वभौमिक चयनकर्ताओं इस नियम के अधीन हैं, आप विशिष्टता बढ़ाने के लिए अन्य सरल चयनकर्ताओं को गठबंधन और दोहरा सकते हैं। शायद विशिष्टता की गणना करने के लिए इस खंड में पाठक को इस बारे में याद दिला सकता था, लेकिन मुझे नहीं लगता कि यह बिल्कुल जरूरी है।

इस नियम के लिए कारण स्पष्ट रूप से कभी नहीं कहा गया है, लेकिन यह निकालना काफी आसान है:

  • याद रखें कि एक प्रकार चयनकर्ता बस एक पहचानकर्ता है, उदा के होते हैं h1। यह इस तरह के एक आईडी (#), एक वर्ग (.), एक छद्म वर्ग (:), या एक विशेषता चयनकर्ता ([]) के रूप में अन्य साधारण चयनकर्ताओं जो व्याकरण में अपने स्वयं के विशिष्ठ प्रतीक हैं, के विपरीत है। आप अलग-अलग प्रकार के चयनकर्ताओं को अलग-अलग पार्स करने के तरीके के बिना बिना सक्षम नहीं होंगे।

  • और अगर आप सकता श्रृंखला प्रकार चयनकर्ताओं, उदाहरण के लिए यदि आप उन दोनों के बीच एक और सरल चयनकर्ता था, इस के लिए ही संभव उपयोग एक विशिष्टता हैक के रूप में, सवाल में बताए अनुसार जिसका मतलब है कि हो सकता है, क्या तुम करोगी केवल सभी प्रकार के चयनकर्ता समान थे, इसका उपयोग करने में सक्षम हो; प्रकार चयनकर्ताओं का कोई अन्य संयोजन काम नहीं कर सकता है।

    ऐसा इसलिए है क्योंकि चयनकर्ता मानते हैं कि दस्तावेज़ भाषा प्रत्येक तत्व को बिल्कुल एक तत्व प्रकार के रूप में परिभाषित करती है। उदाहरण के लिए, एचटीएमएल में, h1 हमेशा h1 होता है; यह किसी अन्य प्रकार का तत्व कभी नहीं हो सकता है। एक कंपाउंड चयनकर्ता जो कि h1 दोनों के साथ पूछता है, साथ ही p कुछ भी मेल नहीं खा सकता है, इसी कारण से [type=text][type=password] किसी दस्तावेज़ भाषा में कभी भी मेल नहीं खा सकता है जो डुप्लिकेट विशेषताओं का समर्थन नहीं करता है।

    • : :not() छद्म वर्ग का उपयोग करके -

    हालांकि, ध्यान से ऊपर अंक के साथ, यह अभी भी संभव एक यौगिक चयनकर्ता कि विशिष्टता के लिए एक से अधिक प्रकार चयनकर्ता होता है बनाने के लिए है :not() छद्म-वर्ग की विशिष्टता इसके तर्क के बराबर है। छद्म-वर्ग की गणना नहीं की जाती है। यह पहले लिंक में उल्लेख किया गया है। इसका मतलब है :not(h1) की विशिष्टता h1 के बराबर है - एक प्रकार का चयनकर्ता।

  • चूंकि कोई तत्व केवल एक प्रकार का हो सकता है, इसका मतलब है :not() किसी अन्य प्रकार के चयनकर्ता के साथ गारंटीकृत मिलान होगा।

  • के बाद से एक यौगिक चयनकर्ता छद्म वर्गों के किसी भी संख्या शामिल हो सकते हैं, तो आप निषेध रूप में कई बार के रूप में आवश्यक दोहरा सकते हैं, भले ही negations सभी एक ही प्रकार चयनकर्ता का उपयोग।

  • और चूंकि चयनकर्ता किसी विशेष दस्तावेज़ भाषा के संदर्भ में समझ में नहीं आता है, तो आप एक प्रकार का चयनकर्ता का उपयोग कर सकते हैं, जो किसी भी एचटीएमएल दस्तावेज़ में किसी भी तत्व से मेल नहीं खाता है जब तक यह संतुष्ट न हो एक चयनकर्ता के लिए चयनकर्ता व्याकरण। एक प्रकार चयनकर्ता में सीएसएस पहचानकर्ता के अलावा कुछ भी नहीं होता है, इसलिए कोई सीएसएस पहचानकर्ता उचित खेल है। _ सहित।

+0

इस बहुत विस्तृत उत्तर के लिए धन्यवाद! बस उत्सुक हालांकि: आप चयनकर्ता 'बॉडी एच 1 {}' एक हैक क्यों मानेंगे? इसके अलावा मैंने विशिष्टता जोड़ने का एक और संभावित तरीका सोचा: 'एच 1: एनएच-चाइल्ड (एन) {} 'जैसे कुछ - लेकिन वास्तव में यह अधिक हैकी – Danield

+1

@ डैनिल्ड दिखता है: क्योंकि कोई * असली * कारण नहीं है कि आपके पास शरीर होना चाहिए 'वहां चयनकर्ता, क्योंकि आप आम तौर पर मान सकते हैं कि' एच 1' हमेशा 'शरीर' में होगा। मैं किसी भी समय थोड़ा गंदा महसूस करता हूं जब मैं विशिष्टता जोड़ने के एकमात्र उद्देश्य के लिए चयनकर्ता जोड़ रहा हूं :) – BoltClock

संबंधित मुद्दे