रूपरेखा त्रिज्या?


473

वहाँ होने का वैसे भी है गोलाकार कोनों पर रूपरेखा एक के div elementलिए इसी तरह की, border-radius?


2
वैसे मुझे 20px सीमा-त्रिज्या के साथ 2px ग्रे बॉर्डर के साथ एक डिव बॉक्स मिला है, मैं भटक रहा था अगर मैं उस बॉर्डर के चारों ओर 10px आउटलाइन रख सकता हूं जो चौकोर होने के बजाय बॉर्डर का अनुसरण करता है
मार्क गुएरिन

4
यह अच्छा प्रश्न है। एक तत्व के साथ border: 5px redऔर outline: 5px blueऔर border-radius: 5px, सीमा गोल है, लेकिन रूपरेखा वर्ग है।
मैथ्यू रूडी

4
अब तक हम इसे केवल फ़ायरफ़ॉक्स में उपयोग कर सकते हैं:-moz-outline-radius
वोज्शिएक बेडनार्स्की

यह CSS3 का हिस्सा होना चाहिए ... अगर मैं इसके बारे में सोचता हूं - मुझे W3C से नफरत है: D
m93a

17
आप सभी box-shadowको अपने जीवन में एक की आवश्यकता है ..
मुहम्मद उमर

जवाबों:


538

अब पुराना सवाल है, लेकिन यह समान मुद्दे वाले किसी व्यक्ति के लिए प्रासंगिक हो सकता है। मेरे पास एक इनपुट क्षेत्र था, जो गोल borderथा और फोकस की रूपरेखा का रंग बदलना चाहता था। मैं outlineइनपुट नियंत्रण के लिए भयानक वर्ग को वश में नहीं कर सका ।

इसलिए इसके बजाय, मैंने बॉक्स-शैडो का इस्तेमाल किया। मैं वास्तव में छाया के चिकने रूप को पसंद करता था, लेकिन एक गोल रूपरेखा को अनुकरण करने के लिए छाया को कठोर किया जा सकता है:

 /* Smooth outline with box-shadow: */
    .text1:focus {
        box-shadow: 0 0 3pt 2pt red;
    }

    /* Hard "outline" with box-shadow: */
    .text2:focus {
        box-shadow: 0 0 0 2pt red;
    }
<input type=text class="text1"> 
<br>
<br>
<br>
<br>
<input type=text class="text2">


24
IMO, यह वह उत्तर है जिसकी आप तलाश कर रहे हैं। मैं इस विधि से किया है, लेकिन 0 पर अपनी रूपरेखा मोड़ को नजरअंदाज नहीं है
जॉन मॉर्टन

2
यह वही है जो मैं देख रहा था, और एक रूपरेखा त्रिज्या से भी बेहतर बैठता है।
ज़ेनेक्सर

2
कठिन रूपरेखा उदाहरण काम नहीं करता है। यह सिर्फ एक कोने के बिना एक आयत है।
एरिक एगर

1
outline: 0वेब पहुंच को तोड़ता है; read outlinenone.com
ianstarz

4
@ianstarz, जब आप कोई वैकल्पिक स्टाइल प्रदान करते हैं तो यह एक्सेसिबिलिटी को तोड़ देता है। box-shadowवैकल्पिक स्टाइलिंग है (जो, जैसा कि यहां प्रस्तुत किया गया है, वास्तव में दिखने में बहुत समान है outline)।
एसीजे

84

मैं आमतौर पर इसका उपयोग करता हूं: छद्म तत्व के बाद:

बेशक यह उपयोग पर निर्भर करता है, यह विधि कठिन छाया पद्धति का उपयोग करने के बजाय व्यक्तिगत सीमाओं पर नियंत्रण की अनुमति देती है।

आप एक बार फिर से अलग-अलग प्रभाव के लिए -1px ऑफ़सेट सेट कर सकते हैं और बैकग्राउंड लीनियर ग्रेडिएंट (नो बॉर्डर) का उपयोग कर सकते हैं।

