如何将图片放入div中

如何将图片放入div中


关于这个问题,让我想到了将大象放进冰箱要几步,图片放进div看起来也就是如下3步。

  1. 创建div
  2. 在div中创建img
  3. img中填入src

但是,看起来就是这么简单,可是最主要的事情是,如何使得图片自适应div呢?

这个问题估计每个写前端的人都碰到过,虽然解决的方法有很多,但是不同的使用场景就得用不同的方法解决。

为此我在此给出自己的解决方法。

场景与解决方法

1.在固定大小的div中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<template>
<div class="box">
<img src="https://images.pexels.com/photos/27202978/pexels-photo-27202978.jpeg?auto=compress&cs=tinysrgb&w=600&lazy=load"
alt="" class="image">
</div>
</template>
<style scoped>
.box {
height: 300px;
width: 600px;
background-color: aqua;
}

.image {
max-width: 100%;
max-height: 100%;
}
</style>

这种场景最简单,直接限制图片宽高最大为100%即可。

2.由flex展开嵌套的div

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<template>
<div class="container">
<div class="box box0">
<div class="box2">
<img src="https://images.pexels.com/photos/27202978/pexels-photo-27202978.jpeg?auto=compress&cs=tinysrgb&w=600&lazy=load"
alt="" class="image">
</div>
</div>
<div class="box box1">
</div>
</div>
</template>
<style scoped>
.container {
height: 300px;
width: 600px;
display: flex;
}
.box {
flex: 1;
}
.box0 {
background-color: aqua;
}
.box1 {
background-color: red;
}
.box2 {
width: 100%;
height: 100%;
}
.image {
max-width: 100%;
max-height: 100%;
}
</style>

原理:将未设置大小的box0中的box2手动撑开,再限制图片大小。

3.特殊情况

获得div高度,再设置图片大小(不推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<script>
const imgDiv = ref<HTMLElement | null>(null)
let width = ref()
let height = ref()

onMounted(() => {
// 获取初始宽高
if (imgDiv.value) {
width.value = imgDiv.value.offsetWidth
height.value = imgDiv.value.offsetHeight
}
})
</script>

<template>
<div ref="imgDiv" class="imag">
<!-- 图片通过获取父元素大小动态设置宽高 -->
<图片组件名
:style="{width: Width + 'px',height: Height + 'px'}"
src=""
/>
</div>
</template>

<style>
:deep(.image .样式名或组件名){
object-fit: contain;
}
</style>

这样子将失去图片的动态宽高所以不推荐使用,只是用于说明一种解决方法,虽然可以通过监听事件重新设置大小,但将使得代码繁琐。

原理:不管是什么样子的图片组件,基本都是div套img实现的,所以在浏览器打开开发者工具看结构理来设置样式即可。

利用绝对定位使得图片基于div设置宽高

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<template>
<div class="container">
<div class="box box0">
<div class="box2">
<img src="https://images.pexels.com/photos/27202978/pexels-photo-27202978.jpeg?auto=compress&cs=tinysrgb&w=600&lazy=load"
alt="" class="image">
</div>
</div>
<div class="box box1">
</div>
</div>
</template>
<style scoped>
.container {
height: 300px;
width: 600px;
display: flex;
}
.box {
flex: 1;
}
.box1 {
background-color: red;
}
.box2 {
background-color: aqua;
width: 100%;
height: 100%;
position: relative;
}
.image {
max-width: 100%;
max-height: 100%;
position: absolute;
}
</style>

原理:通过绝对定位将图片脱离文档流,显示到div上面。


思考

是否有其它解决方法

将图片设置为div背景

这个方法确实也可以,不过我认为例如头像或者展示图之类的设置为背景,有点脱离语义化。但是在某些场景中还是挺实用的,例如WEB小游戏中设置为div背景时,不会被用户所拖拽到。

关于object-fit

这个属性通常是在img中使用,并**搭配宽高设置100%**,不过在我检查时发现,图片将会撑满整个容器,若是有缩放时会出现留白。

虽然看着没问题,不过留白的部分实际上也是图片的一部分,如果给图片设置鼠标移入时的动作,那么当鼠标看着还没到图片上时,就会触发动作。

所以我基本不使用它来使得图片自适应。

如何使得图片居中

这个其实很简单,不管是定位的方式实现居中还是弹性布局的方式实现居中,又或者其它居中的方法都可以。

所以我就不说明了,会用开发者工具,就能解决很多问题。