使用:before CSS伪元素将图像添加到模态


116

我有一个Modal绝对定位的CSS类,在其父对象上方经过z索引,并且与JQuery定位良好。我想在模式框的顶部添加一个插入符图像(^),并且正在考虑使用:beforeCSS伪选择器来做到这一点。

图像需要绝对定位并在模态上方进行z索引,但是我还没有找到将适当的类添加到content属性中的图像的任何方法:

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

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

第二好的选择-我可以在content属性中内联添加样式吗?

Answers:


175

http://caniuse.com/#search=:之后

:after:beforecontent都还好用,因为他们在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
这个。约书亚关于浏览器兼容性的观点也是正确的-IE8在:after内容中渲染图像,但不会渲染其父级边界之外的部分。
RSG

现在(2017年),IE 11是Microsoft仍支持的唯一版本的IE;因此,担心IE8兼容性没有太多意义。另外,CSS解决方案几乎总是比jQuery解决方案更好,因为它们倾向于更快地加载,并且jQuery在页面加载后重写布局会导致屏幕闪烁。
Nosajimiki

1
@Nosajimiki您是否应该担心较旧的浏览器主要取决于访问者。
Jose Faeti

35

您应该使用background属性为该元素提供图像,并且我将使用:: after而不是before,这样,它应该已经绘制在您元素的顶部。

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

感谢您的建议-模态有边框,所以我认为我无法根据需要使用背景图像将胡萝卜图像置于边框/ bg颜色上方。
RSG

为什么不?如果您绝对定位该伪元素,则可以在边距处移动它。它将绘制在其他元素边框和/或bg颜色的顶部。
Jose Faeti 2011年

背景图像不能延伸到div的边界之外吗?
RSG

12
您可能需要添加内容:''; 使其显示出来
Willster,2014年

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;了缩放图像!
哈西·比约克

-4

内容以及之前的内容在浏览器之间都是高度不可靠的。我建议坚持使用jQuery完成此任务。我不确定您要做什么才能确定是否需要添加此胡萝卜,但是您应该了解一下总体思路:

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

1
这让我很难过。我们的目标浏览器非常有限,所以我仍然对CSS的功能感兴趣。
RSG

即使CSS3中大量使用了内容,但据我所知,它仍然是任何地方都未完全支持的内容之一。我认为,这与担心会注入邪恶的事物有关。另外,我认为内容需要注入一个已经存在的元素-不知道我是否可以自己操作DOM。
约书亚

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=
android.nick

只是因为互联网说的是事实,并不意味着它是真的。与他们合作,它们在每个浏览器中的行为都不同。IE 7仍然是一个非常流行的浏览器,它不支持其中任何一个。
约书亚

3
其实,你是最好CSSJavaScript这一点。无论浏览器多么先进,用户仍然可以JavaScript禁用它。幸运的是,在这种情况下,:beforeand :after选择器得到了广泛的支持。quirksmode.org/css/selectors
史蒂夫·布佐纳斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.