ไม่: ก่อนที่จะไม่ทำงานกับองค์ประกอบ img หรือไม่


262

ฉันกำลังพยายามใช้:beforeตัวเลือกเพื่อวางรูปภาพเหนือรูปภาพอื่น แต่ฉันพบว่ามันใช้งานไม่ได้กับการวางภาพก่อนimgองค์ประกอบเพียงองค์ประกอบอื่น ๆ โดยเฉพาะสไตล์ของฉันคือ:

.container
{
   position: relative;
   display: block;
}

.overlay:before
{
    content: url(images/[someimage].png);
    position: absolute;
    left:-20px;
    top: -20px;
}

และฉันพบว่ามันใช้งานได้ดี:

<a href="[url]" class="container">
  <span class="overlay"/>
  <img width="200" src="[url]"/>
</a>

แต่นี่ไม่ได้:

<a href="[url]" class="container">
  <img width="200" src="[url]" class="overlay"/>
</a>

ฉันสามารถใช้divหรือpองค์ประกอบแทนสิ่งspanนั้นและเบราว์เซอร์ซ้อนทับภาพของฉันอย่างถูกต้องเหนือภาพในimgองค์ประกอบ แต่ถ้าฉันใช้คลาสซ้อนทับกับimgตัวเองมันไม่ทำงาน

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


5
นี่เป็นเรื่องแปลกโดยเฉพาะอย่างยิ่งเนื่องจากมาตรฐาน CSS นั้นเป็นตัวอย่างของการใช้: ก่อนที่จะมีองค์ประกอบ IMG ...


@chharvey: คำถามนั้นถูกถามหลังจากนี้
Joshua Frank

คำตอบ:


262

ขออภัยเบราว์เซอร์ส่วนใหญ่ไม่รองรับการใช้:afterหรือ:beforeบนแท็ก img

http://lildude.co.uk/after-css-property-for-img-tag

อย่างไรก็ตามเป็นไปได้สำหรับคุณที่จะบรรลุสิ่งที่คุณต้องการด้วย JavaScript / jQuery ลองเล่นซอ:

http://jsfiddle.net/xixonia/ahnGT/

$(function() {

    $('.target').after('<img src="..." />');

});

แก้ไข :

สำหรับเหตุผลที่นี้ไม่ได้รับการสนับสนุนให้ตรวจสอบคำตอบของ coreyward


3
ซอของคุณหายไป นั่นคือความงามของลิงก์ jsFiddle
Roko C. Buljan

ซ่อมมัน. ขอโทษด้วยกับเรื่องนั้น.
cwharris

1
คำตอบนี้ไม่ได้อธิบายว่าทำไม img ไม่สามารถมีก่อนหรือหลัง นอกจากนี้โซลูชัน javascript ที่เสนอยังไม่สามารถทดแทนได้อย่างเหมาะสม
Jasper Kennis

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

141

ก่อนและหลังตัวเลือกหลอกจะไม่แทรกองค์ประกอบ HTML - พวกเขาแทรกข้อความก่อนหรือหลังเนื้อหาที่มีอยู่ขององค์ประกอบเป้าหมาย เนื่องจากองค์ประกอบภาพไม่มีข้อความหรือมีลูกหลานไม่img:beforeหรือimg:afterจะทำสิ่งใดให้คุณได้ นี่เป็นกรณีสำหรับองค์ประกอบที่ต้องการ<br>และ<hr>ด้วยเหตุผลเดียวกัน


แท็ก Img เป็นองค์ประกอบในตัวของมันเองอย่างชัดเจนและเรายังได้รับอนุญาตให้ใส่ก่อนหรือหลังองค์ประกอบอื่น ๆ โดยใช้: ก่อนและ: หลังจาก psuedo-selectors นี่ไม่ได้อยู่ในข้อมูลจำเพาะ css หรือไม่
cwharris

13
มันแตกต่างกันเล็กน้อย คุณสามารถแทรกรูปภาพ แต่ไม่ใช้แท็กรูปภาพ - คุณต้องใช้content: url(/img/foo.jpg);ไวยากรณ์ ดูw3.org/TR/CSS21/generate.htmlสำหรับรายละเอียด
coreyward

