การใช้: ก่อน CSS pseudo element เพื่อเพิ่มรูปภาพลงใน modal


116

ฉันมีคลาส CSS Modalที่อยู่ในตำแหน่งที่แน่นอนดัชนี z อยู่เหนือระดับแม่และอยู่ในตำแหน่งที่ดีกับ JQuery ฉันต้องการเพิ่มรูปคาเร็ต (^) ที่ด้านบนของกล่องโมดอลและกำลังดูการใช้:beforeตัวเลือกหลอก CSS เพื่อทำสิ่งนี้อย่างหมดจด

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

.Modal:before{
  content:url('blackCarrot.png') /* with class ModalCarrot ??*/
}

.ModalCarrot{
   position:absolute;
   left:50%;
   margin-left:-8px;
   top:-16px;
}

ตัวเลือกที่สองที่ดีที่สุด - ฉันสามารถเพิ่มสไตล์อินไลน์ในแอตทริบิวต์เนื้อหาได้หรือไม่

คำตอบ:


175

http://caniuse.com/#search=:after

:afterและ:beforeด้วยความcontentเป็นโอเคที่จะใช้เป็นที่พวกเขากำลังได้รับการสนับสนุนในเบราว์เซอร์ที่สำคัญอื่น ๆ ทุกกว่า Internet Explorer อย่างน้อย 5 รุ่นหลัง Internet Explorer มีการสนับสนุนอย่างสมบูรณ์ในเวอร์ชัน 9+ และการสนับสนุนบางส่วนในเวอร์ชัน 8

นี่คือสิ่งที่คุณกำลังมองหาใช่ไหม

.Modal:after{
  content:url('blackCarrot.png'); /* with class ModalCarrot ??*/
  position:relative; /*or absolute*/
  z-index:100000; /*a number that's more than the modal box*/
  left:-50px;
  top:10px;
}

.ModalCarrot{
   position:absolute;
   left:50%;
   margin-left:-8px;
   top:-16px;
}

ถ้าไม่ช่วยอธิบายหน่อยดีกว่าไหม

หรือคุณสามารถใช้ jQuery เช่น Joshua กล่าวว่า:

$(".Modal").before("<img src='blackCarrot.png' class='ModalCarrot' />");


2
นี้. ประเด็นของ Joshua เกี่ยวกับความเข้ากันได้ของเบราว์เซอร์ก็ถูกต้องเช่นกัน - IE8 แสดงภาพในเนื้อหา: after แต่จะไม่แสดงผลส่วนที่อยู่นอกขอบของผู้ปกครอง
RSG

ตอนนี้ (ในปี 2017) IE 11 เป็นเวอร์ชันเดียวของ IE ที่ยังรองรับโดย Microsoft ดังนั้นจึงไม่มีประเด็นที่ต้องกังวลเกี่ยวกับความเข้ากันได้ของ IE8 มากนัก นอกจากนี้โซลูชัน CSS มักจะดีกว่าโซลูชัน jQuery เนื่องจากมักจะโหลดได้เร็วกว่ามากและ jQuery อาจทำให้หน้าจอสั่นไหวโดยการเขียนเค้าโครงของคุณใหม่หลังจากโหลดหน้าแล้ว
Nosajimiki

1
@Nosajimiki ว่าคุณควรกังวลเกี่ยวกับเบราว์เซอร์รุ่นเก่าหรือไม่นั้นขึ้นอยู่กับผู้เยี่ยมชมของคุณเป็นส่วนใหญ่
Jose Faeti

35

คุณควรใช้แอตทริบิวต์พื้นหลังเพื่อให้ภาพกับองค์ประกอบนั้นและฉันจะใช้ :: after แทนก่อนหน้านี้วิธีนี้ควรวาดไว้ด้านบนขององค์ประกอบของคุณแล้ว

.Modal:before{
  content: '';
  background:url('blackCarrot.png');
  width: /* width of the image */;
  height: /* height of the image */;
  display: block;
}

ขอบคุณสำหรับคำแนะนำ - โมดอลมีเส้นขอบดังนั้นฉันไม่คิดว่าฉันสามารถใช้ภาพพื้นหลังเพื่อวางภาพแครอทไว้เหนือเส้นขอบ / สี bg ได้ตามต้องการ
RSG

