วิธีการลบไฮไลท์ชายแดนในองค์ประกอบข้อความที่ป้อนเข้า


610

เมื่อองค์ประกอบ HTML เน้น '(เลือก / แท็บปัจจุบัน) เบราว์เซอร์จำนวนมาก (อย่างน้อย Safari และ Chrome) จะใส่เส้นขอบสีน้ำเงินรอบ ๆ

สำหรับเลย์เอาต์ที่ฉันกำลังทำอยู่นี่เป็นสิ่งที่ทำให้เสียสมาธิและดูไม่ถูกต้อง

<input type="text" name="user" class="middle" id="user" tabindex="1" />

Firefox ดูเหมือนจะไม่ทำเช่นนี้หรืออย่างน้อยจะให้ฉันควบคุมด้วย:

border: x;

ถ้ามีคนบอกฉันได้ว่าประสิทธิภาพของ IE ฉันจะอยากรู้อยากเห็น

การได้รับ Safari เพื่อลบแสงน้อยนี้จะดี

คำตอบ:


1099

ในกรณีของคุณลอง:

input.middle:focus {
    outline-width: 0;
}

หรือโดยทั่วไปแล้วจะมีผลกับองค์ประกอบรูปแบบพื้นฐานทั้งหมด:

input:focus,
select:focus,
textarea:focus,
button:focus {
    outline: none;
}

ในความคิดเห็นโนอาห์วิตมอร์แนะนำให้ดำเนินการนี้เพื่อสนับสนุนองค์ประกอบที่มีการcontenteditableตั้งค่าแอตทริบิวต์ไว้true(ทำให้พวกเขาเป็นองค์ประกอบอินพุตประเภทหนึ่งได้อย่างมีประสิทธิภาพ) ควรกำหนดเป้าหมายต่อไปนี้ด้วย (ในเบราว์เซอร์ที่สามารถใช้ CSS3):

[contenteditable="true"]:focus {
    outline: none;
}

แม้ว่าฉันจะไม่แนะนำ แต่อย่างใดคุณสามารถปิดการใช้งานโฟกัสของทุกสิ่งด้วย:

*:focus {
    outline: none;
}

โปรดทราบว่าโครงร่างโฟกัสเป็นคุณลักษณะการเข้าถึงและการใช้งาน มันบ่งบอกผู้ใช้ว่าองค์ประกอบใดที่เน้นอยู่ในปัจจุบัน


10
ขอบคุณคอรีเคล็ดลับที่ดี คุณต้องกำหนด CSS ให้กับ textarea เพื่อให้ครอบคลุมทุกฟิลด์อินพุต input:focus, textarea:focus {outline: none;}
BaronGrivet

7
อย่าลืมเลือกเช่นกันselect:focus {outline:none;}
Geek Num 88

2
นอกจากนี้ยังมี<button>แท็กซึ่งใช้โดย jQuery UI และ Twitter Bootstrap เหนือสิ่งอื่นใดดังนั้นฉันจึงเพิ่มbutton: focusในรายการเพื่อความสมบูรณ์
Chris Parton

1
จากประสบการณ์ของฉันสิ่งนี้สามารถเกิดขึ้นได้โดยไม่ต้องโฟกัสซึ่งในกรณีนี้ฉันต้องนำไปใช้กับbutton, button:focus { outline:none; }
Mike Lyons

1
@ Cᴏʀʏคุณคิดจะย้ายบันทึกย่อเกี่ยวกับ a11y และการใช้งานไปยังจุดสูงสุดของคำถามของคุณหรือไม่? IMO มันจะปรับปรุงคำตอบของคุณอย่างมากตั้งแต่การลบคุณลักษณะ a11y เป็นการปฏิบัติที่ไม่ดี
Josef Engelfrost


31

นี่เป็นเธรดเก่า แต่สำหรับการอ้างอิงสิ่งสำคัญที่ควรทราบคือไม่แนะนำให้ปิดการใช้งานเค้าร่างขององค์ประกอบอินพุตเนื่องจากจะเป็นอุปสรรคต่อการเข้าถึง

คุณสมบัติโครงร่างมีเหตุผล - จัดเตรียมผู้ใช้ด้วยการบ่งชี้ที่ชัดเจนของคีย์บอร์ดโฟกัส สำหรับการอ่านเพิ่มเติมและแหล่งข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ดูhttp://outlinenone.com/


1
Boaz, FY.m input.middle {outline: none} จะยังคงให้คุณสำรวจองค์ประกอบต่างๆ (รวมถึง input.middle) การกดปุ่มแท็บจะเน้นไปที่แท็กอินพุตเช่นกัน มีเพียงสิ่งเดียวเท่านั้นที่คุณจะไม่สามารถมองเห็นจุดโฟกัส (ร่างโฟกัส) ดังนั้นจึงไม่เป็นอันตรายที่จะใช้ ..
:)

