ฉันสามารถใช้ a: before หรือ: หลังจาก pseudo-element บนฟิลด์อินพุตได้หรือไม่?


686

ฉันกำลังพยายามใช้:afterองค์ประกอบหลอก CSS บนinputเขตข้อมูล แต่มันไม่ทำงาน ถ้าฉันใช้กับ a spanมันใช้งานได้ดี

<style type="text/css">
.mystyle:after {content:url(smiley.gif);}
.mystyle {color:red;}
</style>

ใช้งานได้ (ทำให้ยิ้มหลังจาก "buu!" และก่อน "เพิ่มเติม")

<span class="mystyle">buuu!</span>a some more

สิ่งนี้ใช้ไม่ได้ - มีเพียงบางสีเท่านั้นค่าสีแดง แต่ไม่มีรอยยิ้ม

<input class="mystyle" type="text" value="someValue">

ผมทำอะไรผิดหรือเปล่า? ฉันควรใช้ตัวเลือกหลอกอื่น

หมายเหตุ: ฉันไม่สามารถเพิ่มสิ่งspanรอบตัวของฉันinputเพราะมันถูกสร้างขึ้นโดยการควบคุมของบุคคลที่สาม


หากคุณไม่สามารถควบคุม HTML ได้อย่างแน่นอนให้ลองเปลี่ยนส่วนที่border-colorเหลือinputแทน ฉันพบว่ามันดึงดูดความสนใจมากกว่า
Blazemonger

คำตอบ:


255

:afterและ:beforeไม่ได้รับการสนับสนุนใน Internet Explorer 7 และภายใต้องค์ประกอบใด ๆ

นอกจากนี้ยังไม่ได้หมายความว่าจะใช้ในองค์ประกอบแทนที่เช่นองค์ประกอบของแบบฟอร์ม (ปัจจัย) และองค์ประกอบภาพ

กล่าวอีกนัยหนึ่งเป็นไปไม่ได้ที่ CSS บริสุทธิ์

อย่างไรก็ตามหากใช้jQueryคุณสามารถใช้

$(".mystyle").after("add your smiley here");

API เอกสารใน. ภายหลัง

ในการผนวกเนื้อหาของคุณด้วย javascript สิ่งนี้จะใช้ได้กับทุกเบราว์เซอร์


อเล็กซ์ฉันใช้ IE8 และ FF ล่าสุดดังนั้น IE7 ไม่ใช่ปัญหา ฉันกำลัง seraching สำหรับเอกสารใด ๆ เกี่ยวกับ limiatation ของ: หลังจาก แต่ไม่สามารถหาได้ w3.org/TR/CSS2/generate.htmlระบุว่ามันถูกแทรกหลังโหนดปัจจุบันในแผนผังต้นไม้ดังนั้นจึงควรทำงานในทั้งสองกรณี
matra

3
เว้นแต่ว่าคุณกำลังสร้างหน้าเพียงเพื่อการใช้งานของคุณเองร้อยละขนาดใหญ่ของอินเทอร์เน็ตใช้เบราว์เซอร์เหล่านั้นยังคง ข้อมูลจำเพาะของ w3c บอกว่าใช่ แต่อย่างที่คุณทราบกันดีว่าเบราว์เซอร์ใช้การตีความมาตรฐานของตัวเอง การใช้: หลังจากที่อินพุตจะใช้งานได้ใน Opera 9+ เท่านั้น แต่ไม่ได้ใช้ใน IE, FF, ซาฟารีหรือโครมเนื่องจากวิธีที่พวกเขาสร้าง DOM ภายใน - ไม่สามารถทำได้ด้วย CSS บริสุทธิ์
อเล็กซ์

3
ฉันไม่แน่ใจว่าเป็นกรณีนี้ในเดือนเมษายนหรือไม่ แต่ Webkit ให้การสนับสนุน:afterโดยทั่วไปแม้ว่าจะไม่สนับสนุน:beforeหรือ:afterอินพุต
coreyward

