当前位置: 首页 > ai >正文

CSS:水平垂直居中

一、使用 Flexbox 布局

<script setup lang="ts">
// 不需要额外逻辑,纯CSS实现
</script><template><div class="flex-center"><div class="content">我是居中内容</div></div>
</template><style scoped>
.flex-center {display: flex;justify-content: center; /* 水平居中 */align-items: center;     /* 垂直居中 */height: 100%;          /* 视口高度 */width: 100%;            /* 宽度 */
}.content {/* 可选样式 */padding: 20px;background-color: #f0f0f0;border-radius: 8px;
}
</style>

二、使用 Grid 布局

<script setup lang="ts">
// 不需要额外逻辑,纯CSS实现
</script><template><div class="grid-center"><div class="content">我是居中内容</div></div>
</template><style scoped>
.grid-center {display: grid;place-items: center; /* 同时设置水平和垂直居中 */height: 100%;width: 100%;
}.content {/* 可选样式 */padding: 20px;background-color: #f0f0f0;
}
</style>

三、使用绝对定位 + transform

<script setup lang="ts">
// 不需要额外逻辑,纯CSS实现
</script><template><div class="absolute-center"><div class="content">我是居中内容</div></div>
</template><style scoped>
.absolute-center {position: relative;height: 100%;width: 100%;
}.content {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%); /* 反向偏移自身宽高的50% *//* 可选样式 */padding: 20px;background-color: #f0f0f0;
}
</style>

四、使用 margin: auto (需要固定尺寸)

<script setup lang="ts">
// 不需要额外逻辑,纯CSS实现
</script><template><div class="margin-auto-center"><div class="content">我是居中内容</div></div>
</template><style scoped>
.margin-auto-center {display: flex;height: 100%;width: 100%;
}.content {margin: auto; /* 需要在flex或grid容器中,且元素需要有尺寸 */width: 200px;  /* 需要固定宽度 */height: 100px; /* 需要固定高度 *//* 可选样式 */padding: 20px;background-color: #f0f0f0;
}
</style>

五、使用 CSS 表格布局

<script setup lang="ts">
// 不需要额外逻辑,纯CSS实现
</script><template><div class="table-center"><div class="content">我是居中内容</div></div>
</template><style scoped>
.table-center {display: table;width: 100%;height: 100%;
}.table-center > .content {display: table-cell;text-align: center; /* 水平居中 */vertical-align: middle; /* 垂直居中 */
}
</style>

六、使用 JavaScript 动态计算 (响应式)

<script setup lang="ts">
import { ref, onMounted, onBeforeUnmount } from 'vue'const position = ref({ x: 0, y: 0 })
const contentRef = ref<HTMLElement>()const updatePosition = () => {if (contentRef.value) {const parent = contentRef.value.parentElementif (parent) {position.value = {x: (parent.clientWidth - contentRef.value.offsetWidth) / 2,y: (parent.clientHeight - contentRef.value.offsetHeight) / 2}}}
}onMounted(() => {updatePosition()window.addEventListener('resize', updatePosition)
})onBeforeUnmount(() => {window.removeEventListener('resize', updatePosition)
})
</script><template><div class="js-center"><div ref="contentRef" class="content" :style="{ transform: `translate(${position.x}px, ${position.y}px)` }">我是JS计算的居中内容</div></div>
</template><style scoped>
.js-center {position: relative;height: 100%;width: 100%;
}.content {position: absolute;/* 初始位置,会被JS覆盖 */top: 0;left: 0;/* 可选样式 */padding: 20px;background-color: #f0f0f0;transition: transform 0.3s ease; /* 平滑过渡 */
}
</style>

七、使用 CSS 变量和 calc()

<script setup lang="ts">
// 不需要额外逻辑,纯CSS实现
</script><template><div class="calc-center"><div class="content">我是使用calc居中的内容</div></div>
</template><style scoped>
.calc-center {position: relative;height: 100%;width: 100%;
}.content {position: absolute;width: 200px;height: 100px;left: calc(50% - 100px); /* 50% - 宽度的一半 */top: calc(50% - 50px);  /* 50% - 高度的一半 *//* 可选样式 */padding: 20px;background-color: #f0f0f0;
}
</style>

Flexbox - 最简单、最现代的方式,推荐使用

Grid - 代码最简洁,但兼容性略低于Flexbox

绝对定位 + transform - 兼容性好,适合复杂场景

margin: auto - 需要固定尺寸,适合简单场景

CSS表格 - 较老的方法,不推荐在新项目中使用

JavaScript计算 - 适合需要动态调整的复杂场景

CSS calc() - 需要知道元素尺寸,灵活性较低

在大多数现代项目中,Flexbox 或 Grid 方法是首选,因为它们简洁、高效且易于维护。

以上方法均经过测试

八、欢迎交流指正

http://www.xdnf.cn/news/18075.html

相关文章:

  • Java基础(九):Object核心类深度剖析
  • GPT-5在辅助论文写作方面,有哪些进步?
  • 10CL016YF484C8G Altera FPGA Cyclone
  • 千岑智能亮相CIVS2025:国产仿真平台突破技术壁垒,赋能智能汽车产学研融合
  • 【GM3568JHF】FPGA+ARM异构开发板烧录指南
  • 制作全流程对比:侗家灰水粽VS布依族草灰粽的8道工序差异
  • 项目实战——矿物识别系统(利用机器学习从化学元素数据中识别矿物,从数据到分类模型)
  • Linux系统等保三级安全加固执行手册(ReahtCentosKylin)
  • Android中flavor的使用
  • (第十八期)图像标签的三个常用属性:width、height、border
  • 【iOS】锁的原理
  • SIGKDD-2023《Complementary Classifier Induced Partial Label Learning》
  • Unity2022打包安卓报错的奇葩问题
  • Win11安装WSL、Docker Desktop
  • 【最后203篇系列】033 Mongo副本集修复过程
  • 【论文阅读】-《GeoDA: a geometric framework for black-box adversarial attacks》
  • 如何在 Ubuntu 24.04 安装 Python 3.12 ?
  • C语言篇:猜数字游戏的实现教程
  • 【图像算法 - 17】慧眼识“果”:基于深度学习与OpenCV的苹果智能检测系统(附完整代码)
  • 【Linux系统】进程间通信:System V IPC——消息队列和信号量
  • 「三维共振」:重构实体零售的破局模式
  • HTML应用指南:利用POST请求获取上海黄金交易所金价数据
  • 折扣大牌点餐api接口对接适合本地生活吗?
  • OVS:除了Geneve和VXLAN,还有哪些虚拟化网络协议?
  • OpenCV Python——Numpy基本操作(Numpy 矩阵操作、Numpy 矩阵的检索与赋值、Numpy 操作ROI)
  • 隐秘参数APP:全面了解手机硬件信息与优化性能
  • Redis——Redisson篇
  • Oracle algorithm的含义
  • 【Unity3D实例-功能-拔枪】角色拔枪(二)分割上身和下身
  • 【前端面试题】JavaScript核心面试题解析