如何使用 CSS 在容器内正确缩放和定位图像
How to properly scale and position images inside of containers using CSS
我正在尝试创建一个 meme 页面,并在容器中装满图像。有些图像很宽,有些超长,我想以一种方式显示它们,使容器具有设定的大小(例如 50% 屏幕宽度,高度可以是自动的)并且内部图像被裁剪并居中。我觉得最好用一些照片来说明一下。
这就是我想要的:
这就是我得到的:
关键是如果图像太宽,则在顶部和底部出现这些白色条纹;如果图像太长,则在左侧和右侧出现这些白色条纹。
这是我的 CSS 代码:
.homePage {
width: 100%;
min-height: calc(100vh - 80px);
height: auto;
display: flex;
flex-direction: column;
align-items: center;
padding-top: 20px;
}
.homePage .post {
width: 50%;
background-color: rgb(250, 250, 250);
box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px;
margin: 20px;
padding: 20px;
border-radius: 15px;
}
.post .postHeader {
display: flex;
justify-content: center;
width: 100%;
}
.postHeader .title {
flex: 50%;
}
.postHeader .deletePost {
flex: 50%;
display: flex;
flex-direction: column;
align-items: flex-end;
}
.deletePost button {
border: none;
background: none;
font-size: 30px;
cursor: pointer;
}
.post .postImgContainer {
word-wrap: break-word;
height: auto;
width: 100%;
display: flex;
flex-direction: column;
justify-content:center;
overflow: hidden;
overflow-y: auto;
}
还有我的 HTML 代码:
<div className="homePage">
{imageLists.map((image) => {
return (
<div className="post">
<div className="postHeader">
<div className="title"></div>
</div>
<div className="postImgContainer">
{" "}
<img src={image}></img>{" "}
</div>
</div>
);
})}
</div>
每当我在 .postImgContainer
中将 flex-direction 从 column
更改为 row
时,它似乎工作正常,但仅针对一种图像,另一种图像被拉伸。
感谢您的帮助!
使用flex,您可以根据图片容器中规定的最大宽度和高度,将图片定位到想要的位置。我希望你能通过这个例子看清楚,如果你真的需要别的东西,请告诉我。
试试这个:
body {
min-height: 100vh;
}
.container {
width: 100%;
background: blue;
}
.meme {
width: 50%;
margin: 15px auto;
height: 600px;
background: green;
display: flex;
justify-content: center;
align-items: center;
}
.meme-img {
max-height: 100%;
max-width: 100%;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div class="container">
<div class="meme">
<img src="https://cdn.pixabay.com/photo/2022/05/30/14/24/stairs-7231312_960_720.jpg" class="meme-img">
</div>
<div class="meme">
<img src="https://cdn.pixabay.com/photo/2015/10/29/14/38/web-1012467_960_720.jpg" class="meme-img">
</div>
</div>
</body>
</html>
允许 CSS 背景发挥魔力。我们可以添加背景图像而不是实际图像,防止重复,居中并包含它。
看看我的(dumbed-down)版本:
.wrapper {
/* let's pretend it's a square */
height: 300px;
width: 300px;
/* the trick is background images (see HTML)
we use some styles here to make it all work */
background-repeat: no-repeat;
background-position: center;
background-size: contain;
/* just for the demo */
background-color: #f7f7f7;
border-radius: 10px;
box-shadow: 1px 2px 7px 0px rgba(0, 0, 0, .2);
}
<div class="wrapper" style="background-image: url(https://picsum.photos/600/300);"></div>
<p><!-- an empty spacer --></p>
<div class="wrapper" style="background-image: url(https://picsum.photos/300/600);"></div>
我正在尝试创建一个 meme 页面,并在容器中装满图像。有些图像很宽,有些超长,我想以一种方式显示它们,使容器具有设定的大小(例如 50% 屏幕宽度,高度可以是自动的)并且内部图像被裁剪并居中。我觉得最好用一些照片来说明一下。
这就是我想要的:
这就是我得到的:
关键是如果图像太宽,则在顶部和底部出现这些白色条纹;如果图像太长,则在左侧和右侧出现这些白色条纹。
这是我的 CSS 代码:
.homePage {
width: 100%;
min-height: calc(100vh - 80px);
height: auto;
display: flex;
flex-direction: column;
align-items: center;
padding-top: 20px;
}
.homePage .post {
width: 50%;
background-color: rgb(250, 250, 250);
box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px;
margin: 20px;
padding: 20px;
border-radius: 15px;
}
.post .postHeader {
display: flex;
justify-content: center;
width: 100%;
}
.postHeader .title {
flex: 50%;
}
.postHeader .deletePost {
flex: 50%;
display: flex;
flex-direction: column;
align-items: flex-end;
}
.deletePost button {
border: none;
background: none;
font-size: 30px;
cursor: pointer;
}
.post .postImgContainer {
word-wrap: break-word;
height: auto;
width: 100%;
display: flex;
flex-direction: column;
justify-content:center;
overflow: hidden;
overflow-y: auto;
}
还有我的 HTML 代码:
<div className="homePage">
{imageLists.map((image) => {
return (
<div className="post">
<div className="postHeader">
<div className="title"></div>
</div>
<div className="postImgContainer">
{" "}
<img src={image}></img>{" "}
</div>
</div>
);
})}
</div>
每当我在 .postImgContainer
中将 flex-direction 从 column
更改为 row
时,它似乎工作正常,但仅针对一种图像,另一种图像被拉伸。
感谢您的帮助!
使用flex,您可以根据图片容器中规定的最大宽度和高度,将图片定位到想要的位置。我希望你能通过这个例子看清楚,如果你真的需要别的东西,请告诉我。
试试这个:
body {
min-height: 100vh;
}
.container {
width: 100%;
background: blue;
}
.meme {
width: 50%;
margin: 15px auto;
height: 600px;
background: green;
display: flex;
justify-content: center;
align-items: center;
}
.meme-img {
max-height: 100%;
max-width: 100%;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div class="container">
<div class="meme">
<img src="https://cdn.pixabay.com/photo/2022/05/30/14/24/stairs-7231312_960_720.jpg" class="meme-img">
</div>
<div class="meme">
<img src="https://cdn.pixabay.com/photo/2015/10/29/14/38/web-1012467_960_720.jpg" class="meme-img">
</div>
</div>
</body>
</html>
允许 CSS 背景发挥魔力。我们可以添加背景图像而不是实际图像,防止重复,居中并包含它。
看看我的(dumbed-down)版本:
.wrapper {
/* let's pretend it's a square */
height: 300px;
width: 300px;
/* the trick is background images (see HTML)
we use some styles here to make it all work */
background-repeat: no-repeat;
background-position: center;
background-size: contain;
/* just for the demo */
background-color: #f7f7f7;
border-radius: 10px;
box-shadow: 1px 2px 7px 0px rgba(0, 0, 0, .2);
}
<div class="wrapper" style="background-image: url(https://picsum.photos/600/300);"></div>
<p><!-- an empty spacer --></p>
<div class="wrapper" style="background-image: url(https://picsum.photos/300/600);"></div>