258
เท่าที่ฉันเข้าใจองค์ประกอบW3C :afterและ:beforeหลอกพวกเขาสามารถวางองค์ประกอบภาชนะได้ ทำไม? เพราะมันถูกผนวกเข้าด้านในองค์ประกอบที่เฉพาะเจาะจง inputไม่ใช่ภาชนะ buttonเช่นเป็นเช่นนั้นคุณสามารถใส่พวกเขาใน ทำงานได้ตามที่คาดหวัง ข้อมูลจำเพาะจริงพูดว่า: ก่อนและหลังเนื้อหาต้นไม้เอกสารองค์ประกอบของมันอย่างชัดเจนว่าเนื้อหา ดังนั้นองค์ประกอบจะต้องเป็นภาชนะ
Robert Koritnik

29
คำตอบต่อไปคือวิธีที่ดีกว่า .. ให้เหตุผลที่แท้จริงมากกว่าการพูดคุยเกี่ยวกับ IE 7 (ที่ใส่ใจ) และ jQuery (ความคิดที่ไม่ดี)
โร

1305

:beforeและ:afterแสดงผลภายในภาชนะ

และ <input> ไม่สามารถมีองค์ประกอบอื่น ๆ


องค์ประกอบ Pseudo สามารถกำหนดได้ (หรือกล่าวสนับสนุนที่ดีกว่าเท่านั้น) ในองค์ประกอบภาชนะ เพราะวิธีที่พวกเขาจะแสดงผลอยู่ในภาชนะที่ตัวเองเป็นองค์ประกอบเด็ก inputไม่สามารถมีองค์ประกอบอื่น ๆ ได้ดังนั้นจึงไม่รองรับ A buttonในทางกลับกันนั่นก็เป็นองค์ประกอบของฟอร์มที่รองรับพวกมันเพราะมันเป็นที่เก็บขององค์ประกอบย่อยอื่น ๆ

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

ข้อกำหนด W3C

หากเราอ่านข้อกำหนดอย่างละเอียดจริง ๆ แล้วมันบอกว่ามันถูกแทรกเข้าไปในองค์ประกอบที่มี:

ผู้เขียนระบุสไตล์และที่ตั้งของเนื้อหาที่สร้างด้วย: before และ: after pseudo-elements ตามที่ชื่อระบุไว้: ก่อนและ: หลังจากองค์ประกอบแบบหลอกระบุตำแหน่งของเนื้อหาก่อนและหลังเนื้อหาต้นไม้เอกสารขององค์ประกอบ คุณสมบัติ 'เนื้อหา' ร่วมกับองค์ประกอบหลอกเหล่านี้ระบุสิ่งที่ถูกแทรก

ดู? ต้นไม้เอกสารองค์ประกอบของเนื้อหา อย่างที่ฉันเข้าใจนี่หมายถึงภายในคอนเทนเนอร์


119
+1 ดีกว่าคำตอบที่ยอมรับ ขอบคุณสำหรับคำอธิบายที่ชัดเจนของมาตรฐาน มีประโยชน์มากมายสำหรับ[required]::before { content "*"; color: red; }: P
Kevin Peno

93
เคล็ดลับ: หากคุณมีปัญหากับการป้อนข้อมูลแบบส่ง<input type="submit" value="Send"/>ให้ใช้<button type="submit">Send</button>แทน นำเสนอเป็นเหมือนกัน แต่<button>เป็นภาชนะจึงสนับสนุนและ:before :after
ไข้หวัดใหญ่

15
เกี่ยวกับ<hr />อะไร ฉันคิดว่ามันไม่ใช่องค์ประกอบของคอนเทนเนอร์ แต่มันสามารถแสดงผล:afterและ:before jsfiddle.net/Uf88j/1
ล็อค