body {
  margin: 20px;
}

a {
  background: #999;
  padding: 10px 20px;
  border-radius: 5px;
  text-decoration: none;
  color: #fff;
  position: relative;
  border: 2px solid #000;
}

a:after {
  content: '';
  display: block;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  border-radius: 5px;
  border: 2px solid #ccc;
}
<a href="#">Button</a>


3
एक संशोधित और थोड़ा अधिक शानदार संस्करण: jsfiddle.net/rh6j3cdm
दविद होर्वथ

2
यह एक इनपुट क्षेत्र के लिए छद्म के बाद एक :: बनाने के लिए संभव नहीं है
साइमन Franzen

धन्यवाद, यह बहुत अच्छी तरह से काम किया प्रतिक्रियाशील पेड़ की खोज क्वेरी रूपरेखा के साथ!
मोनार्क वाडिया

मुझे यह समाधान पसंद है क्योंकि यह box-shadowसंस्करण की तुलना में बहुत अधिक लचीला है । उदाहरण के लिए, यदि आप चाहते हैं कि "आउटलाइन" को तत्व से दूर रखा जाए (यानी अनुकरण outline-offset) तो यह इस तकनीक से संभव हो जाता है।
कर्क वॉक

34

ऊपर ली हेस के समान है, लेकिन यहाँ मैंने यह कैसे किया:

div {
  background: #999;
  height: 100px;
  width: 200px;
  border: #999 solid 1px;
  border-radius: 10px;
  margin: 15px;
  box-shadow: 0px 0px 0px 1px #fff inset;
}
<div></div>

DIV का कोई नेस्टिंग या आवश्यक नहीं, संक्षिप्तता के लिए Altho मैंने कुछ CSS के -moz और -webkit वेरिएंट को छोड़ दिया है। आप परिणाम ऊपर देख सकते हैं


6
वह OUTLINE की बात कर रहा है, सीमा की नहीं ... "रूपरेखा" त्रिज्या
android.nick

5
सही है, लेकिन चूंकि रूपरेखा-त्रिज्या उपलब्ध नहीं है, मेरी पद्धति एक सीमा के साथ-साथ एक रूपरेखा का भी रूप देती है। यह एक दृश्य प्रभाव है, इसलिए जब तक कि मार्क का डिज़ाइन निर्दिष्ट-डाउन-टू-द-पिक्सेल नहीं है, यह तथ्य कि यह वास्तव में आउटलाइन संपत्ति का उपयोग नहीं करता है कोई फर्क नहीं पड़ता है। और जब से यह एक व्यावहारिक समाधान है, मैं वोट की सराहना
करूंगा

2
इसने बहुत अच्छा काम किया। मैंने उपयोग नहीं किया inset, हालांकि, और मुझे जो चाहिए था वह मिल गया।
पॉल श्रेइबर

18

मैं बूटस्ट्रैप नेबार में ड्रॉपडाउन मेनू के लिए कुछ अच्छा फोकस एक्सेसिबिलिटी चाहता था, और इससे बहुत खुश था:

     a.dropdown-toggle:focus {
         display: inline-block;
         box-shadow: 0 0 0 2px #88b8ff;
         border-radius: 2px;
     }
<a href="https://stackoverflow.com" class="dropdown-toggle">Visit Stackoverflow</a>


16

आप कुछ इस तरह की तलाश कर रहे हैं , मुझे लगता है।

div {
    -webkit-border-radius: 10px;
    -moz-border-radius: 10px;
    border-radius: 10px;
    border: 1px solid black;
    background-color: #CCC;
    height: 100px;
    width: 160px;
}

संपादित करें