4
การแก้ไขเล็กน้อย: พวกเขาแทรกองค์ประกอบ psuedo ซึ่งเป็นเหมือนองค์ประกอบมากกว่าพวกเขาเป็นเหมือนโหนดข้อความ
Chris Calo

เนื้อหาที่สร้างขึ้นจะกลายเป็นส่วนหนึ่งของ Shadow DOM องค์ประกอบใหม่แอตทริบิวต์และโหนดข้อความเหล่านี้เป็นของจริงมาก คุณสามารถเห็นพวกเขาเช่นในผู้ตรวจสอบของ Chrome
Marc Diethelm

@coreyward บางทีคุณอาจไว้วางใจMDN (องค์ประกอบที่ถูกแทนที่)
Marc Diethelm

41

ฉันพบวิธีที่จะทำให้งานนี้ใน CSS บริสุทธิ์:

ฉันแค่เนื้อหาปลอม -method

วิธี CSS บริสุทธิ์เพื่อเปิดใช้งาน img: หลังจาก

คุณสามารถตรวจสอบCodePen: ฉันแค่เนื้อหาปลอมหรือดูแหล่งที่มาแหล่งที่มา

ที่มา & ตัวอย่าง

img {
    /* hide the default image */
    height:0;
    width:0;

    /* hide fake content */
    font-size:0;
    color:transparent;

    /* enable absolute position for pseudo elements */
    position:relative;

    /* and this is just fake content */
    content:"I'm just fake content";
}

/* initial absolute position */
img:before,
img:after {
    position:absolute;
    top:0;
    left:0;    
}