7
@dlocklock: นั่นน่าสนใจจริงๆ ฉันจะบอกว่ามันต้องเป็นความผิดปกติบางอย่างและฉันจะไม่พึ่งพามันในการทำงานข้ามเบราว์เซอร์หรือข้ามรุ่น ... HR ไม่ได้เป็นองค์ประกอบคอนเทนเนอร์ดังนั้นจึงไม่ควรอนุญาตให้มีองค์ประกอบหลอก แม้แต่มาตรฐาน W3C ก็บอกว่าไม่อนุญาตให้มีเนื้อหา และถ้าคุณตรวจสอบองค์ประกอบที่เป็นโมฆะคุณจะเห็นว่าองค์ประกอบเหล่านี้ไม่ควรมีเนื้อหาใด ๆ ภายใต้สถานการณ์ใด ๆ องค์ประกอบหลอกเป็นเนื้อหาดังนั้นคาดว่ารุ่นเบราว์เซอร์ในอนาคตจะไม่สามารถแสดงได้
Robert Koritnik

5
" : ก่อนและ: หลังจากแสดงผลภายในคอนเทนเนอร์ " The: ก่อนและ: หลังจากองค์ประกอบหลอกมา " ก่อนและหลังเนื้อหา " ไม่ใช่ "ที่จุดเริ่มต้นหรือจุดสิ้นสุด" ของคอนเทนเนอร์ ข้อมูลจำเพาะไม่ได้พูดถึงภาชนะ ด้วยแท็กเช่นpและh1เนื้อหาอยู่ในแท็กดังนั้นก่อน / หลังจะปรากฏขึ้นภายในเช่นกัน ด้วยองค์ประกอบที่ต้องการinputและhr:: ก่อนและ: หลังจากจะยังคงปรากฏก่อนหรือหลังเนื้อหา แต่ไม่มีคอนเทนเนอร์ที่เกี่ยวข้อง (โดยเฉพาะสำหรับinput) อินพุต: ตรวจสอบ: ก่อนที่จะใช้กันอย่างแพร่หลายเพื่อระบุช่องทำเครื่องหมายที่ถูกตรวจสอบผ่านทาง CSS
Radley Sustaire

60

มันทำงานได้กับอินพุตบางประเภท อย่างน้อยใน Chrome

<input type="checkbox" />

ทำงานได้ดีเช่นเดียวกับ

<input type="radio" />

มันเป็นเพียงtype=textและคนอื่น ๆ ที่ไม่ทำงาน


1
@ ANANE ใช้งานได้กับ Chromium แต่ไม่ใช่ใน Firefox
kcpr

45

นี่เป็นอีกวิธีหนึ่ง (สมมติว่าคุณสามารถควบคุม HTML ได้): เพิ่มช่องว่าง<span></span>ด้านขวาหลังจากอินพุตและกำหนดเป้าหมายในการใช้ CSSinput.mystyle + span:after

.field_with_errors {
  display: inline;
  color: red;
}
.field_with_errors input+span:after {
  content: "*"
}
<div class="field_with_errors">Label:</div>
<div class="field_with_errors">
  <input type="text" /><span></span> 
</div>

ผมใช้วิธีนี้ใน AngularJS เพราะมันจะเพิ่ม.ng-invalidชั้นเรียนโดยอัตโนมัติไปยัง<input>รูปแบบองค์ประกอบและรูปแบบ <label>แต่ไม่ได้ไป


1
input:hover+span:after{color: blue}จะช่วยให้การเพิ่มการกระทำโฉบเช่น: upvote
krassowski

2
ทำไมคำตอบนี้มี upvotes น้อยมาก? ฉันคิดว่าความรู้ทางทฤษฎีมีความสำคัญ แต่สิ่งนี้สามารถแก้ไขปัญหาได้
jorgefpastor

ตัวเลือกที่ดีที่จะไปด้วยเพื่อแก้ไขปัญหา
ตลก

39