एक फ़ायरफ़ॉक्स-केवल -moz-outline-radiusठीक से है, लेकिन यह IE / क्रोम / सफारी / ओपेरा / आदि पर काम नहीं करेगा। तो, यह सबसे क्रॉस-ब्राउज़र-संगत तरीके की तरह दिखता है * एक सीमा रेखा के चारों ओर एक घुमावदार रेखा प्राप्त करने के लिए एक रैपर div का उपयोग करना है:

div.inner {
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
  border-radius: 10px;
  border: 1px solid black;
  background-color: #CCC;
  height: 100px;
  width: 160px;
}

div.outer {
  display: inline-block;
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
  border-radius: 10px;
  border: 1px solid red;
}
<div class="outer">
  <div class="inner"></div>
</div>


* छवियों का उपयोग करने से अलग


20
नहीं, मुझे पता है कि मैं बॉर्डर रेडियस को कैसे प्राप्त कर सकता हूं अगर आप एक आउटलाइन-रेडियस प्राप्त कर सकते हैं
मार्क गुएरिन

मतलब क्या, बिल्कुल? एक मोटी रूपरेखा, इस तरह से? jsfiddle.net/mattball/NXZFv/1
मैट बॉल

10
@ मैट: एक सीमा के बजाय एक घुमावदार रूपरेखा , जाहिर है। W3.org/TR/CSS21/ui.html#dynamic-outlines देखें
जोय

वैसे मुझे 2px ग्रे बॉर्डर के साथ 20px बॉर्डर-त्रिज्या के साथ एक डिव बॉक्स मिला है, मैं भटक रहा था अगर मैं फिर उस बॉर्डर के चारों ओर 10px आउटलाइन रख सकता हूं जो कि चौकोर होने के बजाय बॉर्डर का अनुसरण करता है।
मार्क गुएरिन

1
अपने कोड मैट के अलावा सिर्फ एक, अगर आप कोने के भीतरी बॉक्स पर बॉर्डर त्रिज्या को कुछ px ड्रॉप करते हैं, तो बहुत तंग हो जाता है, आपकी मदद के लिए धन्यवाद
मार्क ग्वारिन

7

मुझे बस इसके लिए एक शानदार समाधान मिला, और अब तक की सभी प्रतिक्रियाओं को देखने के बाद, मैंने इसे अभी तक पोस्ट नहीं किया है। तो, यहाँ मैंने क्या किया:

मैंने वर्ग के लिए एक सीएसएस नियम बनाया और उस नियम के लिए एक छद्म वर्ग का उपयोग किया: इस पर ध्यान केंद्रित करें। मैं outline: noneउस डिफ़ॉल्ट लाइट-ब्लू नॉन-बॉर्डर-रेडियस-सक्षम 'आउटलाइन' से छुटकारा पाने के लिए तैयार हूं जो क्रोम डिफ़ॉल्ट रूप से उपयोग करता है। फिर, उसी :focusछद्म वर्ग में, जहाँ वह रूपरेखा मौजूद नहीं है, मैंने अपनी त्रिज्या और सीमा गुणों को जोड़ा। निम्नलिखित के लिए अग्रणी

outline: none;
border-radius: 5px;
border: 2px solid maroon;

एक बॉर्डर त्रिज्या के साथ एक मैरून रंग की रूपरेखा है जो अब तब दिखाई देती है जब उपयोगकर्ता द्वारा तत्व टैब-चुना जाता है।


"रूपरेखा: 0", या "रूपरेखा: कोई नहीं" का उपयोग करना बुरा व्यवहार माना जाता है और उपयोगकर्ता की पहुंच को गड़बड़ कर देता है। इस बिंदु पर, मेरे पास कोई फ़िक्स नहीं है, लेकिन यहां एक लेख है कि आपको क्यों संभव नहीं है और यदि आपको बिल्कुल जरूरी है तो क्या करना चाहिए। कभी भी CSS की रूपरेखा नहीं निकालें
एंड्रयूब्रेट


5

यदि आप एक उभरा हुआ रूप प्राप्त करना चाहते हैं, तो आप निम्नलिखित में से कुछ कर सकते हैं:

