สรุปรัศมี


473

จะมีต่อไปในการได้รับมุมโค้งมนบนร่างของdiv elementคล้ายกับborder-radius?


2
ฉันได้กล่อง Div ที่มีเส้นขอบสีเทาขนาด 2px พร้อมรัศมี 20px แล้วฉันหลงทางถ้าฉันสามารถมี 10px Outine รอบขอบนั้นที่ตามแนวชายแดนแทนที่จะเป็นสี่เหลี่ยม
Marc Guerin

4
นี่เป็นคำถามที่ดี องค์ประกอบที่มีborder: 5px redและoutline: 5px blueและborder-radius: 5pxเส้นขอบถูกปัดเศษ แต่โครงร่างเป็นรูปสี่เหลี่ยม
Matthew Rudy

4
จนถึงตอนนี้เราสามารถใช้งานได้เฉพาะใน Firefox:-moz-outline-radius
Wojciech Bednarski

ควรเป็นส่วนหนึ่งของ CSS3 ... ถ้าฉันคิดเกี่ยวกับมัน - ฉันเกลียด W3C: D
m93a

17
คุณทุกคนต้องการbox-shadowในชีวิตของคุณ ..
Muhammad Umer

คำตอบ:


538

คำถามเก่าตอนนี้ แต่อาจเกี่ยวข้องกับใครบางคนที่มีปัญหาคล้ายกัน ฉันมีช่องป้อนข้อมูลที่มนborderและต้องการเปลี่ยนสีของโครงร่างโฟกัส ฉันไม่สามารถเชื่อสแควร์ที่น่ากลัวoutlineให้กับตัวควบคุมอินพุทได้