:beforeและ:afterถูกนำไปใช้ภายในคอนเทนเนอร์ซึ่งหมายความว่าคุณสามารถใช้มันสำหรับองค์ประกอบที่มีแท็กสิ้นสุด

มันใช้ไม่ได้กับองค์ประกอบที่ปิดตัวเอง

ในหมายเหตุด้านองค์ประกอบที่ปิดตัวเอง (เช่น img / ชม. / อินพุต) ยังเป็นที่รู้จักในนาม 'องค์ประกอบแทนที่' เนื่องจากมีการแทนที่ด้วยเนื้อหาที่เกี่ยวข้อง "External Objects" เพราะขาดเทอมที่ดีกว่า อ่านที่นี่ดีกว่า


คำตอบนี้ถูกต้องกระชับและให้บริบทที่สำคัญ ควรจะอยู่ด้านบน imo
พอล

32

ฉันใช้background-imageเพื่อสร้างจุดสีแดงสำหรับฟิลด์ที่ต้องการ

input[type="text"][required] {
  background-image: radial-gradient(red 15%, transparent 16%);
  background-size: 1em 1em;
  background-position: top right;
  background-repeat: no-repeat
}

ดู Codepen


20

คุณไม่สามารถใส่องค์ประกอบหลอกในองค์ประกอบอินพุต แต่สามารถใส่องค์ประกอบเงาเช่นตัวยึด!

input[type="text"] {   
  &::-webkit-input-placeholder {
    &:before {
      // your code
    }
  }
}

จะทำให้การทำงานในเบราว์เซอร์อื่น ๆ ให้ใช้:-moz-placeholder, ::-moz-placeholderและในตัวเลือกที่แตกต่างกัน:-ms-input-placeholder ไม่สามารถจัดกลุ่มตัวเลือกได้เนื่องจากหากเบราว์เซอร์ไม่รู้จักตัวเลือกจะทำให้คำสั่งทั้งหมดใช้ไม่ได้

UPDATE : โค้ดด้านบนใช้ได้กับ CSS pre-processor เท่านั้น (SASS, LESS ... ) โดยไม่ต้องใช้ตัวประมวลผลล่วงหน้า:

input[type="text"]::-webkit-input-placeholder:before { // your code }

3
ดี! โปรดทราบว่าองค์ประกอบตัวยึดตำแหน่งมีการสนับสนุนคุณสมบัติที่ จำกัด : สีพื้นหลังการเว้นวรรคคำการเว้นวรรคตัวอักษรการตกแต่งข้อความการจัดเรียงแนวตั้งการแปลงข้อความความสูงบรรทัดเยื้องข้อความความทึบ ดูcss-tricks.com/almanac/selectors/p/placeholder
henry

ขอบคุณสำหรับคำใบ้ เพียงจำไว้ว่าทุกสิ่งที่อยู่ในองค์ประกอบหลอกจะหายไปเมื่อผู้ใช้ป้อนข้อมูลในกล่องป้อนข้อมูล นั่นเป็นปัญหา UX หากคุณต้องการเช่นฉันกำลังแสดงเครื่องหมายglyphicon-searchโดยไม่แตะต้อง
Davi Lima

2
บริบทบางอย่างเกี่ยวกับสาเหตุที่ทำให้สิ่งนี้ใช้งานไม่ได้อีกแล้ว: bugs.chromium.org/p/chromium/issues/detail?id=582301
Oliver Joseph Ash

17

องค์ประกอบ Pseudo เช่น:afterนั้น:beforeมีไว้สำหรับองค์ประกอบคอนเทนเนอร์เท่านั้น องค์ประกอบการเริ่มต้นและปิดในสถานที่เดียวเช่น<input/>, <img>ฯลฯ ไม่ได้องค์ประกอบภาชนะและด้วยเหตุนี้องค์ประกอบหลอกไม่ได้รับการสนับสนุน เมื่อคุณใช้องค์ประกอบหลอกกับองค์ประกอบภาชนะเช่น<div>และถ้าคุณตรวจสอบรหัส (ดูภาพ) คุณสามารถเข้าใจสิ่งที่ฉันหมายถึง อันที่จริงองค์ประกอบหลอกถูกสร้างขึ้นภายในองค์ประกอบภาชนะ ไม่สามารถทำได้ในกรณีของ<input>หรือ<img>

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


15

วิธีการทำงานใน CSS บริสุทธิ์:

เคล็ดลับคือการสมมติว่ามีองค์ประกอบ dom หลังจากฟิลด์ข้อความ

/*
 * The trick is here:
 * this selector says "take the first dom element after
 * the input text (+) and set its before content to the
 * value (:before).
 */
input#myTextField + *:before {
  content: "👍";
} 
<input id="myTextField" class="mystyle" type="text" value="someValue" />
<!--
  There's maybe something after a input-text
  Does'nt matter what it is (*), I use it.
  -->