.embossed {
  background: #e5e5e5;
  height: 100px;
  width: 200px;
  border: #FFFFFF solid 1px;
  outline: #d0d0d0 solid 1px;
  margin: 15px;
}

.border-radius {
  border-radius: 20px 20px 20px 20px;
  -webkit-border-radius: 20px;
  -moz-border-radius: 20px;
  -khtml-border-radius: 20px;
}

.outline-radius {
  -moz-outline-radius: 21px;
}
<div class="embossed"></div>
<div class="embossed border-radius"></div>
<div class="embossed border-radius outline-radius">-MOZ ONLY</div>

मुझे अन्य ब्राउज़रों में यह काम करने के लिए आसपास कोई काम नहीं मिला है।

संपादित करें: केवल दूसरा तरीका जो आप कर सकते हैं वह है बॉक्स-शैडो का उपयोग करना, लेकिन तब यह अभ्यस्त कार्य होगा यदि आपके पास पहले से ही उस तत्व पर एक बॉक्स छाया है।


1
आप एक ही तत्व पर कई छाया का उपयोग कर सकते हैं, उन्हें अल्पविराम द्वारा अलग कर सकते हैं।
बंगश

2

यदि आपको सीमा के बिना केवल रूपरेखा की आवश्यकता है तो समाधान है। यह मेरा नहीं है। मैं बूटस्ट्रैप सीएसएस फ़ाइल से मिला है। यदि आप निर्दिष्ट करते हैं outline: 1px auto certain_color, तो आपको निश्चित रंग के div के चारों ओर पतली बाहरी रेखा मिलेगी। इस मामले में निर्दिष्ट चौड़ाई का कोई फर्क नहीं पड़ता है, भले ही आप 10 पीएक्स चौड़ाई निर्दिष्ट करें, वैसे भी यह पतली रेखा होगी। उल्लेखित नियम में मुख्य शब्द "ऑटो" है।
यदि आपको गोल कोनों और निश्चित चौड़ाई के साथ रूपरेखा की आवश्यकता है, तो आप आवश्यक चौड़ाई और समान रंग के साथ सीमा पर सीएसएस नियम जोड़ सकते हैं। यह रूपरेखा को मोटा बनाता है।


2

जहाँ तक मुझे पता है, Outline radiusकेवल Android के लिए फ़ायरफ़ॉक्स और फ़ायरफ़ॉक्स द्वारा समर्थित है।

-moz-outline-radius: 1em;

यहाँ छवि विवरण दर्ज करें


1

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

सीमाएं प्रकृति में सौंदर्य हैं। रूपरेखा के विपरीत वे वास्तव में बॉक्स-मॉडल से अलग होते हैं, जिसका अर्थ है कि वे मार्जिन पर सेट पाठ को ओवरलैप नहीं करते हैं: 0; और सीमा के प्रत्येक पक्ष को व्यक्तिगत रूप से स्टाइल किया जा सकता है।

यदि आप एक कोने के दायरे को लागू करने की कोशिश कर रहे हैं तो मुझे लगता है कि आप इसका उपयोग कर रहे हैं जिस तरह से अधिकांश लोग सीमा का उपयोग करते हैं। इसलिए यदि आप मुझसे यह पूछने में कोई आपत्ति नहीं करते हैं, तो रूपरेखा की कौन सी संपत्ति सीमा पर वांछनीय है?


10
रूपरेखा का उद्देश्य कीबोर्ड नेविगेशन / एक्सेसिबिलिटी के लिए है, डेवलपर्स को दिखाने के लिए नहीं जहां तत्व हैं
डैनवेलमैन

ठीक है कि क्या ब्राउज़र उन्हें डिफ़ॉल्ट रूप से उपयोग करते हैं। लेकिन मैंने हमेशा उनका उपयोग यह देखने के लिए किया है कि मेरे डिव कहां हैं, बहुत प्रभाव के लिए।
मूसिका ३३०००