11
@AnishNair Only thing is that you won't be able to see the focus(outline focus) on it- และนั่นคือจุดของฉัน การลบเค้าร่างจะปิดใช้งานการบ่งชี้ด้วยภาพของเหตุการณ์โฟกัสไม่ใช่เหตุการณ์จริง การลบการบ่งชี้ด้วยสายตาหมายความว่าคุณทำให้คนพิการที่พึ่งพาตัวบ่งชี้นั้นยากขึ้น
Boaz - Reinstate Monica

2
บางครั้งเราจำเป็นต้องประนีประนอมเพื่อที่จะได้สิ่ง
:)

6
@AnishNair True แต่บ่อยครั้งที่ผู้ที่อ่านหัวข้อนี้ต้องการทางออกที่ง่าย (เช่นoutline:none;) โดยไม่คำนึงถึงความหมาย เพียงเพราะบางสิ่งง่ายและประหยัดเวลาไม่ได้หมายความว่าเป็นแนวปฏิบัติที่ดีที่สุด :)
Boaz - Reinstate Monica

5
ฉันไปที่การอภิปรายช้า แต่คุณยังสามารถจัดรูปแบบสถานะโฟกัสของอินพุต (เช่นการเปลี่ยนสีหรือความกว้างของเส้นขอบ) ตราบใดที่คุณคำนึงถึงความสามารถในการเข้าถึงเมื่อทำเช่นนั้น (ความเปรียบต่างที่ดี ฯลฯ ) มันจะเข้าถึงได้ง่ายเท่ากับค่าเริ่มต้น
Meg

18

นี่เป็นข้อกังวลร่วมกัน

เค้าร่างเริ่มต้นที่เบราว์เซอร์แสดงนั้นน่าเกลียด

ดูตัวอย่างนี้:


"แก้ไข" ทั่วไปที่แนะนำมากที่สุดคือoutline:none- ซึ่งหากใช้อย่างไม่ถูกต้อง - เป็นหายนะสำหรับการเข้าถึง


ดังนั้น ... ของสิ่งที่เป็นโครงร่างต่อไปหรือไม่

มีเว็บไซต์แห้งมากที่ฉันพบซึ่งอธิบายทุกอย่างได้ดี

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

ตกลงลองทำตัวอย่างเดียวกันข้างบนตอนนี้ใช้TABปุ่มเพื่อนำทาง

สังเกตว่าคุณสามารถบอกได้ว่าโฟกัสอยู่ที่ใดโดยไม่คลิกอินพุต?

ตอนนี้มาลองกัน outline:noneความเชื่อถือกันกันดีกว่า<input>

ดังนั้นอีกครั้งให้ใช้TABปุ่มเพื่อนำทางหลังจากคลิกข้อความและดูว่าเกิดอะไรขึ้น

มาดูกันว่ามันยากกว่ากันที่จะหาว่าโฟกัสอยู่ที่ไหน? สัญญาณบอกเพียงอย่างเดียวคือเคอร์เซอร์กะพริบ ตัวอย่างด้านบนของฉันเรียบง่ายเกินไป ในสถานการณ์จริงคุณจะไม่มีองค์ประกอบเดียวในหน้านั้น บางสิ่งบางอย่างมากขึ้นตามสายของสิ่งนี้

ตอนนี้ให้เปรียบเทียบกับเทมเพลตเดียวกันถ้าเรารักษาเค้าร่างไว้:

ดังนั้นเราจึงได้จัดตั้งขึ้นดังต่อไปนี้

  1. เค้าร่างน่าเกลียด
  2. การลบออกทำให้ชีวิตยากขึ้น

ดังนั้นคำตอบคืออะไร

ลบโครงร่างที่น่าเกลียดและเพิ่มตัวชี้นำภาพของคุณเองเพื่อระบุโฟกัส

นี่คือตัวอย่างง่ายๆของสิ่งที่ฉันหมายถึง

ฉันจะลบร่างและเพิ่มขอบด้านล่าง: โฟกัสและ: การใช้งาน ฉันยังลบเส้นขอบเริ่มต้นที่ด้านบนซ้ายและขวาด้วยการตั้งค่าให้โปร่งใสใน: โฟกัสและ: ใช้งาน (การตั้งค่าส่วนตัว)

ดังนั้นเราจึงลองวิธีข้างต้นด้วยตัวอย่าง "โลกแห่งความจริง" ของเราจากก่อนหน้านี้:

สิ่งนี้สามารถขยายเพิ่มเติมได้โดยใช้ไลบรารีภายนอกที่สร้างบนแนวคิดของการแก้ไข "เค้าร่าง" ซึ่งตรงข้ามกับการลบออกทั้งหมดเช่นMaterialize

คุณสามารถจบลงด้วยสิ่งที่ไม่น่าเกลียดและทำงานด้วยความพยายามน้อยมาก


18

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

input:focus, input.form-control:focus {

    outline:none !important;
    outline-width: 0 !important;
    box-shadow: none;
    -moz-box-shadow: none;
    -webkit-box-shadow: none;
}

6

คุณสามารถใช้ CSS เพื่อปิดการใช้งาน! นี่คือรหัสที่ฉันใช้สำหรับปิดการใช้งานเส้นขอบสีฟ้า:

*:focus {
outline: none;
}