<span></span>

(*) โซลูชันที่ จำกัด แม้ว่า:

  • คุณต้องหวังว่าจะมีองค์ประกอบต่อไปนี้
  • คุณต้องหวังว่าจะไม่มีฟิลด์อินพุตอื่นติดตามฟิลด์อินพุตของคุณ

แต่ในกรณีส่วนใหญ่เรารู้รหัสของเราดังนั้นวิธีนี้ดูเหมือนจะมีประสิทธิภาพและ 100% CSS และ 0% jQuery


2
input#myTextField ~ span:before {ดีกว่ามาก แต่ช่วงควรมีชั้นเรียนที่จะชัดเจนมากขึ้นเช่น.tickหรือ.icon
Val

13

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

<style type="text/css">

form {position: relative; }
.mystyle:before {content:url(smiley.gif); width: 30px; height: 30px; position: absolute; }
.mystyle {color:red; width: 30px; height: 30px; z-index: 1; position: absolute; }
</style>

<form>
<input class="mystyle" type="text" value=""><span class="mystyle"></span>
</form>

1
+1 - โซลูชันนี้ทำงานได้ดีหากคุณใช้ปลั๊กอินหรือกรอบงานที่จะเพิ่มคลาสการตรวจสอบความถูกต้องให้กับองค์ประกอบโดยอัตโนมัติ แต่ไม่รวมอยู่ในป้ายกำกับหลัก
Blazemonger

9

ความเข้าใจผิดที่ใหญ่ที่สุดของที่นี่คือความหมายของคำและbefore afterพวกเขาไม่ได้อ้างถึงองค์ประกอบเอง แต่หมายถึงเนื้อหาในองค์ประกอบ ดังนั้นelement:beforeอยู่ก่อนเนื้อหาและelement:afterอยู่หลังเนื้อหา แต่ทั้งคู่ยังคงอยู่ในองค์ประกอบดั้งเดิม

inputองค์ประกอบมีเนื้อหาในมุมมอง CSS ไม่มีและไม่เคยมีใคร:beforeหรือ:afterเนื้อหาหลอก นี่เป็นความจริงขององค์ประกอบโมฆะหรือแทนที่อื่น ๆ อีกมากมาย

ไม่มีอิลิเมนต์เทียมที่อ้างถึงภายนอกอิลิเมนต์

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


ฉันอาจไม่เข้าใจสิ่งที่คุณหมายถึง แต่ถ้าฉันทำองค์ประกอบหลอกทำงานในชั่วโมงหรือไม่ jsfiddle.net/demetriad/o49yn5hq
Chris

1
@ Chris นั่นเป็นความประหลาดใจสำหรับฉันและในการค้นหากับคนอื่น ๆ ฉันคิดว่านั่นเป็นสิ่งที่แปลกประหลาด hrมีความคลุมเครืออยู่เสมอจากมุมมอง CSS แม้ว่าคุณจะเห็นว่ามีการพูดคุยเกี่ยวกับสีมากขึ้น
Manngo