+1 उल्लेख करने के लिए कि "बॉर्डर तत्व के बाहर और बॉक्स-मॉडल मार्जिन क्षेत्र के अंदर पर बैठते हैं। आउटलाइन तत्व के अंदर बैठते हैं और बॉक्स-मॉडल पैडिंग क्षेत्र इसे अनदेखा करता है।"
जैक्स

1

कॉम्बिंग बॉक्स बॉक्स शो और ऑनलाइन।

ली हेस पर एक मामूली मोड़ जवाब मुझे मिला

input[type=text]:focus {
    box-shadow: 0 0 0 1pt red;
    outline-width: 1px;
    outline-color: red;
}

एक बहुत अच्छा साफ खत्म हो जाता है। सीमा-त्रिज्या का उपयोग करते समय आपको कोई भी आकार नहीं मिलता है


1

जैसा कि दूसरों ने कहा है, केवल फ़ायरफ़ॉक्स ही इसका समर्थन करता है। यहाँ चारों ओर एक काम है जो समान काम करता है, और यहां तक ​​कि धराशायी रूपरेखा के साथ भी काम करता है।

उदाहरण

.has-outline {
    display: inline-block;
    background: #51ab9f;
    border-radius: 10px;
    padding: 5px;
    position: relative;
}
.has-outline:after {
  border-radius: 10px;
  padding: 5px;
  border: 2px dashed #9dd5cf;
  position: absolute;
  content: '';
  top: -2px;
  left: -2px;
  bottom: -2px;
  right: -2px;
}
<div class="has-outline">
  I can haz outline
</div>


0

सीमा के लिए पैडिंग और पृष्ठभूमि रंग का उपयोग करने का प्रयास करें, फिर रूपरेखा के लिए एक सीमा:

.round_outline {
  padding: 8px;
  background-color: white;
  border-radius: 50%;
  border: 1px solid black;
}

मेरे मामले में काम किया।


0

मैं सिर्फ पारदर्शी रूपरेखा तय करता हूं।

input[type=text] {
  outline: rgba(0, 0, 0, 0);
  border-radius: 10px;
}

input[type=text]:focus {    
  border-color: #0079ff;
}

0

मुझे यह तरीका पसंद है।

.circle:before {
   content: "";
   width: 14px;
   height: 14px;
   border: 3px solid #fff;
   background-color: #ced4da;
   border-radius: 7px;
   display: inline-block;
   margin-bottom: -2px;
   margin-right: 7px;
   box-shadow: 0px 0px 0px 1px #ced4da;
}

यह चारों ओर बुद्धि सीमा के साथ ग्रे सर्कल बनाएगा और फिर से 1px सीमा के चारों ओर!


0
clip-path: circle(100px at center);

यह वास्तव में क्लिक करने योग्य केवल सर्कल बना देगा, जबकि सीमा-त्रिज्या अभी भी एक वर्ग बनाता है, लेकिन सर्कल के रूप में दिखता है।


0

मूल प्रश्न का सरल उत्तर नहीं है। एकमात्र क्रॉस-ब्राउज़र विकल्प एक हैक बनाने के लिए है जो कि आप जो चाहते हैं उसे पूरा करता है। जब यह पहले से मौजूद सामग्री को स्टाइल करने की बात करता है, तो यह दृष्टिकोण इसे कुछ संभावित मुद्दों के साथ ले जाता है , लेकिन यह अन्य समाधानों की तुलना में रूपरेखा (ऑफसेट, चौड़ाई, रेखा शैली) के अधिक अनुकूलन के लिए प्रदान करता है।

बुनियादी स्तर पर, निम्नलिखित स्थिर उदाहरण पर विचार करें (डेमो के लिए स्निपेंट चलाएं):

.outline {
    border: 2px dotted transparent;
    border-radius: 5px;
    display: inline-block;
    padding: 2px;
    margin: -4px;
}

/* :focus-within does not work in Edge or IE */
.outline:focus-within, .outline.edge {
    border-color: blue;
}

br {
    margin-bottom: 0.75rem;
}
<h3>Javascript-Free Demo</h3>
<div class="outline edge"><input type="text" placeholder="I always have an outline"/></div><br><div class="outline"><input type="text" placeholder="I have an outline when focused"/></div> *<i>Doesn't work in Edge or IE</i><br><input type="text" placeholder="I have never have an outline" />
<p>Note that the outline does not increase the spacing between the outlined input and other elements around it. The margin (-4px) compensates for the space that the outlines padding (-2px) and width (2px) take up, a total of 4px.</p>

अब, अधिक उन्नत स्तर पर, किसी दिए गए प्रकार या वर्ग के बूटस्ट्रैप तत्वों के लिए जावास्क्रिप्ट का उपयोग करना संभव होगा ताकि वे एक div के अंदर लिपटे रहें जो पेज लोड पर एक रूपरेखा का अनुकरण करता है। इसके अलावा, ईवेंट बाइंडिंग को इस तरह से उपयोगकर्ता इंटरैक्शन पर रूपरेखा दिखाने या छिपाने के लिए स्थापित किया जा सकता है (नीचे दिए गए स्निपेट को या JSFiddle में खोलें ):

h3 {
  margin: 0;
}

div {
  box-sizing: border-box;
}

.flex {
  display: flex;
}

.clickable {
  cursor: pointer;
}

.box {
  background: red;
  border: 1px solid black;
  border-radius: 10px;
  height: 5rem;
  display: flex;
  align-items: center;
  text-align: center;
  color: white;
  font-weight: bold;
  padding: 0.5rem;
  margin: 1rem;
}
<h3>Javascript-Enabled Demo</h3>
<div class="flex">
  <div class="box outline-me">I'm outlined because I contain<br>the "outline-me" class</div>
  <div class="box clickable">Click me to toggle outline</div>
</div>
<hr>
<input type="text" placeholder="I'm outlined when focused" />

<script>
// Called on an element to wrap with an outline and passed a styleObject
// the styleObject can contain the following outline properties:
// 		style, width, color, offset, radius, bottomLeftRadius,
//		bottomRightRadius, topLeftRadius, topRightRadius
// It then creates a new div with the properties specified and 
// moves the calling element into the div
// The newly created wrapper div receives the class "simulated-outline"
Element.prototype.addOutline = function (styleObject, hideOutline = true) {
    var element = this;

    // create a div for simulating an outline
    var outline = document.createElement('div');

    // initialize css formatting
    var css = 'display:inline-block;';

    // transfer any element margin to the outline div
    var margins = ['marginTop', 'marginBottom', 'marginLeft', 'marginRight'];
    var marginPropertyNames = { 
        marginTop: 'margin-top',
        marginBottom: 'margin-bottom',
        marginLeft: 'margin-left',
        marginRight: 'margin-right'
    }
    var outlineWidth = Number.parseInt(styleObject.width);
    var outlineOffset = Number.parseInt(styleObject.offset);
    for (var i = 0; i < margins.length; ++i) {
        var computedMargin = Number.parseInt(getComputedStyle(element)[margins[i]]);
        var margin = computedMargin - outlineWidth - outlineOffset;
        css += marginPropertyNames[margins[i]] + ":" + margin + "px;";
    }
    element.style.cssText += 'margin:0px !important;';
    
    // compute css border style for the outline div
    var keys = Object.keys(styleObject);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var value = styleObject[key];
        switch (key) {
            case 'style':
                var property = 'border-style';
                break;
            case 'width':
                var property = 'border-width';
                break;
            case 'color':
                var property = 'border-color';
                break;
            case 'offset':
                var property = 'padding';
                break;
            case 'radius':
                var property = 'border-radius';
                break;
            case 'bottomLeftRadius':
                var property = 'border-bottom-left-radius';
                break;
            case 'bottomRightRadius':
                var property = 'border-bottom-right-radius';
                break;
            case 'topLeftRadius':
                var property = 'border-top-left-radius-style';
                break;
            case 'topRightRadius':
                var property = 'border-top-right-radius';
                break;
        }
        css += property + ":" + value + ';';
    }
    
    // apply the computed css to the outline div
    outline.style.cssText = css;
    
    // add a class in case we want to do something with elements
    // receiving a simulated outline
    outline.classList.add('simulated-outline');
    
    // place the element inside the outline div
    var parent = element.parentElement;
    parent.insertBefore(outline, element);
    outline.appendChild(element);

    // determine whether outline should be hidden by default or not
    if (hideOutline) element.hideOutline();
}

