shanxia-mp-pattern-feedback.html 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
  6. <title>山峡化工 · 弹窗与反馈 Pattern</title>
  7. <link rel="stylesheet" href="shanxia-mp-base.css" />
  8. </head>
  9. <body>
  10. <nav class="proto-nav">
  11. <strong>Pattern</strong>
  12. <a href="shanxia-mp-pattern-index.html">索引</a>
  13. <a href="shanxia-mp-pattern-list.html">列表</a>
  14. <a href="shanxia-mp-pattern-view.html">查看</a>
  15. <a href="shanxia-mp-pattern-form.html">表单</a>
  16. <a class="active" href="shanxia-mp-pattern-feedback.html">弹窗</a>
  17. </nav>
  18. <main class="phone no-tabbar">
  19. <header class="mp-navbar">
  20. <a class="mp-navbar__back" href="shanxia-mp-pattern-index.html">← 返回</a>
  21. <h1 class="mp-navbar__title">弹窗与反馈</h1>
  22. <span class="mp-navbar__action" style="visibility:hidden">占位</span>
  23. </header>
  24. <div class="mp-pattern-note" style="margin-top:8px">
  25. <strong>P-FEEDBACK · 弹窗 / 抽屉 / 提示</strong>
  26. 居中确认框用于破坏性操作;底部抽屉用于半屏查看或选择器;Action Sheet 用于更多操作;Toast 用于轻量结果反馈。
  27. </div>
  28. <section class="mp-section">
  29. <div class="mp-list">
  30. <button class="mp-card" type="button" id="demo-dialog" style="width:100%;text-align:left">
  31. <div class="mp-card__title">居中确认弹窗</div>
  32. <div class="mp-card__sub">删除、作废、退出登录等二次确认</div>
  33. </button>
  34. <button class="mp-card" type="button" id="demo-sheet" style="width:100%;text-align:left">
  35. <div class="mp-card__title">底部抽屉</div>
  36. <div class="mp-card__sub">半屏详情预览、筛选面板、选择器</div>
  37. </button>
  38. <button class="mp-card" type="button" id="demo-action" style="width:100%;text-align:left">
  39. <div class="mp-card__title">操作菜单 Action Sheet</div>
  40. <div class="mp-card__sub">详情页「更多」、长按卡片</div>
  41. </button>
  42. <button class="mp-card" type="button" id="demo-toast-success" style="width:100%;text-align:left">
  43. <div class="mp-card__title">Toast · 成功</div>
  44. <div class="mp-card__sub">提交成功、保存成功</div>
  45. </button>
  46. <button class="mp-card" type="button" id="demo-toast-error" style="width:100%;text-align:left">
  47. <div class="mp-card__title">Toast · 失败</div>
  48. <div class="mp-card__sub">网络异常、校验失败摘要</div>
  49. </button>
  50. </div>
  51. </section>
  52. <section class="mp-block">
  53. <h2 class="mp-block__title">使用场景对照</h2>
  54. <div class="mp-block__panel">
  55. <table class="mp-mini-table">
  56. <thead><tr><th>组件</th><th>场景</th></tr></thead>
  57. <tbody>
  58. <tr><td>mp-dialog</td><td>删除确认、退出登录、提交前确认</td></tr>
  59. <tr><td>mp-sheet</td><td>列表快捷查看、下拉选择、筛选面板</td></tr>
  60. <tr><td>mp-action-sheet</td><td>编辑/分配/分享等 3+ 操作入口</td></tr>
  61. <tr><td>mp-toast</td><td>操作结果轻提示(1.5s 自动消失)</td></tr>
  62. <tr><td>mp-empty</td><td>列表无数据</td></tr>
  63. <tr><td>mp-skeleton</td><td>首屏加载占位</td></tr>
  64. </tbody>
  65. </table>
  66. </div>
  67. </section>
  68. </main>
  69. <div class="mp-overlay" id="ov-dialog"></div>
  70. <div class="mp-dialog" id="dlg">
  71. <div class="mp-dialog__body">
  72. <div class="mp-dialog__title">确认提交?</div>
  73. <p class="mp-dialog__text">提交后将进入审批流程,审批通过前不可修改。</p>
  74. </div>
  75. <div class="mp-dialog__foot">
  76. <button class="mp-dialog__btn" type="button" data-close="dlg">取消</button>
  77. <button class="mp-dialog__btn mp-dialog__btn--primary" type="button" data-close="dlg">确认</button>
  78. </div>
  79. </div>
  80. <div class="mp-overlay" id="ov-sheet"></div>
  81. <aside class="mp-sheet" id="sheet">
  82. <div class="mp-sheet__handle"></div>
  83. <div class="mp-sheet__head">
  84. <h2 class="mp-sheet__title">选择线索来源</h2>
  85. <button class="mp-sheet__close" type="button" data-close="sheet">关闭</button>
  86. </div>
  87. <div class="mp-sheet__body">
  88. <div class="mp-form-panel" style="margin:12px 16px">
  89. <button class="mp-field-row" type="button" style="width:100%;background:#fff"><span class="mp-field-row__label">官网表单</span><span class="mp-field-row__value" style="color:var(--brand-green-dark)">✓</span></button>
  90. <button class="mp-field-row" type="button" style="width:100%;background:#fff"><span class="mp-field-row__label">线下展会</span><span class="mp-field-row__value"></span></button>
  91. <button class="mp-field-row" type="button" style="width:100%;background:#fff"><span class="mp-field-row__label">电话来访</span><span class="mp-field-row__value"></span></button>
  92. <button class="mp-field-row" type="button" style="width:100%;background:#fff"><span class="mp-field-row__label">客户转介绍</span><span class="mp-field-row__value"></span></button>
  93. </div>
  94. </div>
  95. <footer class="mp-sheet__foot">
  96. <button class="mp-btn mp-btn--primary" type="button" data-close="sheet">确定</button>
  97. </footer>
  98. </aside>
  99. <div class="mp-overlay" id="ov-action"></div>
  100. <div class="mp-action-sheet" id="action">
  101. <div class="mp-action-sheet__group">
  102. <button class="mp-action-sheet__item" type="button">编辑</button>
  103. <button class="mp-action-sheet__item" type="button">分享</button>
  104. <button class="mp-action-sheet__item mp-action-sheet__item--danger" type="button">删除</button>
  105. </div>
  106. <button class="mp-action-sheet__cancel" type="button" data-close="action">取消</button>
  107. </div>
  108. <div class="mp-toast" id="toast"></div>
  109. <script>
  110. const pairs = {
  111. dialog: ['ov-dialog', 'dlg'],
  112. sheet: ['ov-sheet', 'sheet'],
  113. action: ['ov-action', 'action']
  114. }
  115. function openPair(key) {
  116. const [ov, panel] = pairs[key]
  117. document.getElementById(ov).classList.add('is-open')
  118. document.getElementById(panel).classList.add('is-open')
  119. }
  120. function closePair(key) {
  121. const [ov, panel] = pairs[key]
  122. document.getElementById(ov).classList.remove('is-open')
  123. document.getElementById(panel).classList.remove('is-open')
  124. }
  125. function showToast(text) {
  126. const t = document.getElementById('toast')
  127. t.textContent = text
  128. t.classList.add('is-open')
  129. setTimeout(() => t.classList.remove('is-open'), 1500)
  130. }
  131. document.getElementById('demo-dialog').onclick = () => openPair('dialog')
  132. document.getElementById('demo-sheet').onclick = () => openPair('sheet')
  133. document.getElementById('demo-action').onclick = () => openPair('action')
  134. document.getElementById('demo-toast-success').onclick = () => showToast('提交成功')
  135. document.getElementById('demo-toast-error').onclick = () => showToast('提交失败,请重试')
  136. document.querySelectorAll('[data-close]').forEach(btn => {
  137. btn.addEventListener('click', () => closePair(btn.dataset.close))
  138. })
  139. Object.keys(pairs).forEach(key => {
  140. const [ov] = pairs[key]
  141. document.getElementById(ov).addEventListener('click', () => closePair(key))
  142. })
  143. </script>
  144. </body>
  145. </html>