5

ตามหมายเหตุในข้อมูลจำเพาะ CSS 2.1 สเปค“ ไม่ได้กำหนดการโต้ตอบของ: before และ: after ด้วยองค์ประกอบที่ถูกแทนที่ (เช่น IMG ใน HTML) จะมีการกำหนดรายละเอียดเพิ่มเติมในสเปคในอนาคต” แม้ว่าinputจะไม่ได้เป็นองค์ประกอบที่ถูกแทนที่จริงๆอีกต่อไป แต่สถานการณ์พื้นฐานไม่ได้เปลี่ยนแปลง: ผลกระทบของ:beforeและ:afterมันต่อมันแบบไม่ระบุรายละเอียดและโดยทั่วไปจะไม่มีผลกระทบใด ๆ

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


3
นี่คือความคิดเห็นไม่ใช่คำตอบ - ความคิดเห็นที่ค่อนข้างยาว แต่ความคิดเห็นอย่างไรก็ตาม
Blazemonger

@ Blazemonger ไม่ชัดเจนว่าเป็นคำถามอะไร แต่ไม่ว่าในกรณีใดคำตอบนี้ตอบปัญหาเดียวกับคำตอบที่ยอมรับ แต่ในทางที่ถูกต้องมากกว่า มันเป็นไปไม่ได้ที่จะใช้เนื้อหาที่สร้างขึ้นสำหรับinputองค์ประกอบเพียงไม่ได้ระบุและขึ้นอยู่กับเบราว์เซอร์
Jukka K. Korpela

5

ดังที่คนอื่นอธิบายไว้inputs เป็นองค์ประกอบโมฆะที่ถูกแทนที่ด้วย kinda ดังนั้นเบราว์เซอร์ส่วนใหญ่จะไม่อนุญาตให้คุณสร้าง::beforeหรือ::afterหลอกองค์ประกอบในพวกเขา

อย่างไรก็ตามคณะทำงาน CSS มีการพิจารณาอย่างชัดเจนช่วยให้::beforeและ::afterในกรณีที่มีinputappearance: none

จากhttps://lists.w3.org/Archives/Public/www-style/2016Mar/0190.html ,

Safari และ Chrome ทั้งคู่อนุญาตให้ใช้องค์ประกอบแบบหลอกในอินพุตฟอร์มของพวกเขา เบราว์เซอร์อื่นไม่ทำเช่นนั้น เราดูที่การลบสิ่งนี้ แต่ตัวนับการใช้กำลังบันทึก ~ .07% ของหน้าเว็บที่ใช้ซึ่งเป็น 20x ขีด จำกัด การลบสูงสุดของเรา

การระบุองค์ประกอบปลอมในอินพุตจริงต้องมีการระบุโครงสร้างภายในของอินพุตอย่างน้อยบ้างซึ่งเรายังไม่ได้จัดการให้ทำ (และฉันไม่มั่นใจว่าเราสามารถทำ * ได้) แต่ Boris แนะนำในหนึ่งใน bugthreads ทำให้มันปรากฏตัว: ไม่มีอินพุต - โดยทั่วไปเพียงแค่เปลี่ยนมันให้เป็น <div> s แทนที่จะเป็นองค์ประกอบ "แทนที่ด้วย kinda"



3

คุณต้องมี wrapper บางชนิดรอบ ๆ อินพุตเพื่อใช้ก่อนหรือหลังองค์ประกอบหลอก นี่คือซอที่มีมาก่อนใน div wrapper ของอินพุทแล้ววางไว้ข้างในอินพุท - หรืออย่างน้อยก็ดูเหมือนว่ามัน เห็นได้ชัดว่านี่คือการทำงาน แต่มีประสิทธิภาพในการเหน็บแนมและยืมตัวเองเพื่อตอบสนอง คุณสามารถทำให้เรื่องนี้เป็นเรื่องง่ายหากคุณต้องการใส่เนื้อหาอื่น

