ChatGPT解决这个技术问题 Extra ChatGPT

我可以在 CSS :before/:after 伪元素中更改图像的高度吗?

假设我想使用图像来装饰指向某些文件类型的链接。我可以将我的链接声明为

<a href='foo.pdf' class='pdflink'>A File!</a>

然后有 CSS 之类的

.pdflink:after { content: url('/images/pdf.png') }

现在,这很好用,除非 pdf.png 的大小不适合我的链接文本。

我希望能够告诉浏览器缩放 :after 图像,但我终其一生都找不到正确的语法。或者这就像背景图像一样,无法调整大小?

ETA:我倾向于a)将源图像的大小调整为“正确”的大小,服务器端和/或b)更改标记以简单地提供内联的IMG标签。我试图避免这两件事,但它们听起来比尝试纯粹用 CSS 做事情更兼容。我最初的问题的答案似乎是“有时你可以做到这一点”。

是否有令人信服的理由表明您没有使用带有“a”标签的“img”标签?对于同时也是链接的图像来说,这是更典型的语法。我这样说是因为即使你让你的方法起作用,你也可能会让其他开发人员感到困惑。 CSS 在浏览器/版本之间的反复无常方面也享有盛誉。
我很欣赏这个问题,只是我不一定控制标记的生成——在这种情况下,我只能重新设计样式,而不是重新结构。
关于 W3C 邮件列表的冗长讨论:lists.w3.org/Archives/Public/www-style/2011Nov/…

A
Ansel Santosa

允许调整 background-size。但是,您仍然需要指定块的宽度和高度。

.pdflink:after {
    background-image: url('/images/pdf.png');
    background-size: 10px 20px;
    display: inline-block;
    width: 10px; 
    height: 20px;
    content:"";
}

See the full Compatibility Table at the MDN


这很好,除了我们的大多数客户都在 IE 7 或 8 上(企业胡说八道,抱歉)。
如果是这种情况,您根本不应该使用 :afterIt's not supported below IE8.
此技术还需要设置 width: 10px; height: 20px; 才能看到图像。
另请注意,这确实有效,但具有特定的 background-image 属性,简单的 background 将不起作用。
(对于 :before)我还需要 position: absoluteleft: -10px
C
Community

请注意,:after 伪元素是一个盒子,它又包含生成的图像。无法为图像设置样式,但您可以设置框的样式。

以下只是一个想法,solution above更实用。

.pdflink:after {
    content: url('/images/pdf.png');
    transform: scale(.5);
}

http://jsfiddle.net/Nwupm/

缺点:你需要知道图像的内在尺寸,它会给你留下一些空白,我无法摆脱 ATM。


zoom: 0.5 也值得考虑。
我喜欢这个解决方案的想法,但它会破坏定位,尤其是在内联块场景中。 (即 11)
缩放没有得到很好的支持。
jsfiddle 没有改变大小。我正在使用最新的 Firefox。我还使用缩放尝试了这篇文章中的最后一个 jsfiddle 示例,但它也不起作用。
请注意:就我而言,我必须输入 position: absolute 才能使 transform: scale(0.5) 实际工作。为了理智,我还必须将 position: relative 放在“父”元素(:after 伪的所有者)中。此外,我必须将 translate(-16px, -16px) 添加到我的转换中以正确定位 16x16 图标。 position: absolute 还具有消除空白问题的好处。
u
user123444555621

由于我的其他答案显然没有被很好地理解,所以这是第二次尝试:

有两种方法可以回答这个问题。

实用(只给我看该死的照片!)

忘掉 :after 伪选择器,选择类似的东西

.pdflink {
    min-height: 20px;
    padding-right: 10px;
    background-position: right bottom;
    background-size: 10px 20px;
    background-repeat: no-repeat;
}

理论

问题是:你可以为生成的内容设置样式吗?答案是:不,你不能。有一个关于这个问题的lengthy discussion on the W3C mailing list,但到目前为止还没有解决方案。

生成的内容会呈现到生成的框中,您可以设置该框的样式,但是 not the content as such。不同的浏览器表现出非常不同的行为

#foo {内容:url("bar.jpg");宽度:42px; height:42px;} #foo::before {content: url("bar.jpg");宽度:42px; height:42px;} Chrome 调整第一个的大小,但使用图像的内在尺寸用于第二个 firefox,即不支持第一个,并为第二个使用内在尺寸 Opera 对这两种情况都使用内在尺寸