Element.prototype.showOutline = function () {
    var element = this;
    // get a reference to the outline element that wraps this element
    var outline = element.getOutline();
    // show the outline if one exists
    if (outline) outline.classList.remove('hide-outline');
}


Element.prototype.hideOutline = function () {
    var element = this;
    // get a reference to the outline element that wraps this element
    var outline = element.getOutline();
    // hide the outline if one exists
    if (outline) outline.classList.add('hide-outline');
}

// Determines if this element has an outline. If it does, it returns the outline
// element. If it doesn't have one, return null.
Element.prototype.getOutline = function() {
    var element = this;
    var parent = element.parentElement;
    return (parent.classList.contains('simulated-outline')) ? parent : null;
}

// Determines the visiblity status of the outline, returning true if the outline is
// visible and false if it is not. If the element has no outline, null is returned.
Element.prototype.outlineStatus = function() {
    var element = this;
    var outline = element.getOutline();
    if (outline === null) {
        return null;
    } else {
        return !outline.classList.contains('hide-outline');
    }
}

// this embeds a style element in the document head for handling outline visibility
var embeddedStyle = document.querySelector('#outline-styles');
if (!embeddedStyle) {
    var style = document.createElement('style');
    style.innerText = `
        .simulated-outline.hide-outline {
            border-color: transparent !important;
        }
    `;
    document.head.append(style);
}


/*########################## example usage ##########################*/

// add outline to all elements with "outline-me" class
var outlineMeStyle = {
    style: 'dashed',
    width: '3px',
    color: 'blue',
    offset: '2px',
    radius: '5px'
};
document.querySelectorAll('.outline-me').forEach((element)=>{
  element.addOutline(outlineMeStyle, false);
});


// make clickable divs get outlines
var outlineStyle = {
    style: 'double',
    width: '4px',
    offset: '3px',
    color: 'red',
    radius: '10px'
};
document.querySelectorAll('.clickable').forEach((element)=>{
    element.addOutline(outlineStyle);
    element.addEventListener('click', (evt)=>{
        var element = evt.target;
        (element.outlineStatus()) ? element.hideOutline() : element.showOutline();
    });
});


// configure inputs to only have outline on focus
document.querySelectorAll('input').forEach((input)=>{
    var outlineStyle = {
        width: '2px',
        offset: '2px',
        color: 'black',
        style: 'dotted',
        radius: '10px'
    }
    input.addOutline(outlineStyle);
    input.addEventListener('focus', (evt)=>{
        var input = evt.target;
        input.showOutline();
    });
    input.addEventListener('blur', (evt)=>{
        var input = evt.target;
        input.hideOutline();
    });
});
</script>

समापन में, मुझे दोहराना चाहिए, कि इस दृष्टिकोण को लागू करने के लिए मुझे अपने डेमो में शामिल करने की तुलना में अधिक स्टाइल की आवश्यकता हो सकती है, खासकर यदि आपने पहले से ही उस तत्व को स्टाइल किया है जिसे आप उल्लिखित करना चाहते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.