ทำไมจะไม่ล่ะ? หากคุณวางตำแหน่งขององค์ประกอบหลอกอย่างแน่นอนคุณสามารถเลื่อนมันไปรอบ ๆ ด้วยระยะขอบ มันจะถูกวาดไว้ด้านบนของเส้นขอบองค์ประกอบอื่น ๆ และ / หรือสี bg
Jose Faeti

ภาพพื้นหลังไม่สามารถขยายออกไปนอกเส้นขอบของ div?
RSG

12
คุณอาจต้องเพิ่มเนื้อหา: ''; เพื่อให้มันปรากฏ
Willster

13

1. นี่คือคำตอบของฉันสำหรับปัญหาของคุณ

.ModalCarrot::before {
content:'';
background: url('blackCarrot.png'); /*url of image*/
height: 16px; /*height of image*/
width: 33px;  /*width of image*/
position: absolute;
}

5
ฉันเพิ่มbackground-size: 33px 16px; background-repeat: no-repeat;เพื่อปรับขนาดภาพ!
Hasse Björk

-4

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

$(".Modal").before("<img src='blackCarrot.png' class='ModalCarrot' />");

1
สิ่งนี้ทำให้ฉันเศร้า เรามีเบราว์เซอร์กำหนดเป้าหมายจำนวน จำกัด ดังนั้นฉันยังคงสนใจว่า CSS จะเป็นไปได้อย่างไร
RSG

แม้ว่าจะมีการใช้เนื้อหาอย่างมากใน CSS3 แต่จากที่ฉันเห็นก็ยังคงเป็นหนึ่งในเนื้อหาที่ไม่ได้รับการสนับสนุนอย่างเต็มที่ ฉันเชื่อว่าสิ่งนี้เกี่ยวข้องกับความกลัวว่าจะสามารถฉีดสิ่งชั่วร้ายได้ นอกจากนี้ฉันเชื่อว่าเนื้อหาต้องการองค์ประกอบที่มีอยู่แล้วเพื่อฉีดเข้าไป - ไม่แน่ใจว่าฉันสามารถจัดการ DOM ได้มากขนาดนั้นเองหรือไม่
Joshua

4
คำตอบนี้ไม่ถูกต้องเนื่องจากมีการสนับสนุนที่ไม่น่าเชื่อถือในเบราว์เซอร์ Contentและafter/beforeมีความน่าเชื่อถือมากในทุกเบราว์เซอร์หลัก ๆ มันใช้งานได้ตั้งแต่ ie8 อย่างน้อย FF3.5 อย่างน้อย Chrome 9 อย่างน้อย Opera 10.6 อย่างน้อย Safari 3.2 ทุกเวอร์ชันของ iOS Safari ทุกเวอร์ชันของ Opera mini ทุกเวอร์ชัน ของ Opera Mobile และเบราว์เซอร์ Android ทุกเวอร์ชัน หากคุณต้องการทราบว่ามีบางสิ่งที่รองรับข้ามเบราว์เซอร์หรือไม่โปรดดูที่caniuse.com/#search=:after
android.nick

เพียงเพราะอินเทอร์เน็ตบอกว่ามันไม่ได้หมายความว่ามันเป็นความจริง ทำงานกับพวกเขาพวกเขาทำหน้าที่แตกต่างกันในทุกเบราว์เซอร์ และ IE 7 ยังคงเป็นเบราว์เซอร์ยอดนิยมซึ่งไม่รองรับเบราว์เซอร์ตัวใดตัวหนึ่ง
Joshua

3
อันที่จริงคุณจะดีCSSกว่าJavaScriptในเรื่องนี้ ไม่ว่าเบราว์เซอร์จะมีเลือดออกมากแค่ไหนผู้ใช้ยังสามารถJavaScriptปิดการใช้งานได้... โชคดีในกรณีนี้:beforeและ:afterตัวเลือกได้รับการสนับสนุนอย่างกว้างขวาง quirksmode.org/css/selectors
Steve Buzonas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.