使用 CSS 替换 <img> 中的图像

Avatar of Marcel Shields
Marcel Shields 发布

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费额度!

以下是 Marcel Shields 的客座文章。Marcel 遇到了一个难题,需要更改页面上的图像,但无法访问 HTML。这种情况很少见,但我相信我们都遇到过类似的奇怪情况。他解释了如何在不访问 HTML 或 JavaScript 的情况下替换该图像。事实证明,这还是一种替换 **任何内容** 为图像的非常好的方法。

我只是想分享一些关于使用 CSS box-sizing 的非常酷的事情。Chris 几年前写了一篇 非常好的介绍,如果您不熟悉该属性,可以了解一下。在考虑布局时,它使事情变得更加合理。人们非常喜欢它,他们就像热辣酱一样 将其应用于所有内容。我想分享一下我如何发现它作为另一种图像替换技术的实用性。

几天前在工作中,我被要求用托管在其他地方的另一个图像替换我们网站上的一个 <img>。很简单,对吧?但问题在于我无法替换标记,因为它已经部署到生产环境中,但我可以通过我们的 CMS 注入 CSS 或 JS。无论我选择哪种技术,它都将插入到所有网站页面中。我只需要在一个特定的页面上进行操作,并且父容器的属性对所需的页面并不特定。

<head>
  <title>Really Cool Page</title>
</head>
<body>
  <!-- .header would be across site on other pages with different children, so no background image adding -->
  <div class="header">
    <img class="banner" src="//notrealdomain1.com/banner.png">
  </div>
</body>

使用 JavaScript 可以轻松做到这一点,但我希望看看是否有其他更简单的方法。在 Chrome 开发者工具中经过几次迭代后,我想到了使用 box-sizing 属性来保持尺寸严格,添加新图像作为背景图像,并使用填充将内联图像推离,看看会发生什么。

/* All in one selector */
.banner {
  display: block;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  background: url(http://notrealdomain2.com/newbanner.png) no-repeat;
  width: 180px; /* Width of new image */
  height: 236px; /* Height of new image */
  padding-left: 180px; /* Equal to width of new image */
}

效果非常好。以下是酷炫之处

  • 它几乎适用于任何元素,甚至包括空的元素,例如 <img> 或 <hr>
  • 浏览器支持非常好(Chrome、Firefox、Opera、Safari、IE8+)https://caniuse.cn/#feat=css3-boxsizing
  • 避免使用对 SEO 不友好的 display: none 或其他属性

最后一点似乎很重要,因为它对于文本替换也非常有效,无需任何调整。看看吧!