ดังนั้นฉันจึงใช้ box-shadow แทน ฉันชอบเงาที่ดูเรียบมาก แต่เงานั้นสามารถทำให้แข็งขึ้นเพื่อจำลองโครงโค้งมน:

 /* 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
John Morton

2
นี่คือสิ่งที่ฉันกำลังมองหาและเหมาะสมยิ่งกว่ารัศมีเค้าร่าง
Zenexer

2
ตัวอย่างเค้าโครงอย่างหนักไม่ทำงาน มันเป็นแค่สี่เหลี่ยมผืนผ้าโดยไม่มีรัศมี
Erik Aigner

1
outline: 0ทำลายการเข้าถึงเว็บ อ่านoutlinenone.com
ianstarz

4
@ianstarz มันหยุดการเข้าถึงเมื่อคุณไม่ใส่สไตล์ให้คุณ box-shadowเป็นรูปแบบทางเลือก (ซึ่งตามที่นำเสนอที่นี่จริง ๆ แล้วคล้ายกันมากในลักษณะที่ปรากฏoutline)
ACJ

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
DávidHorváth

2
เป็นไปไม่ได้ที่จะสร้าง :: หลังจากหลอกสำหรับช่องป้อนข้อมูล
Simon Franzen

ขอบคุณสิ่งนี้ทำงานได้ดีมากกับเค้าร่างข้อความค้นหาของ react-sortable-tree!
ราชาวดี

ฉันชอบโซลูชันนี้เพราะมีความยืดหยุ่นมากกว่าbox-shadowรุ่นอื่น ๆ ตัวอย่างเช่นถ้าคุณต้องการให้ "เค้าร่าง" เว้นระยะห่างจากองค์ประกอบ (เช่นการจำลองoutline-offset) มันจะเป็นไปได้ด้วยเทคนิคนี้
Kirk Woll

34

คล้ายกับ Lea Hayes ด้านบน แต่นี่เป็นวิธีที่ฉันทำ:

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 หรือ jQuery อีกต่อไปแล้ว Altho สำหรับช่วงสั้น ๆ ที่ฉันได้ใช้ตัวแปร -moz และ -webkit ของ CSS บางตัว คุณสามารถเห็นผลลัพธ์ด้านบน


6
เขากำลังพูดถึงเค้าไม่ใช่เส้นขอบ ... "เค้าร่าง" รัศมี
android.nick

5
ถูกต้อง แต่เนื่องจากรัศมีเค้าร่างไม่พร้อมใช้งานวิธีการของฉันจะให้ลักษณะที่ปรากฏของเส้นขอบเช่นเดียวกับเค้าร่าง นี่เป็นเอฟเฟ็กต์ภาพดังนั้นเว้นแต่ว่าการออกแบบของ Marc นั้นจะระบุลงไปจนถึงพิกเซลความจริงที่ว่ามันไม่ได้ใช้คุณสมบัติเค้าร่างนั้นก็ไม่ต่างอะไร และเนื่องจากเป็นวิธีแก้ปัญหาที่ใช้งานได้จริงฉันจึงขอขอบคุณโหวตกลับ
Heraldmonkey

2
มันใช้งานได้ดีมาก insetแม้ว่าฉันไม่ได้ใช้และได้รับสิ่งที่ฉันต้องการ
Paul Schreiber

18

ฉันต้องการความสามารถในการเข้าถึงโฟกัสที่ดีสำหรับเมนูแบบเลื่อนลงในแถบนำทาง Bootstrap และมีความสุขมากกับสิ่งนี้:

     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;
}

แก้ไข

มี Firefox -moz-outline-radiusอย่างถูกต้องเท่านั้นแต่มันจะไม่ทำงานบน IE / Chrome / Safari / Opera / ฯลฯ ดังนั้นดูเหมือนว่าวิธีที่เข้ากันได้ข้ามเบราว์เซอร์มากที่สุด*ในการรับเส้นโค้งรอบ ๆ เส้นขอบคือการใช้ div wrapper:

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
ไม่ฉันรู้วิธีได้รับขอบเขตของรัศมีฉันหลงทางถ้าคุณสามารถรับโครงร่างรัศมี
Marc Guerin

หมายถึงอะไรกันแน่ ร่างที่หนาขึ้นเช่นนี้? jsfiddle.net/mattball/NXZFv/1
แมตต์บอล

10
@ Matt: โค้งร่างแทนชายแดนอย่างเห็นได้ชัด ดูw3.org/TR/CSS21/ui.html#dynamic-outlines
Joey

ฉันได้กล่อง Div ที่มีเส้นขอบสีเทา 2px พร้อมรัศมี 20px แล้วฉันหลงทางถ้าฉันสามารถมี 10px Outine รอบ ๆ เส้นขอบที่ตามขอบแทนที่จะเป็นสี่เหลี่ยมจัตุรัส
Marc Guerin

1
เพิ่มรหัสด้านหนึ่งของคุณเพียงแค่ถ้าคุณปล่อยรัศมีเส้นขอบไม่กี่พิกเซลบนกล่องด้านในมุมนั้นจะแน่นมากขึ้นขอบคุณสำหรับความช่วยเหลือของคุณ
Marc Guerin

7

ฉันเพิ่งพบทางออกที่ดีสำหรับเรื่องนี้และหลังจากดูคำตอบทั้งหมดแล้วฉันยังไม่เห็นโพสต์เลย ดังนั้นนี่คือสิ่งที่ฉันทำ:

ฉันสร้าง CSS Rule สำหรับคลาสนั้นและใช้คลาส pseudo ของ: focus สำหรับกฎนั้น ฉันตั้งค่าoutline: noneให้กำจัด 'โครงร่าง' ที่เป็นสีฟ้าอ่อนที่ไม่ใช่เส้นขอบรัศมีที่ Chrome ใช้เป็นค่าเริ่มต้น จากนั้นใน:focusชั้นเรียนเดียวกันแบบหลอกที่ไม่มีเค้าร่างอีกต่อไปฉันเพิ่มรัศมีและคุณสมบัติเส้นขอบของฉัน นำไปสู่การดังต่อไปนี้

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

เพื่อให้มีโครงร่างสีน้ำตาลแดงที่มีรัศมีเส้นขอบที่ปรากฏในขณะนี้เมื่อองค์ประกอบถูกเลือกโดยแท็บโดยผู้ใช้


การใช้ "เค้าร่าง: 0" หรือ "เค้าร่าง: ไม่มี" ถือว่าเป็นแนวปฏิบัติที่ไม่ดีและทำให้ผู้ใช้งานไม่สะดวก ณ จุดนี้ฉันไม่มีการแก้ไข แต่นี่เป็นบทความเกี่ยวกับสาเหตุที่คุณไม่ควรลบเค้าร่างถ้าเป็นไปได้และจะทำอย่างไรถ้าคุณต้อง อย่าลบโครงร่าง CSS
AndrewBrntt


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>

ฉันไม่พบวิธีแก้ไขเพื่อให้ได้งานนี้ในเบราว์เซอร์อื่น

แก้ไข:วิธีเดียวที่คุณสามารถทำได้คือใช้ box-shadow แต่วิธีนี้จะไม่ทำงานหากคุณมี shadow box ในองค์ประกอบนั้นอยู่แล้ว


1
คุณสามารถใช้เงาหลายอันในองค์ประกอบเดียวกันโดยแยกพวกมันด้วยเครื่องหมายจุลภาค
Bangash

2

มีวิธีแก้ปัญหาหากคุณต้องการร่างโดยไม่มีขอบ ไม่ใช่ของฉัน. ฉันได้รับจากไฟล์ Bootstrap css หากคุณระบุoutline: 1px auto certain_colorคุณจะได้เส้นรอบนอกบางเส้นที่มีสีใด ๆ ในกรณีนี้ความกว้างที่ระบุนั้นไม่สำคัญแม้ว่าคุณจะระบุความกว้าง 10 px ก็ตามมันจะเป็นเส้นบาง ๆ คำสำคัญในกฎที่กล่าวถึงคือ "อัตโนมัติ"
หากคุณต้องการโครงร่างที่มีมุมโค้งมนและความกว้างที่แน่นอนคุณสามารถเพิ่มกฎ css บนเส้นขอบที่มีความกว้างและสีที่ต้องการได้ มันทำให้ร่างหนาขึ้น


2

เท่าที่ฉันรู้Outline radiusมีเพียงรองรับ Firefox และ Firefox สำหรับ Android

-moz-outline-radius: 1em;

ป้อนคำอธิบายรูปภาพที่นี่


1

ไม่เส้นขอบจะนั่งอยู่ด้านนอกองค์ประกอบและด้านในของพื้นที่มาร์จิ้นโมเดล โครงร่างนั่งอยู่ด้านในขององค์ประกอบและพื้นที่ช่องว่างภายในของช่องโมเดลจะละเว้น มันไม่ได้มีไว้เพื่อความสวยงาม เป็นเพียงการแสดงให้ผู้ออกแบบเห็นถึงองค์ประกอบขององค์ประกอบ ในช่วงแรกของการพัฒนาเอกสาร html ตัวอย่างเช่นนักพัฒนาอาจต้องแยกแยะอย่างรวดเร็วหากพวกเขาวาง divs โครงร่างทั้งหมดไว้ในตำแหน่งที่ถูกต้อง หลังจากนั้นพวกเขาอาจต้องตรวจสอบว่าปุ่มและแบบฟอร์มต่าง ๆ มีจำนวนพิกเซลที่ถูกต้องนอกเหนือจากกันหรือไม่

เส้นขอบมีความสวยงามในธรรมชาติ ซึ่งแตกต่างจากโครงร่างจริง ๆ แล้วพวกเขาแตกต่างจากกล่องแบบซึ่งหมายความว่าพวกเขาจะไม่ทับซ้อนข้อความตั้งค่าเพื่อระยะขอบ: 0; และแต่ละด้านของเส้นขอบสามารถจัดลักษณะเป็นรายบุคคล

หากคุณพยายามใช้รัศมีมุมเพื่อจัดเค้าร่างฉันคิดว่าคุณใช้มันในลักษณะที่คนส่วนใหญ่ใช้เส้นขอบ ดังนั้นหากคุณไม่รังเกียจที่จะถามฉันว่าคุณสมบัติของโครงร่างใดที่ทำให้เป็นที่ต้องการข้ามชายแดน


10
จุดประสงค์ของโครงร่างมีไว้สำหรับการนำทางด้วยแป้นพิมพ์ / การเข้าถึงไม่แสดงนักพัฒนาที่มีองค์ประกอบต่างๆ
danwellman

นั่นคือสิ่งที่เบราว์เซอร์ใช้เพื่อเป็นค่าเริ่มต้น แต่ฉันมักจะใช้พวกเขาเพื่อดูว่ากองกำลังของฉันอยู่ที่ไหนเพื่อผลที่ดีเยี่ยม
Musixauce3000

+1 สำหรับการกล่าวถึงว่า "เส้นขอบนั่งอยู่ด้านนอกขององค์ประกอบและด้านในของพื้นที่ขอบกล่องแบบจำลองเค้าร่างนั่งอยู่ด้านในขององค์ประกอบและพื้นที่ช่องว่างภายในแบบจำลองกล่องละเว้น"
Jacques

1

กล่องรวมเงาและโครงร่าง

คำตอบของLea Hayes ที่บิดเบี้ยวเล็กน้อยฉันพบ

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

ได้รับการทำความสะอาดที่ดีจริงๆ ไม่มีการกระโดดขนาดที่คุณได้รับเมื่อใช้รัศมีเส้นขอบ


1

อย่างที่คนอื่นพูดมี แต่ Firefox เท่านั้นที่สนับสนุนสิ่งนี้ นี่คือการทำงานที่ทำในสิ่งเดียวกันและทำงานร่วมกับโครงร่างที่ประ

ตัวอย่าง

.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>

ตอนนี้ในระดับสูงขึ้นไปแล้วมันเป็นไปได้ที่จะใช้จาวาสคริปต์ในการบูทองค์ประกอบของประเภทหรือคลาสที่กำหนด นอกจากนี้ยังสามารถสร้างการเชื่อมโยงเหตุการณ์เพื่อแสดงหรือซ่อนโครงร่างในการโต้ตอบของผู้ใช้เช่นนี้ (เรียกใช้ตัวอย่างด้านล่างหรือเปิดใน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>

ในการปิดให้ฉันย้ำว่าการใช้วิธีการนี้อาจต้องจัดแต่งทรงผมมากกว่าสิ่งที่ฉันได้รวมอยู่ในการสาธิตของฉันโดยเฉพาะอย่างยิ่งถ้าคุณได้กำหนดองค์ประกอบที่คุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.