网页图片技术:前端引入图片的多种方式及其优缺点
时间:2023-03-20 21:58:11
科技观察
前端开发者在建站时需要做出的决定之一就是如何引入图片。它可以是一个标签,或者通过CSS背景属性,或者可以使用SVG。选择正确的一个很重要,对性能和可访问性有很大影响。在本文中,我们将了解引入图像的各种方法,以及每种方法的优缺点,以及何时以及为何使用它们。HTMLimg元素在最简单的情况下,img元素必须包含src属性:在页面加载时设置宽度和高度属性,它们会在页面图像加载时引起一些布局变化。为了避免这种情况,我们可以为它设置width和height属性:但它有效。我们用一个图例来阐明这个概念:我们看到右边的图片虽然没有被加载,但还是保留了空间?那是因为设置了宽度和高度。通过CSS隐藏图片可以使用CSS隐藏图片。但是,它仍会加载到页面中。所以这样做的时候要小心。如果应该隐藏图像,则可能是出于装饰目的。img{display:none;}同样,上面的代码不会阻止浏览器加载图像,即使它在视觉上是隐藏的。原因是它被认为是一个替换元素,所以我们无法控制它加载的内容。Accessibility通过将alt属性设置为有意义的描述来发布AccessibleHTML图像,这对屏幕阅读器用户非常有帮助。但是,如果不需要alt描述,请不要删除它,如果这样做,图像src将被读出,这对可访问性非常不利。不仅如此,如果图像由于某种原因没有加载,并且它有一个清晰的alt,它将显示为后备。也通过图例来演示。假设我们有以下图像:当src无效,图片没有加载。第一个没有alt属性,而第二个有一个空的alt属性,它们在视觉上看起来是这样的:没有alt的图像仍然保留其空间,这令人困惑并且不利于访问。另一个带有空alt的图像会折叠成一个小点,因为它有边框。但是当alt属性有值时,它看起来像这样:这不是一个很好的反馈吗?此外,当图像源失败时,您可以向它们添加伪元素。响应式图像的美妙之处在于它们可以缩放为具有特定视口尺寸的照片的多个版本。我们有两种不同的方法来生成一组响应式图片:1.srcset属性这个很简单。对我来说,srcset可以根据屏幕宽度显示多种图像尺寸,这不是一个完美的解决方案。它让浏览器选择合适的图像,而我们对此无能为力。2.图片标签的另一种选择是使用元素。我更喜欢这种方式,因为它更容易预测。示例源代码:https://codepen.io/shadeed/pen/d703aee137f38c138f2323a0252548ac?editors=1100调整图像大小对于,我们还可以使用一组好的特征object-fit和object-position。它们可以控制大小和位置,就像CSS背景图像一样。object-fit值有:fill、contain、cover、none、scale-down。例如:img{object-fit:cover;object-position:50%50%;}CSS背景图像当使用CSS背景显示图像时,它需要一个具有内容或特定宽度或高度的元素。一般来说,背景图像的主要用途应该是装饰目的。CSS背景图片的使用方法首先我们需要一个元素//htmlSomecontent
//css.element{background:url('cool.jpg');}多背景使用CSS背景图片的好处是可以设置多个背景。考虑以下示例:.element{background:url('cool-1.jpg'),url('cool-2.jpg');}隐藏图像如果未使用CSS设置,我们可以在特定视口中隐藏和显示图像图像,它将不会被下载。与使用相比,这是一个额外的好处。在上面的示例中,我们有一个背景图像,它仅在视口宽度大于700px时显示。可访问性问题如果使用不当,背景图像会影响可访问性。例如,将其用于文章主题,这对于文章来说是必不可少的。非开发者无法下载一般人都知道,如果要保存图片,只需左键单击并选择保存即可。CSS 背景图像不是这种情况,我们必须检查元素并在DevTools中打开url中的链接,然后才能下载添加了CSS的图像。伪元素伪元素可以与CSS背景图像一起使用,例如在图像顶部显示叠加层。因为在我们为叠加层添加一个单独的元素之前,这是不可能的。SVGImageSVG被认为是一种图像,其较大的特征是在不影响质量的情况下进行缩放。此外,借助SVG,我们可以嵌入JPG、PNG或SVG图像。请参阅下面的HTML:您是否注意到prepareAspectRatio?它所做的是允许图像占据SVG的整个宽度和高度,而不会被拉伸或压缩。当宽度较大时,它将填充其父级(SVG)的宽度而不拉伸。这与CSS中的object-fit:cover或background-size:cover非常相似。辅助功能问题关于SVG辅助功能,这让我想起了
元素。例如,我们可以这样添加:我们也可以使用元素非开发人员无法下载嵌入在SVG中的图像,必须首先检查元素并复制图像的URL。但是,如果我们想阻止用户下载特定图像,这可能是一件好事。用例英雄部分在构建英雄部分时,有时我们需要标题下方的图像和其他内容。见下图:一些要求:背景图片可以动态更换图片有叠加层,便于阅读图片有小、中、大三种尺寸。每一个都用于特定的视口。在我们找到解决方案之前,让我们问问自己这个背景的性质。以下是一些入门问题:为用户保留此图像是否重要,还是可以跳过?我们是否需要在所有视口尺寸上使用它?它是静态的还是动态变化的?解决方案1通过使用多个CSS背景,我们可以将一个背景作为叠加层,将另一个背景作为实际图像。看看下面的CSS:.hero{background-image:linear-gradient(rgba(0,0,0,0.4),rgba(0,0,0,0.4)),var('landscape.jpg');background-repeat:no-repeat;background-size:100%,cover;}虽然此解决方案有效,但可以使用JavaScript动态更改背景图像。见下文:">这里添加了一个内联样式。虽然这行得通,但它看起来很丑而且不实用。也许我们可以使用CSS变量?让我们探讨一下。现在我们可以轻松地将--bg-url变量更新为动态改变背面,这比内联的东西好一百万倍。总结:该方案只适用于图片不重要的情况。这种方案只适用于一些静态网站,因为图片不是从后台拉出来的。源代码:https://codepen.io/shadeed/pen/17978a2d824fd51a3b27c2c2d099a522解决方案2这个解决方案是你可以使用img标签:UsingImagesinCSSAnarticleaboutwhichandwhentouse在CSS中,我们需要将图片绝对定位在内容下方,还需要使用伪元素作为覆盖。这个解决方案的美妙之处在于可以轻松更改图像的src属性。此外,如果图像很重要,它会更有用。此外,我喜欢使用HTML的一个特性是能够在图像未加载时添加回退。后备至少保持内容的可读性。.heroimg{/*Otherstyles*/background:#2962ff;}当图片源路径错误时,背景色是替代方面。示例源代码:https://codepen.io/shadeed/pen/73a2ca78141fcab39d6db9d5bd982728?editors=1100网站标志网站标志非常重要,因为它可以将网站与其他网站区分开来。要嵌入徽标,我们有几个选项:img->png,jpg,或svg内联SVG背景图像接下来,让我们看看哪个更合适。具有大量细节的徽标当徽标具有许多细节或形状时,将其用作嵌入式SVG可能没有好处。我推荐使用,图像类型可以是png、jpg或svg。需要动画的简单徽标我们有一个由形状和文本组成的简单徽标。悬停时形状和文本需要改变颜色。怎么做?对我来说更好的解决方案是使用嵌入式SVG。HTMLCSS.logorect,.logotext{transition:0.3sease-out;}.logo:hoverrect,.logo:hovertext{fill:#4a7def;}示例源代码:https://codepen.io/shadeed/pen/4005077cc54364714??8007f4834c0585c?editors=0100ResponseLogo这让我想起了SmashingMagazine的标志。我喜欢它如何从一个小图标变成一个完整的标志。请参阅下面的模型:一个很好的解决方案是使用一个元素,您可以在其中添加两个版本的徽标。看起来像这样:在CSS中,我们需要将视口的宽度更改为等于或大于1350px。.logo{display:inline-block;width:45px;}@media(min-width:1350px){.logo{width:180px;}}这是简单直接的解决方案。源代码示例:https://codepen.io/shadeed/pen/6cf55d4e87b7c443820bd5f8694587a8?editors=1100带有渐变的徽标当徽标具有渐变时,从Illustrator或Sketch等设计应用程序导出它的过程可能并不出色,有时会被打断。使用SVG,我们可以轻松地为我们的徽标添加渐变。我添加并将其用作文本填充。示例源代码:https://codepen.io/shadeed/pen/9bf3bee3d08a40411effb5d65f25b5c1?editors=1100用户头像对于用户头像,它们有多种形状,但最常见的是矩形或圆形。在此用例中,介绍了一个对您有用的重要技巧。首先,让我们看看下面的模型。请注意,我们有一个出色的头像,并且100%清晰。但是,当用户上传半白头像或非常浅的头像时,这种设计效果不佳。请注意,在上面的模型中,除非您真正关注它,否则您并不清楚其中是否有一个圆圈。这是个问题。为了解决这个问题,我们应该在头像内部添加一个边框,以防图像太亮而看不清。我们有几种选择img元素img和div元素divvsCSS背景SVG图像哪个更好?让我们探索一下。使用HTML`
`您可能首先想到的是添加边框,对吧?让我们探讨一下。.avatar{border:2pxsolid#f2f2f2;}我们的目标是让内边框和图片融为一体,不太实用。`
`和``元素现在的问题是,要添加内边框,我们不能使用box-shadow,因为它不适用于图像。解决方案是用头像包裹起来,并添加一个专用于内边框的元素。HTML
CSS.avatar-wrapper{position:relative;width:150px;height:150px;}.avatar-border{position:absolute;left:0;top:0;width:100%;height:100%;border-radius:50%;border:2pxsolidrgba(0,0,0,0.1);通过在
上使用10%不透明度的黑色边框,我们可以确保边框与深色图像融合,并且只有在图像较亮时才可见。模型见下:示例地址:https://codepen.io/shadeed/pen/da23d9a18dac14692a97e1bc6e86a5ff?editors=1100using`
`withCSSbackground如果我用
来显示头像,它可能代表图像是装饰性的。我记得一个用例,其中随机头像散布在整个页面中。HTML
CSS.avatar{background:var(--img-url)center/cover;width:150px;height:150px;border-radius:50%;box-shadow:inset0002pxrgba(#000,0.1);}示例地址:https://codepen.io/shadeed/pen/39eb9dac364ec15b9ab9bae7fe3a7148?editors=0100对我使用SVG``这是最有趣的解决方案。我在检查Facebook的新设计时注意到了它。首先剖析它,它包含以下内容:将图像切割成圆形的遮罩将遮罩应用于组图像本身,内部边框圆圈带有preserveAspectRatio="xMidYMid"{stroke-width:2;stroke:rgba(0,0,0,0.1);fill:none;}示例地址:https://codepen.io/shadeed/pen/b17d34b5c23cc90fdc4573779544c8c7?editors=0100