【前端】做一个展示卡片样式数据的页面,解决卡片中图片高度不一致问题

需求分析

现在有这样一个需求,在一个页面展示数据,页面的数据通过卡片的形式展示,卡片中内容主要分为三部分,最上面个标题,中间是个图片,最下面是一排操作按钮。

  1. 这里的卡片可以保证固定的宽高比例
  2. 卡片可以随着窗口大小的变化做到自适应大小变化
  3. 实际图片的高度和宽度不一致,显示的的时候可以自适应大小,填充整个容器

实际实现

首先,我们定义一个.card 类,在这个类定义了卡片的样式,包括宽度、内边距、边框、圆角、阴影和背景色。.card img 的样式设置了图片的宽度为100%,高度自适应。为了使按钮等间距排列,使用了 display: flex;justify-content: space-around; 来实现。

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <style>
    .card {
      width: 300px;
      padding: 20px;
      border: 1px solid #ccc;
      border-radius: 10px;  /* 圆角卡片 */
      box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);/* 阴影效果 */
      background-color: #fff;  /* 卡片背景色 */
      text-align: center; /* 让内容居中 */
    }

    .card img {
      width: 100%; /* 图片宽度充满父容器 */
      height: auto; /* 根据宽度等比例调整高度 */
      border-radius: 5px; /* 图片也可设置圆角 */
      margin-bottom: 10px; /* 图片下方留一些空间 */
    }

    .buttons {
      display: flex;
      justify-content: space-around; /* 按钮等间距排列 */
    }

    .button {
      padding: 8px 16px;
      background-color: #4CAF50;
      color: white;
      border: none;
      border-radius: 5px;
      cursor: pointer;
    }
  </style>
  <title>Rounded Card</title>
</head>
<body>
  <div class="card">
    <h2>Card Title</h2>
    <img src="your-image.jpg" alt="Card Image">
    <div class="buttons">
      <button class="button">Button 1</button>
      <button class="button">Button 2</button>
      <button class="button">Button 3</button>
    </div>
  </div>
</body>
</html>

如果希望无论图片的原始大小如何,它们可以自适应容器的大小,可以使用 object-fit 属性,将图片进行拉伸或缩放以适应固定的高度和宽度。在这种情况下,将图片的宽度和高度都设置为100%

我们修改一下样式,给.card img 的样式设置 object-fit: cover;,这会拉伸或缩放图片以填充整个容器,同时保持其宽高比。

进一步修改的代码

css 复制代码
.card img {
  width: 100%;
  height: 100%;
  object-fit: cover; /* 拉伸或缩放图片以适应容器 */
  border-radius: 5px;
  margin-bottom: 10px;
}

卡片自适应改变大小

如果希望卡片能够在页面窗口大小变化时自适应改变大小,你可以使用百分比单位或者相对单位来设置卡片的宽度,以及使用 max-widthmin-width 来限制卡片的大小。示例代码:

css 复制代码
.card {
  width: 80%; /* 使用百分比或者相对单位 */
  max-width: 400px; /* 设置最大宽度 */
  padding: 20px;
  border: 1px solid #ccc;
  border-radius: 10px;
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
  background-color: #fff;
  text-align: center;
  margin: 0 auto; /* 居中显示 */
}

卡片固定宽高比例

这时候有问题,因为修改了自适应大小变化,可能会导致卡片的高度随着图片的高度变化而变化,这时候我们选用固定卡片的宽高比例。 示例代码:

css 复制代码
.card {
  width: 80%;
  max-width: 400px;
  border: 1px solid #ccc;
  border-radius: 10px;
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
  background-color: #fff;
  text-align: center;
  aspect-ratio: 1; /* 1:1 比例,可以根据需要调整 */
  margin: 0 auto;
}

在某些浏览器中,aspect-ratio 属性可能需要使用浏览器前缀。以下是一些主要浏览器的前缀示例:

css 复制代码
.card {
  width: 80%;
  max-width: 400px;
  border: 1px solid #ccc;
  border-radius: 10px;
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
  background-color: #fff;
  text-align: center;

  /* 使用浏览器前缀 */
  aspect-ratio: 1;        /* 标准写法 */
  -webkit-aspect-ratio: 1; /* Chrome 和 Safari */
  -moz-aspect-ratio: 1;    /* Firefox */
  -ms-aspect-ratio: 1;     /* Internet Explorer */
  -o-aspect-ratio: 1;      /* Opera */
  margin: 0 auto;
}
相关推荐
paopaokaka_luck15 分钟前
基于SpringBoot+Uniapp的健身饮食小程序(协同过滤算法、地图组件)
前端·javascript·vue.js·spring boot·后端·小程序·uni-app
患得患失9491 小时前
【前端】【vscode】【.vscode/settings.json】为单个项目配置自动格式化和开发环境
前端·vscode·json
飛_1 小时前
解决VSCode无法加载Json架构问题
java·服务器·前端
YGY Webgis糕手之路3 小时前
OpenLayers 综合案例-轨迹回放
前端·经验分享·笔记·vue·web
90后的晨仔4 小时前
🚨XSS 攻击全解:什么是跨站脚本攻击?前端如何防御?
前端·vue.js
Ares-Wang4 小时前
JavaScript》》JS》 Var、Let、Const 大总结
开发语言·前端·javascript
90后的晨仔4 小时前
Vue 模板语法完全指南:从插值表达式到动态指令,彻底搞懂 Vue 模板语言
前端·vue.js
德育处主任4 小时前
p5.js 正方形square的基础用法
前端·数据可视化·canvas
烛阴4 小时前
Mix - Bilinear Interpolation
前端·webgl
90后的晨仔4 小时前
Vue 3 应用实例详解:从 createApp 到 mount,你真正掌握了吗?
前端·vue.js