/* img:before - chrome & others */
img:before {
    content:url(http://placekitten.com/g/250/250);
}

/* img:before - firefox */
body:not(:-moz-handler-blocked) img:before {
    padding:125px;
    background:url(http://placekitten.com/g/250/250) no-repeat;
}

/* img:after */
img:after {
    /* width of img:before */
    left:250px;

    content:url(http://lorempixel.com/350/200/city/1);
}
<img
    alt="You are watching the ~ I'm just fake content ~ method"  
/>

รองรับเบราว์เซอร์

✓ Chrome 10+

✓ Firefox 11+

✓ Opera 9.8+

✓ Safari

ไม่สนับสนุน

⊗ Internet Explorer 8/9

โปรดทดสอบในเบราว์เซอร์อื่น


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

2
ฉันตั้งค่าไอคอนทดสอบjsbin.com/esewow/edit#html,liveและฉันสามารถยืนยันได้ว่ามันไม่ทำงานบน IE8 แต่บน Chrome และ Safari มันใช้งานได้ดี
w00t

14
ตัวอย่าง CodePen ใช้งานได้เฉพาะใน Firefox หาก src ของแท็ก img ไม่ถูกต้องซึ่งทำให้แอตทริบิวต์ alt ถูกแสดงผลเป็นองค์ประกอบที่อนุญาตจริง: ก่อนและ: หลัง หากมี img src อยู่แสดงว่าหยุดทำงาน: codepen.io/anon/pen/EjtDu
thenickdude

2
หยุดฉันถ้าฉันผิด แต่ดูเหมือนว่ามันจะไม่ทำงานกับ Chrome 46
Gyum Fox

5
img: ก่อนและ img: หลังจากไม่ได้ทำงานใน Safariเลย ไม่แม้แต่ตอนนี้ซึ่งตอนแรกฉันก็ตื่นเต้น แม้ว่าลองดี
Wray Bowling

9

เนื่องจากลักษณะของ<img>การเป็นองค์ประกอบที่ถูกแทนที่การจัดรูปแบบเอกสารจะไม่ส่งผลกระทบต่อมัน

หากต้องการอ้างอิงต่อไป<picture>ให้เตรียม wrapper เนทีฟในอุดมคติที่สามารถแนบองค์ประกอบหลอกไปได้เช่น:

img:after, picture:after{
    content:"\1F63B";
    font-size:larger;
    margin:-1em;
}
<img src="//placekitten.com/110/80">

<picture>
    <img src="//placekitten.com/110/80">
</picture>


3

นี่เป็นอีกวิธีการหนึ่งที่ใช้ div container สำหรับ img ขณะใช้:hover::afterเพื่อให้ได้ผล

HTML ดังต่อไปนี้:

<div id=img_container><img src='' style='height:300px; width:300px;'></img></div>

CSS ดังต่อไปนี้:

#img_container { 
    margin:0; 
    position:relative; 
} 

#img_container:hover::after { 
    content:''; 
    display:block; 
    position:absolute; 
    width:300px; 
    height:300px; 
    background:url(''); 
    z-index:1; 
    top:0;
} 

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


มันจะมีประโยชน์ที่จะใช้ในการdisplay: inline-block #img_containerมันจะทำให้ความกว้างของภาชนะเท่ากับภาพทุกขนาดของหน้าจอ ดังนั้นคุณจะไม่ได้รับ:afterเนื้อหาที่ลอยอยู่ด้านนอกของภาพ
ไม่ระบุตัวตน

1

ฉันคิดว่าวิธีที่ดีที่สุดในการดูว่าทำไมสิ่งนี้ถึงไม่ได้ผลคือ: ก่อนและ: หลังจากแทรกเนื้อหาก่อนหรือหลังเนื้อหาภายในแท็กที่คุณใช้ ดังนั้นจึงใช้งานได้กับ divs หรือ spans (หรือแท็กอื่น ๆ ส่วนใหญ่) เพราะคุณสามารถใส่เนื้อหาไว้ในนั้นได้

<div>
:before
Content
:after
</div>

อย่างไรก็ตาม img เป็นแท็กปิดตัวเองในตัวเองและเนื่องจากไม่มีแท็กปิดแยกต่างหากคุณจึงไม่สามารถวางอะไรไว้ข้างในได้ (นั่นจะต้องมีลักษณะเหมือน<img>Content</img>แต่แน่นอนว่าไม่ได้ผล)

ฉันรู้ว่านี่เป็นหัวข้อเก่า แต่ปรากฏขึ้นครั้งแรกบน Google ดังนั้นหวังว่าสิ่งนี้จะช่วยให้ผู้อื่นเรียนรู้



1

องค์ประกอบแบบหลอกที่สร้างขึ้นโดย :: before และ :: after จะอยู่ในกล่องการจัดรูปแบบขององค์ประกอบและดังนั้นจึงไม่สามารถนำไปใช้กับองค์ประกอบที่ถูกแทนที่เช่น img หรือองค์ประกอบ br

https://developer.mozilla.org/en-US/docs/Web/CSS/::after


1

::after อาจใช้เพื่อแสดงรูปภาพทางเลือกของรูปภาพ


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

img {
  position: relative;
  display: inline-block;
  width: 300px;
  height: 200px;
  vertical-align: top;
}
img:not(:first-child)::after {
  position: absolute;
  left: 0; top: 0; right: 0; bottom: 0;
  content: "<" attr(alt) "> NOT FOUND";
  border: 1px dashed #999;
  background: url(https://cdn.dribbble.com/users/1012566/screenshots/4187820/topic-2.jpg) center/100%;
}
<img src="https://source.unsplash.com/random/100/75" alt="logo">
<img src="https://source.unsplash.com/random/100/75" alt="logo">
<img src="https://source.unsplash.com/random/100x75" alt="logo">


0

ลองรหัสนี้

.button:after {
    content: ""
    position: absolute
    width: 70px
    background-image: url('../../images/frontapp/mid-icon.svg')
    display: inline-block
    background-size: contain
    background-repeat: no-repeat
    right: 0
    bottom: 0
}

-1

ฉันลองและพบวิธีที่ง่ายกว่าในการทำเช่นนั้น นี่คือ HTML:

    <img id="message_icon" src="messages2.png">
    <p id="empty_para"></p>

สิ่งที่ฉันทำคือวาง<p>แท็กเปล่าหลังจากแท็กรูปภาพ ตอนนี้ฉันจะใช้ p :: ก่อนที่จะแสดงภาพและจัดตำแหน่งตามความต้องการของฉัน นี่คือ CSS:

#empty_para
{
    display:inline;
    font-size:40;
    background:orange;
    border:2px solid red;
    position:relative;
    top:-400px;
    left:100px;
}
#empty_para::before
{
    content: url('messages.png');
}

ลองมัน.


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