Fiddle ทำงาน

ดอลล่าร์เซ็นในอินพุตเป็น pseudo-element: http://jsfiddle.net/kapunahele/ose4r8uj/1/

HTML:

<div class="test">
    <input type="text"></input>
</div>

CSS:

input {
    margin: 3em;
    padding-left: 2em;
    padding-top: 1em;
    padding-bottom: 1em;
    width:20%; 
}


.test {
    position: relative;
    background-color: #dedede;
    display: inline;
}

.test:before {
    content: '$';
    position: absolute;
    top: 0;
    left: 40px;
    z-index: 1;
}

เคล็ดลับดี แต่คุณสามารถทำให้ div สุกใสเพื่อ "ดำเนินการต่อ" การป้อนข้อมูล ดูซอนี้jsfiddle.net/ose4r8uj/31แต่คุณสามารถทำได้ง่ายขึ้นโดยใช้ bootstrap: getbootstrap.com/css/#forms-control-validationมองหาส่วน "With icons" แม้ว่ามันจะไม่เกี่ยวข้องกับคำถามเดิม
Victor Ivens

1
FYI ไม่ดีสำหรับ: focus
,:

2

หากคุณพยายามจัดองค์ประกอบของอินพุตด้วย: before และ: after คุณกำลังพยายามที่จะต่อรอง เลียนแบบเอฟเฟกต์ของ span, div หรือแม้กระทั่งองค์ประกอบใน CSS stack ของคุณ

ดังที่คำตอบของ Robert Koritnik ชี้ให้เห็น: ก่อนและ: หลังจากสามารถใช้ได้กับองค์ประกอบของคอนเทนเนอร์เท่านั้นและองค์ประกอบอินพุตเท่านั้นไม่ใช่คอนเทนเนอร์

HOWEVER, HTML 5 แนะนำองค์ประกอบปุ่มซึ่งเป็นคอนเทนเนอร์และทำงานเหมือนองค์ประกอบ [type = "submit | reset"] อินพุต

    <style>
    .happy:after { content:url(smiley.gif); }
    </style>

    <form>
    <!-- won't work -->
    <input class="happy" type="submit" value="Submit" />

    <!-- works -->
    <button class="happy">Submit</button>
    </form>

HTML 4 แนะนำองค์ประกอบ <button> จริงๆแล้ว
นาย Lister

1

สรุป

มันใช้งานไม่ได้<input type="button">แต่ใช้งานได้ดี<input type="checkbox">แต่มันทำงานได้ดีกับ

ซอ : http://jsfiddle.net/gb2wY/50/

HTML :

<p class="submit">
    <input id="submit-button" type="submit" value="Post">
    <br><br>
    <input id="submit-cb" type="checkbox" checked>
</p>

CSS :

#submit-button::before,
#submit-cb::before {
    content: ' ';
    background: transparent;
    border: 3px solid crimson;
    display: inline-block;
    width: 100%;
    height: 100%;
    padding: 0;
    margin: -3px -3px;
}

1

:beforeและ:afterทำงานได้เฉพาะกับโหนดที่สามารถมีโหนดย่อยได้เนื่องจากจะแทรกโหนดใหม่เป็นโหนดแรกหรือโหนดสุดท้าย


0

ฉันพบว่าคุณสามารถทำได้เช่นนี้:

คุณต้องมีผู้ปกครอง div ที่ใช้การแพ็ดและ: หลังจาก ผู้ปกครองคนแรกจะต้องมีความสัมพันธ์กันและ div ที่สองควรเป็นแบบสัมบูรณ์เพื่อให้คุณสามารถกำหนดตำแหน่งของ after


-1

ฉันมีความคิดอื่นใช้สิ่งนี้แทน:

<div>
<input type="text"></input>text can be entered here</div>

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