使用CSS中的`position: fixed`属性实现居中的`<div>`元素 - JavaScript技巧

499 篇文章 ¥59.90 ¥99.00
本文介绍了如何利用CSS的`position: fixed`属性结合JavaScript实现网页上元素的居中效果。详细阐述了HTML、CSS和JavaScript代码示例,通过设置元素的初始位置和响应窗口大小变化来确保元素始终保持居中状态。

在Web开发中,居中元素是一个常见的需求。CSS的position属性提供了多种定位方式,其中fixed是一种常用的定位方式,可以使元素相对于浏览器窗口进行定位。结合JavaScript技巧,我们可以实现一个居中的<div>元素。

以下是一个详细的示例,展示了如何使用CSS中的position: fixed和JavaScript来实现一个居中的<div>元素:

HTML部分:

<!DOCTYPE html>
<html>
<head
在这段代码中,我有一个隐藏标题栏和导航栏的按钮功能,这个按钮我不要文字的,改成图标的,并且鼠标不移动上去的时候,是完全隐藏的,另外,隐藏的时候,是先隐藏导航栏再隐藏标题栏,但是我点击隐藏,标题栏会瞬间变小,显示错误,帮我找一下原因,给我全部的代码, 以下为当前代码<template> <div class="app-container"> <!-- 隐藏/显示按钮 --> <div class="toggle-btn" @click="toggleCollapse" :style="{ left: isCollapsed ? '50%' : 'calc(50% + 100px)' }" > {{ isCollapsed ? '展开' : '隐藏' }} </div> <!-- 导航标题 --> <div class="nav-header" :class="{ collapsed: isCollapsed }"> <h3>iiot</h3> </div> <!-- 主布局 --> <div class="main-layout"> <!-- 左侧导航栏 --> <div class="left-nav" :class="{ collapsed: isCollapsed }"> <el-menu class="custom-menu" :collapse="false" background-color="#1a2b4a" text-color="#d7e3ff" active-text-color="#409EFF" :unique-opened="true" router > <el-sub-menu index="1"> <template #title> <el-icon><Document /></el-icon> <span>任务管理</span> </template> <el-menu-item-group> <el-menu-item index="/taskList">调度任务</el-menu-item> <el-menu-item index="/taskType">任务编辑</el-menu-item> <el-menu-item index="/commandSet">指令编辑</el-menu-item> <el-menu-item index="/log-types">任务日志</el-menu-item> </el-menu-item-group> </el-sub-menu> <el-sub-menu index="2"> <template #title> <el-icon><Files /></el-icon> <span>大屏展示</span> </template> <el-menu-item-group> <el-menu-item index="/display_all">总览</el-menu-item> <el-menu-item index="/warehouse_status">仓库状态</el-menu-item> </el-menu-item-group> </el-sub-menu> <el-sub-menu index="3"> <template #title> <el-icon><Notebook /></el-icon> <span>库位管理</span> </template> <el-menu-item-group> <el-menu-item index="/warehouse">库位管理</el-menu-item> <el-menu-item index="/station">站点管理</el-menu-item> </el-menu-item-group> </el-sub-menu> <el-sub-menu index="4"> <template #title> <el-icon><Setting /></el-icon> <span>配置模块</span> </template> <el-menu-item-group> <el-menu-item index="4-1">设备管理</el-menu-item> <el-menu-item index="4-2">变量管理</el-menu-item> <el-menu-item index="4-5">路径管理</el-menu-item> <el-menu-item index="4-6">管控区域</el-menu-item> </el-menu-item-group> </el-sub-menu> </el-menu> </div> <!-- 右侧内容区 --> <div class="right-content" :class="{ full: isCollapsed }"> <router-view></router-view> </div> </div> </div> </template> <script lang="ts" setup> import { ref } from 'vue'; import { Document, Notebook, Files, Setting } from "@element-plus/icons-vue"; const isCollapsed = ref(false); const isAnimating = ref(false); // 防止动画期间重复点击 const toggleCollapse = () => { if (isAnimating.value) return; isAnimating.value = true; if (isCollapsed.value) { // 展开过程:先显示标题栏,等待1秒后显示导航栏 isCollapsed.value = false; setTimeout(() => { isAnimating.value = false; }, 5000); // 标题栏2秒动画 + 1秒等待 + 导航栏2秒动画 = 5秒 } else { // 折叠过程:先隐藏导航栏,等待1秒后隐藏标题栏 isCollapsed.value = true; setTimeout(() => { isAnimating.value = false; }, 5000); // 导航栏2秒动画 + 1秒等待 + 标题栏2秒动画 = 5秒 } }; </script> <style> /* 全局样式重置 */ body, html { margin: 0; padding: 0; width: 100%; height: 100%; overflow: hidden; } /* 确保所有元素使用border-box */ *, *::before, *::after { box-sizing: border-box; } </style> <style scoped> .app-container { width: 100vw; height: 100vh; margin: 0; padding: 0; display: flex; flex-direction: column; background-color: #ffffff; overflow: hidden; position: relative; } .nav-header { padding: 12px 15px; display: flex; align-items: center; background-color: #152238; border-bottom: 0px solid #000000; flex-shrink: 0; /* 标题栏基础动画设置 */ transition: all 0.3s ease; } .left-nav { height: 100%; display: flex; flex-direction: column; width: 200px; /* 导航栏基础动画设置 */ transition: all 0.3s ease; } .nav-header h3 { margin: 0; font-size: 22px; color: #d7e3ff; font-weight: 600; margin-left: 10px; } .main-layout { display: flex; flex: 1; overflow: hidden; min-width: 0; } .right-content { flex: 1; height: 100%; background-color: #f0f2f5; overflow: auto; padding: 0px; transition: all 2s ease; } .custom-menu { border-right: none; flex: 1; width: 100%; } /* 调整菜单项样式 */ .custom-menu .el-menu-item, .custom-menu .el-sub-menu__title { height: 50px; line-height: 50px; } /* 调整图标和文字的间距 */ .custom-menu .el-icon { margin-right: 8px; } /* 悬浮按钮样式 */ .toggle-btn { position: fixed; top: 5px; transform: translateX(-50%); z-index: 1000; background-color: #152238; color: #d7e3ff; padding: 5px 15px; border-radius: 15px; cursor: pointer; opacity: 0; pointer-events: none; transition: opacity 0.3s ease, left 0.3s ease; } /* 感应区域 */ .app-container::before { content: ''; position: fixed; top: 0; left: calc(50% - 50px); width: 100px; height: 20px; z-index: 999; } /* 鼠标悬停时显示按钮 */ .app-container:hover .toggle-btn { opacity: 0.8; pointer-events: auto; } .toggle-btn:hover { opacity: 1 !important; } /* 折叠状态样式 - 隐藏过程 */ .left-nav.collapsed { /* 导航栏立即开始隐藏动画(2秒) */ width: 0; overflow: hidden; transition: all 2s ease 0s; /* 无延迟 */ } .nav-header.collapsed { /* 标题栏延迟3秒开始隐藏动画(导航栏2秒 + 等待1秒) */ height: 0; padding: 0; border: 0; overflow: hidden; transition: all 2s ease 3s; /* 3秒延迟 */ } /* 展开状态样式 - 显示过程 */ .nav-header:not(.collapsed) { /* 标题栏立即开始显示动画(2秒) */ transition: all 2s ease 0s; /* 无延迟 */ } .left-nav:not(.collapsed) { /* 导航栏延迟3秒开始显示动画(标题栏2秒 + 等待1秒) */ transition: all 2s ease 3s; /* 3秒延迟 */ } .right-content.full { left: 0; } </style>
08-13
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>宿舍调整管理系统</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.0/font/bootstrap-icons.css"> <style> .student-card { transition: all 0.3s; border-left: 4px solid #0d6efd; } .student-card:hover { transform: translateY(-3px); box-shadow: 0 5px 15px rgba(0,0,0,0.1); } .selected { background-color: #e7f1ff; } .student-card { transition: all 0.3s; border-left: 4px solid #0d6efd; } .student-card:hover { transform: translateY(-3px); box-shadow: 0 5px 15px rgba(0,0,0,0.1); } .selected { background-color: #e7f1ff; } .adjust-animation { animation: highlight 2s; } @keyframes highlight { 0% { background-color: #d4edda; } 100% { background-color: transparent; } } #adjustHistory { max-height: 300px; overflow-y: auto; } </style> </head> <body> <div class="container-fluid py-4"> <div class="row mb-4"> <div class="col-md-6"> <h2><i class="bi bi-people-fill me-2"></i>宿舍调整管理</h2> </div> <div class="col-md-6 text-end"> <button class="btn btn-primary me-2" id="confirmAdjust"> <i class="bi bi-check-circle me-1"></i>确认调整 </button> <button class="btn btn-outline-secondary" id="printList"> <i class="bi bi-printer me-1"></i>打印名单 </button> </div> </div> <div class="row"> <div class="col-md-8"> <div class="card mb-4"> <div class="card-header bg-white"> <div class="row"> <div class="col-md-4"> <select class="form-select" id="buildingFilter"> <option selected>全部楼栋</option> <option>1号楼</option> <option>2号楼</option> <option>3号楼</option> </select> </div> <div class="col-md-4"> <select class="form-select" id="genderFilter"> <option selected>全部性别</option> <option>男</option> <option>女</option> </select> </div> <div class="col-md-4"> <div class="input-group"> <input type="text" class="form-control" placeholder="搜索学号/姓名"> <button class="btn btn-outline-secondary"><i class="bi bi-search"></i></button> </div> </div> </div> </div> <div class="card-body"> <div class="table-responsive"> <table class="table table-hover"> <thead> <tr> <th width="40px"></th> <th>学号</th> <th>姓名</th> <th>性别</th> <th>当前宿舍</th> <th>班级</th> </tr> </thead> <tbody id="studentList"> <tr class="student-card"> <td><input type="checkbox" class="form-check-input"></td> <td>20250001</td> <td>张三</td> <td>男</td> <td>1-201</td> <td>计算机2101</td> </tr> <tr class="student-card"> <td><input type="checkbox" class="form-check-input"></td> <td>20250002</td> <td>李四</td> <td>男</td> <td>1-202</td> <td>计算机2101</td> </tr> </tbody> </table> </div> </div> </div> </div> <div class="col-md-4"> <div class="card"> <div class="card-header bg-white"> <h5 class="mb-0">调整到新宿舍</h5> </div> <div class="card-body"> <div class="mb-3"> <label class="form-label">选择楼栋</label> <select class="form-select" id="newBuilding"> <option>1号楼</option> <option>2号楼</option> <option>3号楼</option> </select> </div> <div class="mb-3"> <label class="form-label">选择楼层</label> <select class="form-select" id="newFloor"> <option>1层</option> <option>2层</option> <option>3层</option> </select> </div> <div class="mb-3"> <label class="form-label">选择房间</label> <select class="form-select" id="newRoom"> <option>201</option> <option>202</option> <option>203</option> </select> </div> <div class="mb-3"> <label class="form-label">调整原因</label> <select class="form-select" id="adjustReason"> <option>宿舍调换</option> <option>专业调整</option> <option>特殊需求</option> <option>其他原因</option> </select> </div> <div class="mb-3"> <label class="form-label">备注说明</label> <textarea class="form-control" rows="3"></textarea> </div> </div> </div> </div> </div> </div> <div class="container-fluid py-4"> <div class="row justify-content-center"> <div class="col-md-10"> <div class="row"> <!-- 调整记录板块 --> <div class="col-md-4 mb-4"> <div class="card h-100"> <div class="card-header bg-white text-center"> <h5 class="mb-0">调整记录</h5> </div> <div class="card-body"> <ul class="list-group"> <li class="list-group-item d-flex justify-content-between align-items-center"> 张三 从1-201调整到2-305 <span class="badge bg-secondary">2025-06-20</span> </li> </ul> </div> </div> </div> <!-- 学生列表区域 --> <div class="col-md-8"> <!-- 学生列表内容保持不变 --> </div> </div> </div> </div> </div> <!-- 学生列表区域 --> <div class="col-md-8"> <!-- 学生列表内容保持不变 --> </div> </div> </div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <script> // 增强的确认调整功能 document.getElementById('confirmAdjust').addEventListener('click', function() { const selectedStudents = document.querySelectorAll('#studentList tr input[type="checkbox"]:checked'); if(selectedStudents.length === 0) { alert('请至少选择一名学生'); return; } const newBuilding = document.getElementById('newBuilding').value; const newFloor = document.getElementById('newFloor').value; const newRoom = document.getElementById('newRoom').value; const reason = document.getElementById('adjustReason').value; if(confirm(`确定将选中的${selectedStudents.length}名学生调整到${newBuilding}${newRoom}吗?`)) { // 添加调整动画 selectedStudents.forEach(checkbox => { const row = checkbox.closest('tr'); row.classList.add('adjust-animation'); setTimeout(() => row.classList.remove('adjust-animation'), 2000); // 更新宿舍显示 const currentDormCell = row.querySelector('td:nth-child(5)'); const oldDorm = currentDormCell.textContent; currentDormCell.textContent = `${newBuilding}-${newRoom}`; // 添加到调整记录 const studentName = row.querySelector('td:nth-child(3)').textContent; const historyItem = document.createElement('li'); historyItem.className = 'list-group-item d-flex justify-content-between align-items-center'; historyItem.innerHTML = ` ${studentName} 从${oldDorm}调整到${newBuilding}-${newRoom} <span class="badge bg-secondary">${new Date().toLocaleDateString()}</span> `; document.getElementById('adjustHistory').prepend(historyItem); }); // 重置选择 document.querySelectorAll('#studentList input[type="checkbox"]').forEach(cb => cb.checked = false); document.querySelectorAll('#studentList tr').forEach(row => row.classList.remove('selected')); } }); </script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <script> // 学生选择功能 document.querySelectorAll('#studentList tr').forEach(row => { row.addEventListener('click', function(e) { if(e.target.tagName !== 'INPUT' && e.target.tagName !== 'A') { const checkbox = this.querySelector('input[type="checkbox"]'); checkbox.checked = !checkbox.checked; if(checkbox.checked) { this.classList.add('selected'); } else { this.classList.remove('selected'); } } }); }); // 确认调整功能 document.getElementById('confirmAdjust').addEventListener('click', function() { const selectedStudents = document.querySelectorAll('#studentList tr input[type="checkbox"]:checked'); if(selectedStudents.length === 0) { alert('请至少选择一名学生'); return; } const newBuilding = document.getElementById('newBuilding').value; const newFloor = document.getElementById('newFloor').value; const newRoom = document.getElementById('newRoom').value; const reason = document.getElementById('adjustReason').value; if(confirm(`确定将选中的${selectedStudents.length}名学生调整到${newBuilding}${newRoom}吗?`)) { alert('宿舍调整成功!'); // 这里可以添加实际调整逻辑 } }); // 打印功能 document.getElementById('printList').addEventListener('click', function() { window.print(); }); </script> </body> </html> 调整页面布局结构并优化悬浮按钮对数据的更新
06-21
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值