CSS: перед тем, как не работать в Firefox, IE и Edge [duplicate]

вы можете использовать встроенную функцию list ():

newlist=list(oldlist)

Я думаю, этот код вам поможет.

221
задан Joshua Frank 17 September 2014 в 03:48
поделиться

6 ответов

К сожалению, большинство браузеров не поддерживают использование :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 .

222
ответ дан Community 20 August 2018 в 16:01
поделиться
  • 1
    Ладно, так что я не сумасшедший. +1 для этого. Я дам вашему предложению jQuery выстрел и посмотрю, делает ли это трюк. Благодарю. – Joshua Frank 30 April 2011 в 17:31
  • 2
    Работает как шарм. Genius! Отмечено как ответ. – Joshua Frank 30 April 2011 в 22:43
  • 3
    Пожалуйста, объясните свое нижестоящее. – cwharris 5 June 2012 в 17:23
  • 4
    ваша скрипка отсутствует. Это красота ссылок jsFiddle. – Roko C. Buljan 15 April 2013 в 12:38
  • 5
    Починил это. Извини за это. – cwharris 16 April 2013 в 16:15

Я нашел способ сделать эту работу чистым css:

Я просто поддельный контент -method

чистый метод CSS для включить img: after.

Вы можете проверить CodePen: я просто поддельный контент или посмотреть источник.

Источник

HTML

<img
    alt="You are watching the ~ I'm just fake content ~ method"  
/>

CSS

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

Поддержка браузера

✓ Chrome 10 +

✓ Firefox 11 +

✓ Opera 9.8 +

✓ Safari

Нет поддержки

⊗ Internet Explorer 8/9

Пожалуйста, проверьте в других браузерах

39
ответ дан 12 revs 20 August 2018 в 16:01
поделиться
  • 1
    Таким образом, вы просто добавляете контент: & quot; & quot; к типу тега img и: до и: после начала работы. Приятно найти, интересно, как это кросс-браузер. – w00t 28 June 2012 в 15:42
  • 2
    Я установил тест значка jsbin.com/esewow/edit#htmllive , и я могу подтвердить, что он не работает на IE8, но в Chrome и Safari он работает нормально. – w00t 28 June 2012 в 15:53
  • 3
    Пример CodePen работает только в Firefox, если src тега img недействителен - это приводит к тому, что атрибут alt будет отображаться как элемент, который фактически позволяет: before и: after. Если img src существует, он перестает работать: codepen.io/anon/pen/EjtDu – thenickdude 13 August 2013 в 02:45
  • 4
    Остановите меня, если я ошибаюсь, но, похоже, он больше не работает с Chrome 46 – Gyum Fox 17 November 2015 в 15:44
  • 5
    img: before и img: после этого вообще не работают в Safari . Даже это не было, что изначально меня возбуждало. Хорошая попытка, хотя. – Wray Bowling 22 August 2016 в 16:03

Я думаю, что лучший способ взглянуть на то, почему это не работает, это то, что: до и: после вставки их содержимого до или после содержимого в теге, к которому вы их применяете. Таким образом, он работает с divs или spans (или большинством других тегов), потому что вы можете размещать контент внутри них.

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

Однако img является самодостаточным, самозакрывающимся тегом, и поскольку он имеет нет отдельного закрывающего тега, вы ничего не можете положить внутрь. (Это должно выглядеть как <img>Content</img>, но, конечно, это не работает.)

Я знаю, что это старая тема, но она появляется сначала в Google, поэтому, надеюсь, это поможет другим учиться.

0
ответ дан BevansDesign 20 August 2018 в 16:01
поделиться

Псевдо-селекторы до и после не вставляют элементы HTML - они вставляют текст до или после существующего содержимого целевого элемента. Поскольку элементы изображения не содержат текст или имеют потомки, ни img:before, ни img:after не сделают вам ничего хорошего. Это также касается таких элементов, как <br> и <hr> по той же причине.

115
ответ дан coreyward 20 August 2018 в 16:01
поделиться
  • 1
    Теги Img явно являются элементами сами по себе, и все же нам разрешено вставлять их до или после других элементов, используя: before и: after psuedo-selectors. Это не в спецификации css? – cwharris 30 April 2011 в 18:01
  • 2
    Это немного по-другому. Вы можете вставить изображение, но не использовать тег изображения - вам нужно использовать синтаксис content: url(/img/foo.jpg);. Подробнее см. В w3.org/TR/CSS21/generate.html . – coreyward 30 April 2011 в 19:44
  • 3
    Ах, интересно. Спасибо за разъяснения. Я понимаю концепцию немного лучше сейчас :) – cwharris 30 April 2011 в 20:44
  • 4
    Небольшая коррекция: они вставляют псевдоэлементы, которые больше похожи на элементы, чем текстовые узлы. – Chris Calo 8 October 2013 в 22:57
  • 5
    Сгенерированный контент становится частью Shadow DOM. Эти новые элементы, атрибуты и текстовые узлы очень реальны. Вы можете видеть их, например. в Инспекторе Chrome. – Marc Diethelm 7 October 2014 в 10:12
  • 6
    – Marc Diethelm 13 February 2015 в 03:56
  • 7

Я попробовал и нашел более простой способ сделать это. Вот HTML:

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

То, что я сделал, это поместить пустой тег <p> после моего тега изображения. Теперь я буду использовать p :: before, чтобы показать изображение и поместить его в соответствии с моими потребностями. Вот 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');
}

Попробуйте.

-1
ответ дан Mr Lister 20 August 2018 в 16:01
поделиться

Вот еще одно решение, использующее контейнер div для 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;
} 

Чтобы увидеть его в действии, проверьте скрипт Я создал. Просто, чтобы вы знали, что это кросс-браузер, и нет необходимости обманывать код с помощью «поддельного контента».

3
ответ дан Zach Saucier 20 August 2018 в 16:01
поделиться
  • 1
    Полезно применять display: inline-block к #img_container. Это сделает ширину контейнера равной изображению при всех размерах экрана. Таким образом, вы не получаете содержимое :after, плавающее за пределами изображения. – Anonymous 16 October 2017 в 07:41
Другие вопросы по тегам:

Похожие вопросы: