You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularJS实现模态框最小化/最大化功能(仿浏览器窗口效果)

AngularJS实现模态框最小化/最大化功能(仿浏览器窗口效果)

嘿,我来帮你搞定这个仿浏览器风格的模态框最小化/最大化功能!咱们一步步改造现有代码,让它完全符合你的需求👇

一、更新HTML结构,添加控制按钮和最小化容器

首先给模态框头部加上最小化(-)和最大化(+)按钮,再在页面底部加一个容器用来放最小化后的模态框缩略:

<button id="phq_btn" ng-click="openModalBtn('phq_modal','modal-overlay')">PHQ Open Modal</button>

<div id="modal-overlay"></div>

<!--PHQ Modal-->
<div id="phq_modal" class="modal">
  <!-- PHQ Modal content -->
  <div class="modal-content">
    <!--Allow Scroll-->
    <div class="modal-scroll">
      <!--Allow Dragging of Header-->
      <div class="modal-header">
        <div layout="row" class="titleHolder" style="height: 25px; width: 100%" >
          <div layout="column" flex="33">PHQ-9</div>
          <div layout="column" style="color: rgb(255, 255, 255)" layout-align="end end" flex="100">
            <!-- 最小化按钮 -->
            <span ng-click="minimizeModal('phq_modal')" style="margin-bottom:7px; margin-right:10px" class="minimize">-</span>
            <!-- 最大化按钮 -->
            <span ng-click="maximizeModal('phq_modal')" style="margin-bottom:7px; margin-right:10px" class="maximize">+</span>
            <!-- 关闭按钮 -->
            <span ng-click="closeModalBtn('phq_modal','modal-overlay')" style="margin-bottom:7px" class="close">&times;</span>
          </div>
        </div>
      </div>
      CONTENT GOES HERE.
    </div>
  </div>
</div>

<!-- 最小化模态框存放容器 -->
<div id="minimized-modals" class="minimized-modals"></div>

二、调整CSS样式,适配各种状态

新增最小化容器、缩略框,以及模态框最大化/最小化状态的样式:

/* The Modal (background) */
.modal {
  display: none; /* Hidden by default */
  position: fixed; /* Stay in place */
  z-index: 999; /* Sit on top */
  left: 0;
  top: 0;
  width: 100%; /* Full width */
  height: 100%; /* Full height */
}

/* Modal Content/Box */
.modal-content {
  padding: 10px;
  background-color: #fefefe;
  margin: 5% auto; /* 15% from the top and centered */
  border: 1px solid #888;
  border-radius: 10px;
  height: 70%;
  width: 80%; /* Could be more or less, depending on screen size */
  pointer-events:all;
  z-index: 999;
  transition: all 0.2s ease;
}

/* Modal Scroll Content*/
.modal-scroll {
  overflow-y: scroll !important;
  background-color: #fefefe;
  height: 100%;
  width: 100%;
  pointer-events:all;
}

.modal-header{
  cursor: pointer;
  background-color: #333;
  color: white;
  padding: 5px 10px;
  border-radius: 8px 8px 0 0;
}

/* The Close Button */
.close, .minimize, .maximize {
  color: #f7f3f3;
  float: right;
  font-size: 20px;
  font-weight: 600;
  cursor: pointer;
  height: 15px;
  width: 20px;
  text-align: center;
  pointer-events:all;
}

.close:hover, .minimize:hover, .maximize:hover {
  color: white;
  text-decoration: none;
  cursor: pointer;
}

.modal-overlay-on {
  z-index: 1000;
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background: rgba(0, 0, 0, 0.5);
  transition: opacity 200ms;
  opacity: 1;
  pointer-events: none;
  cursor: default;
}

/* --- 新增最小化相关样式 --- */
/* 底部最小化容器 */
.minimized-modals {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  height: 45px;
  background-color: #2d2d2d;
  display: flex;
  align-items: center;
  padding: 0 15px;
  gap: 12px;
  z-index: 998;
}