(来自 http://lists.w3.org/Archives/Public/www-style/2011Nov/0451.html

同样,浏览器在诸如 http://jsfiddle.net/Nwupm/1/ 之类的东西上显示非常不同的结果,其中生成了多个元素。请记住,CSS3 仍处于早期开发阶段,此问题尚未解决。


@TJ每个单独的答案都值得一个答案(如果这还不够明显),它将获得不同数量的赞成票,并且将根据答案的内容以不同的方式看到/引用/共享。
s
santillanix

您应该使用背景而不是图像。

.pdflink:after {
  content: "";
  background-image:url(your-image-url.png);
  background-size: 100% 100%;
  display: inline-block;

  /*size of your image*/
  height: 25px;
  width:25px;

  /*if you want to change the position you can use margins or:*/
  position:relative;
  top:5px;

}

D
Dmytro Yurchenko

diplay: block; 没有任何影响

positionin 根据前端基础也很奇怪,所以要小心

body:before{ 
    content:url(https://i.imgur.com/LJvMTyw.png);
    transform: scale(.3);
    position: fixed;
    left: 50%;
    top: -6%;
    background: white;
}

D
Dharman

是的,最初的问题是八年前提出的,但它实际上与今天一样具有相关性。现在,我在这期 ::before 上从一个支柱到另一个帖子,已经持续了大约一周 ::after,它一直在驱使我绕过弯道。

从这个页面,以及其他关于这个主题的页面——我终于把它放在一起,并在伪标签中缩小了一个图像的大小。

** 运行注释 .colnav 只是我的容器类,它包含一个

T
Thomas

这是另一个(工作)解决方案:只需将图像大小调整为您想要的大小:)

.pdflink:after {
    display: block;
    width: 20px;
    height: 10px;
    content:url('/images/pdf.png');
}

你需要 pdf.png 为 20px * 10px 才能工作。 css中的20px/10px是在这里给出块的大小,这样块之后的元素就不会全部和图片搞混了

不要忘记以原始大小保留原始图像的副本


这叫笑话!!
R
Ravi Soni
.pdflink:after {
    background-image: url('/images/pdf.png');
    background-size: 10px 20px;
    width: 10px; 
    height: 20px;
    padding-left: 10px;// equal to width of image.
    margin-left:5px;// to add some space for better look
    content:"";
}

U
Usman Ahmed

您可以设置元素本身的宽度和高度,而不是设置背景图像的宽度和高度。

.pdflink::after {
  content: '';
  background-image: url(/images/pdf.png);
  width: 100px;
  height: 100px;
  background-size: contain;
}

P
Plamen

您可以使用 zoom 属性。检查this jsfiddle


检查 jsfiddle,两者大小相同,缩放以红色突出显示。
目前它不会在 Firefox 53 中调整大小。希望这可以在更高版本的 Firefox 中实现。很高兴知道它至少可以在 Chrome 中运行。 :-)
r
rhysclay

现在使用 flexbox,您可以大大简化您的代码,并且只需根据需要调整 1 个参数:

.pdflink:after {
    content: url('/images/pdf.png');
    display: inline-flex;
    width: 10px;
}

现在您只需调整元素的宽度,高度会自动调整,增加/减少宽度,直到元素的高度达到您需要的数字。


对我不起作用,可能是因为图像是 svg,可能是因为父级是 flex 容器。
也不在 jpg 上url(//placeimg.com/800/200/arch)
我发现这个答案对我有用,加上:content-visibility: hidden;(无法解释为什么会这样。
N
Nesha Zoric

您可以像这样更改 Before or After 元素的高度或宽度:

.element:after {
  display: block;
  content: url('your-image.png');
  height: 50px; //add any value you need for height or width
  width: 50px;
}

A
Andre Jesus Seiji Nishi

我使用了这个字体大小控制宽度

.home_footer1::after {
color: transparent;
background-image: url('images/icon-mail.png');      
background-size: 100%;      
content: ".......................................";
font-size: 30pt;
}

u
uyghurbeg
content: "";
background-image: url("yourimage.jpg");
background-size: 30px, 30px;