前端开发人员在构建网站时需要做的一个决定是引入图片的方式。它可以是标签,或者是通过CSSbackground属性,还可以使用SVG
在本文中,我们会学习引入图像的各种方式,以及每种方式的优点和缺点,以及何时使用和为什么使用它们。
最简单的情况下,img元素必须包含src属性:
在页面加载时,它们会在页面图像加载时发生一些布局变化。为了避免这种情况,我们可以为它设置width和height属性:
你注意到了吗,右边的图片即使还没有加载也会保留其空间吗?这是因为宽度和高度已经设置好了。它有明显的区别!
2、通过CSS隐藏图像
可以用CSS隐藏图片,但是它仍然会被加载到页面中。因此,在执行此操作时请小心,如果一个图片应该被隐藏,那么它可能是出于装饰的目的。
3、可访问性问题
HTML图片应该通过将alt属性设置为有意义的描述来访问,这对屏幕阅读器用户来说是非常有帮助的。
但是,如果不需要alt描述,请不要删除,如果删除了就会读出图片的src!这对可访问性(无障碍)环境是非常不利的。
不仅如此,如果图片因为某种原因没有加载,并且它有一个明确的alt,它将作为一个备用值回退显示。既然有一些有趣的事情我想让大家知道,那我们就从视觉上说说吧。
我们有以下图片:
没有alt的图片仍然保留了它的空间,这很混乱,而且不利于访问。虽然另一个折叠了,以适应其空的alt属性的内容,但由于它的边框,导致了它作为一个小点出现。
但是,当alt属性有值,它看起来是这样的:
这不是一个很好的反馈吗此外,当图像源失败时,可以向它们添加伪元素。
4、响应式图像
的优点在于可以针对特定视口大小将其扩展为具有多个版本的照片。我们有两种不同的方式来生成一组响应式图像:
1)、srcset属性
2)、HTMLpicture元素
5、调整图像大小
object-fit值有:fill,contain,cover,none,scale-down。例如:
img{object-fit:cover;object-position:50%50%;}CSS背景图片使用CSS背景显示图像时,它需要一个具有内容或特定宽度或高度的元素。通常,背景图像的主要用途应该是用于装饰目的。
1、何使用CSS背景图片
首先,我们需要一个元素
使用CSS背景图片的好处是可以设置多个背景。考虑以下示例:
.element{background:url('cool-1.jpg'),url('cool-2.jpg');}3、隐藏图像
我们可以在特定的视口上隐藏和显示图片,而不会让图片被下载。如果未使用CSS设置图片,则不会下载该图片。这是比使用更多的好处。
@media(min-width:700px){.element{background:url('cool-1.jpg');}}在上面的示例中,我们有一个背景图像,仅在视口宽度大于700px时显示。
4、可访问性问题
5、非开发人员无法下载
你可能会觉得很有趣,但是普通人知道,如果要保存图像,只需单击鼠标左键,然后选择保存即可。CSS背景图片并非如此,我们必须先检查元素,然后在DevTools中的url中打开链接,然后才能下载随CSS添加的图像。
6、伪元素
可以使用伪元素与CSS背景图片一起使用,例如,在图片的顶部显示一个叠加元素。对于来说,除非我们为覆盖层添加一个单独的元素,否则无法做到这一点。
SVG被认为是一种图像,它最大的功能是在不影响质量的情况下进行缩放。此外,使用SVG,我们可以嵌入JPG、PNG或SVG图像。参见下面的HTML:
你是否注意到了prepareAspectRatio?这样一来,可以使图像占据SVG的整个宽度和高度,而不会被拉伸或压缩。
当
这非常类似于CSS中的object-fit:cover或background-size:cover。
1、可访问性问题
关于SVG的可访问性,这使我想起了
在检查元素并复制图像的URL之前,不可能下载嵌入到SVG中的图像。然而,如果我们想要阻止用户下载特定的图像,这可能是一件好事。至少,它将减少下载图像的机会很容易。
1、HeroSection
在构建herosection时,有时我们需要在标题和其他内容下方的图像。参见下图:
注意这里有一个图像。你将如何构建它?好吧,让我先补充一些要求:
在开始解决方案之前,让我们先问问自己这种背景的性质。这是一些入门问题:
Hero-解决方案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变量来动态更改背,这比内联的东西好一百万倍。
解决方案1要点:
Hero-解决方案2
该方案是可以使用一个img标签:
.hero{position:relative;}.heroimg{position:absolute;left:0;top:0;z-index:-1;width:100%;height:100%;object-fit:cover;}.hero:after{content:"";position:absolute;left:0;top:0;z-index:-1;width:100%;height:100%;background:rgba(0,0,0,0.4);}此解决方案的优点在于,可以轻松更改图片的src属性。同样,如果图像很重要,它将会更加有用。
另外,我喜欢使用HTML的地方是可以在图片没有加载的情况下添加一个回退方法,这个回退至少可以保持内容的可读性。
好处是,只有在图像源失败的情况下,背景才会起作用。那不是很酷吗?
2、网站Logo
网站Logo是很重要的,因为它可以将网站与其他网站区分开。要嵌入Logo,我们有一些选择:
让我们学习使用哪种技术以及如何选择合适的技术。
带有很多细节的Logo
当一个LOGO有很多细节或形状时,用内嵌式SVG可能没有那么多好处。我建议使用,图片类型可以是png、jpg或svg。
我们有一个简单的logo,其中包含形状和文字。悬停时,形状和文本需要更改颜色。怎么做?对我来说最好的解决方案是使用嵌入式SVG。
HTML
响应式Logo
这让我想起了SmashingMagazine的logo。我喜欢它从一个小图标变成一个完整的Logo。参见下面的模型:
完美的解决方案是使用
.logo{display:inline-block;width:45px;}@media(min-width:1350px){.logo{width:180px;}}这是简单而直接的解决方案。
带有渐变的Logo
当logo具有渐变时,从Illustrator或Sketch等设计应用程序将其导出的过程可能并不完美,有时会中断。
使用SVG,我们可以轻松地为logo添加渐变。我添加了
3、用户头像
对于用户头像,它们具有很多形状,但最常见的是矩形或圆形。在此用例中,会介绍一个对你有用的重要技巧。
首先,让我们看下面的模型。请注意,我们有一个完美的化身,并且100%清晰。
但是,当用户上传半白色头像或非常浅的头像时,这个设计就不太好了。
注意到上面的模拟图中,你要真的聚焦好了才知道里面有一个圆形。这就是一个问题,为了解决这个问题,我们应该在头像内部添加一个边框,这将是在图像太亮的情况下作为备用。
我们有几个选择
哪一个最好?我们来探索探索。
使用HTML
你可能首先想到的是添加一个边框,对吧让我们来探讨一下这个问题。
我们的目标是使内部边框与图像融合在一起,这种不太实用。
使用具有
现在的问题是,要添加内部边框,我们不能使用box-shadow,因为它无法在图像上使用。解决方案用
.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);}通过在
如果我要使用
4、带图标的输入框
通常会看到带有图标的输入框,如何添加?当输入被聚焦时会发生什么?让我们来探索一下。
5、CSS打印
用户可能需要打印web页面。假设我们有一份食谱,你想把它打印出来,这样你就可以在厨房里看它,而不需要查看你的手机或电脑。
对于包含说明性步骤的菜谱,重要的是将它们打印出来,否则用户将无法从打印web页面中获得任何好处。
避免使用图像作为CSS背景
当一个图像作为CSS背景被包含进来时,它不会被打印出来,取而代之的是一个空白区域。如下图所示:
就是这样的情况。我们可以通过强制浏览器显示图片来解决这个问题,虽然这对Firefox和IE来说不起作用。
.element{background:url('cheesecake.png')center/coverno-repeat;-webkit-print-color-adjust:exact;/*强制浏览器以打印模式呈现背景*/}但是,使用HTML会更安全,因为它可以打印而不会出现任何问题。