/* 最小化后的缩略框 */
.minimized-modal-thumb {
  background-color: #fefefe;
  padding: 6px 18px;
  border-radius: 4px;
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 14px;
}

.minimized-modal-thumb .restore-btn {
  font-weight: bold;
  color: #333;
}

/* 模态框最小化状态 */
.modal.minimized {
  display: none !important;
}

/* 模态框最大化状态 */
.modal.maximized .modal-content {
  width: 100% !important;
  height: 100% !important;
  margin: 0 !important;
  border-radius: 0 !important;
}

三、完善JavaScript交互逻辑

添加最小化、恢复、最大化的函数,同时优化原有功能,确保状态切换流畅:

//Open Modal
$scope.openModalBtn = function(modalId, overlayId){
  const modal = document.getElementById(modalId);
  modal.style.display = "block";
  // 重置状态
  modal.classList.remove('minimized', 'maximized');
  // 启用拖拽
  $(`#${modalId}`).draggable('enable');
  $(`#${overlayId}`).addClass('modal-overlay-on');
};

//Close Modal
$scope.closeModalBtn = function(modalId, overlayId){
  const modal = document.getElementById(modalId);
  modal.style.display = "none";
  modal.classList.remove('minimized', 'maximized');
  $(`#${overlayId}`).removeClass('modal-overlay-on');
  
  // 删除对应的最小化缩略
  const thumb = document.querySelector(`.minimized-modal-thumb[data-modal-id="${modalId}"]`);
  if (thumb) thumb.remove();
};

// 最小化模态框
$scope.minimizeModal = function(modalId) {
  const modal = document.getElementById(modalId);
  const modalTitle = modal.querySelector('.titleHolder div:first-child').textContent.trim();
  
  // 切换状态
  modal.classList.add('minimized');
  modal.classList.remove('maximized');
  // 隐藏遮罩
  document.getElementById('modal-overlay').classList.remove('modal-overlay-on');
  
  // 创建最小化缩略
  const thumb = document.createElement('div');
  thumb.className = 'minimized-modal-thumb';
  thumb.dataset.modalId = modalId;
  thumb.innerHTML = `<span>${modalTitle}</span><span class="restore-btn">+</span>`;
  
  // 绑定恢复事件
  thumb.addEventListener('click', () => {
    $scope.restoreModal(modalId);
    $scope.$apply(); // 通知Angular更新视图
  });
  
  // 添加到底部容器
  document.getElementById('minimized-modals').appendChild(thumb);
};

// 恢复模态框
$scope.restoreModal = function(modalId) {
  const modal = document.getElementById(modalId);
  const thumb = document.querySelector(`.minimized-modal-thumb[data-modal-id="${modalId}"]`);
  
  // 恢复显示
  modal.classList.remove('minimized');
  modal.style.display = 'block';
  document.getElementById('modal-overlay').classList.add('modal-overlay-on');
  
  // 删除缩略
  if (thumb) thumb.remove();
};

// 最大化/还原模态框
$scope.maximizeModal = function(modalId) {
  const modal = document.getElementById(modalId);
  modal.classList.toggle('maximized');
  
  // 最大化时禁用拖拽,还原时启用
  const draggable = $(`#${modalId}`);
  if (modal.classList.contains('maximized')) {
    draggable.draggable('disable');
  } else {
    draggable.draggable('enable');
  }
};

//Drag Modal
$(".modal").draggable({
  handle: ".modal-header"
});

//Disable Click outside of Modal
window.onclick = function(event) {
  if (event.target === document.getElementById('phq_modal')) {
    document.getElementById('phq_modal').style.display = "none";
    document.getElementById('modal-overlay').classList.remove('modal-overlay-on');
  }
};

功能说明

  • 点击模态框头部的-:模态框隐藏,底部出现对应缩略框,点击缩略框的+就能恢复
  • 点击模态框头部的+:模态框切换全屏/正常大小,全屏时无法拖拽
  • 关闭模态框时会自动清除底部的缩略框
  • 保持了原有的拖拽和点击外部关闭功能

备注:内容来源于stack exchange,提问作者Gjustinj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:59:28