นี่จะเป็นการลบเส้นขอบสีน้ำเงิน!

นี่คือตัวอย่างการทำงาน: JSfiddle.net

หวังว่ามันจะช่วย!


4

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

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

มันไม่ได้หยุดคุณจากการเขียนสไตล์การโฟกัสแบบกำหนดเองสำหรับองค์ประกอบบางอย่าง แต่อย่างน้อยก็ให้ค่าเริ่มต้นที่ดี

นี่คือวิธีที่ฉันทำ:

// detect keyboard users

const keyboardUserCssClass = "keyboardUser";

function setIsKeyboardUser(isKeyboard) {
  const { body } = document;
  if (isKeyboard) {
   body.classList.contains(keyboardUserCssClass) || body.classList.add(keyboardUserCssClass);
  } else {
   body.classList.remove(keyboardUserCssClass);
  }
}

// This is a quick hack to activate focus styles only when the user is
// navigating with TAB key. This is the best compromise we've found to
// keep nice design without sacrifying accessibility.
document.addEventListener("keydown", e => {
  if (e.key === "Tab") {
   setIsKeyboardUser(true);
  }
});
document.addEventListener("click", e => {
  // Pressing ENTER on buttons triggers a click event with coordinates to 0
  setIsKeyboardUser(!e.screenX && !e.screenY);
});

document.addEventListener("mousedown", e => {
  setIsKeyboardUser(false);
});
body:not(.keyboardUser) *:focus {
  outline: none;
}
<p>By default, you'll see no outline. But press TAB key and you'll see focussed element</p>
<button>This is a button</button>
<a href="#">This is anchor link</a>
<input type="checkbox" />
<textarea>textarea</textarea>
<select/>


นี่เป็นวิธีการอย่างละเอียด clickฟังเป็นสัมผัสที่ดี
Keith DC

4

ฉันพยายามทุกคำตอบและฉันยังคงไม่สามารถรับของเราที่จะทำงานในมือถือ-webkit-tap-highlight-colorจนกว่าเราจะพบว่า

ดังนั้นสิ่งที่ใช้ได้ผลสำหรับฉันคือ ...

* { -webkit-tap-highlight-color: transparent; }

1
นั่นเป็นทางออกที่ฉันกำลังค้นหา สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อคุณสัมผัสกับหน้าจอสัมผัสด้วยองค์ประกอบต่างๆเช่น li
Anand G



2

ไม่มีวิธีแก้ปัญหาใดที่เหมาะกับฉันใน Firefox

วิธีแก้ไขปัญหาต่อไปนี้จะเปลี่ยนลักษณะเส้นขอบที่โฟกัสสำหรับ Firefox และตั้งค่าเค้าโครงเป็นไม่มีสำหรับเบราว์เซอร์อื่น

ฉันทำให้เส้นขอบการโฟกัสเปลี่ยนไปจากการเรืองแสงสีน้ำเงิน 3px เป็นสไตล์เส้นขอบที่ตรงกับเส้นขอบพื้นที่ข้อความ นี่คือลักษณะเส้นขอบบางส่วน:

ขอบประ (เส้นขอบ 2px แดงประ): เส้นประที่ขีด  เส้นขอบ 2px ประสีแดง

ไม่มีพรมแดน! (เส้นขอบ 0px):
ไม่มีพรมแดน  ชายแดน: 0px

ขอบ Textarea (เส้นขอบ 1px สีเทาทึบ): ขอบ textarea  เส้นขอบ 1px สีเทาทึบ

นี่คือรหัส:

input:focus, textarea:focus {
    outline: none; /** For Safari, etc **/
    border:1px solid gray; /** For Firefox **/
}

#textarea  {
  position:absolute;
  top:10px;
  left:10px;
  right:10px;
  width:calc(100% - 20px);
  height:160px;
  display:inline-block;
  margin-top:-0.2em;
}
<textarea id="textarea">yo</textarea>


1

คุณสามารถลองสิ่งนี้ได้เช่นกัน

input[type="text"] {
outline-style: none;
}

หรือ

.classname input{
outline-style: none;
}

1

คุณสามารถลบเส้นขอบสีส้มหรือน้ำเงิน (เค้าร่าง) รอบ ๆ กล่องข้อความ / อินพุตโดยใช้: outline: none

input {
    background-color: transparent;
    border: 0px solid;
    height: 20px;
    width: 160px;
    color: #CCC;
    outline:none !important;
}

0

ลบโครงร่างเมื่อโฟกัสอยู่ที่องค์ประกอบโดยใช้คุณสมบัติ CSS ด้านล่าง:

input:focus {
    outline: 0;
}

คุณสมบัติ CSS นี้จะลบโครงร่างสำหรับฟิลด์อินพุตทั้งหมดบนโฟกัสหรือใช้คลาสหลอกเพื่อลบโครงร่างขององค์ประกอบโดยใช้คุณสมบัติ CSS ด้านล่าง

.className input:focus {
    outline: 0;
} 

คุณสมบัตินี้จะลบโครงร่างสำหรับองค์ประกอบที่เลือก


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