前言
Custom Elements 是 Web Component 技术的一部分,这项技术能够让我们自定义 HTML 元素,实现可复用的组件。在这篇文章中,我们将会学习如何使用 Custom Elements 实现一个模态框组件。
模态框的基础知识
在开始编写我们的模态框组件之前,我们需要了解模态框的基本工作原理。模态框是一个覆盖在当前页面之上的 UI 元素,在模态框被展示时,用户只能和模态框交互。模态框一般会提供一个关闭按钮,当用户点击关闭按钮时,模态框会从页面中移除。
模态框可以用来展示警告、确认、提示、登录等功能,通常在用户进行一些重要操作时使用。同时,在移动设备上,在屏幕较小且需要弹出对话框请求用户响应时,模态框也是最常用的方式。
创建模态框组件
在这个例子中,我们将会创建一个 组件,用于展示模态框。我们将会使用 Custom Elements、Shadow DOM 和 CSS Grid 布局来创建一个简单的模态框组件。
定义
首先,我们需要定义 ,这将是我们所创建的模态框组件的标记名称:
<app-modal></app-modal>
注册
接下来,我们将使用 window.customElements.define()
将 定义为一个自定义元素:
// javascriptcn.com 代码示例 class AppModal extends HTMLElement { constructor() { super(); // ... } // ... } window.customElements.define('app-modal', AppModal);
创建 Shadow DOM
我们需要为 创建一个 Shadow DOM。Shadow DOM 允许我们创建完全封装的组件。只有 内部的代码可以操作它的 Shadow DOM。我们可以使用 this.attachShadow()
方法来创建 Shadow DOM:
constructor() { super(); this.attachShadow({ mode: 'open' }); }
现在 就有了一个空的 Shadow DOM 节点。接下来,我们需要在 Shadow DOM 中添加模态框的 HTML 和 CSS。
构建模态框
我们需要在 Shadow DOM 内部开发模态框所需的 HTML 和 CSS。我们可以使用 CSS Grid 固定模态框的顶部,然后使用 border-radius
、box-shadow
和其他 CSS 属性使模态框看起来和感觉像一个完整的元素。在完成样式表后,我们可以将 HTML 和 CSS 添加到 Shadow DOM 中:
// javascriptcn.com 代码示例 constructor() { super(); this.attachShadow({ mode: 'open' }); this.shadowRoot.innerHTML = ` <style> /* 组件样式 */ :host { position: fixed; top: 0; left: 0; right: 0; bottom: 0; display: grid; place-items: center; background-color: rgba(0, 0, 0, 0.5); } .modal { position: relative; min-height: 25%; max-height: 75%; width: 50%; display: grid; grid-template-rows: auto 1fr auto; background-color: white; border-radius: 5px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } .modal-header { display: grid; place-items: center; padding: 1rem; border-bottom: 1px solid #ececec; font-weight: bold; font-size: 1.2rem; } .modal-body { padding: 1rem; overflow-y: auto; } .modal-footer { display: flex; justify-content: flex-end; padding: 1rem; border-top: 1px solid #ececec; } /* 内容区域的样式 */ slot[name="header"] { grid-row: 1; } slot[name="body"] { grid-row: 2; } slot[name="footer"] { grid-row: 3; } /* 控制按钮的样式 */ .btn-default { background-color: #fff; border: 1px solid #ccc; color: #333; padding: 0.5rem 1rem; border-radius: 3px; font-size: 1rem; cursor: pointer; } .btn-default:hover { background-color: #ececec; border-color: #b8b8b8; } .btn-primary { background-color: #007bff; border-color: #007bff; color: #fff; } .btn-primary:hover { background-color: #0069d9; border-color: #0062cc; } </style> <div class="modal"> <slot name="header"></slot> <div class="modal-body"> <slot name="body"></slot> </div> <div class="modal-footer"> <button class="btn-default close">关闭</button> <button class="btn-primary">保存</button> </div> </div> `; }
在上面的示例代码中,我们使用了 slot
在模态框组件中填充内容。slot
元素是一种特殊的容器,可以添加在组件内,用来接收外部传递进来的内容。在这个例子中,我们使用了三个不同的 slot
,分别用来添加模态框的标题、内容和底部按钮。
显示和关闭模态框
我们已经准备好了模态框组件。但是,我们还需要显示和关闭模态框。为了显示一个模态框,我们需要 在 <app-modal>
上添加 display: block
样式。为了关闭模态框,我们可以通过输入事件绑定,当用户按下 “ESC” 键或点击模态框之外的区域时,模态框会关闭。
// javascriptcn.com 代码示例 show() { this.style.display = 'block'; } hide() { this.style.display = 'none'; } connectedCallback() { this.addEventListener('click', (event) => { if (event.target.classList.contains('close')) { this.hide(); } }); this.addEventListener('keydown', (event) => { if (event.key === 'Escape') { this.hide(); } }); }
在 connectedCallback()
中,我们使用了 addEventListener()
绑定了两个事件,分别是点击 "关闭" 按钮和 "ESC" 键盘按键事件。同时,我们还定义了 show()
和 hide()
方法来控制模态框的显示和隐藏。
如何使用
现在我们已经创建了一个功能完善的 组件。在这个例子中,我们创建了一个 “登录” 模态框。以下是示例代码:
// javascriptcn.com 代码示例 <button class="btn-primary" onclick="openModal()">打开登录框</button> <app-modal> <h3 slot="header">登录</h3> <form slot="body"> <div> <label for="username">用户名</label> <input type="text" name="username" id="username" required> </div> <div> <label for="password">密码</label> <input type="password" name="password" id="password" required> </div> <div> <input type="checkbox" name="remember" id="remember"> <label for="remember">记住我</label> </div> </form> <button class="btn-primary">登录</button> <button class="btn-default close">取消</button> </app-modal> <script> function openModal() { const modal = document.querySelector('app-modal'); modal.show(); } </script>
在这个示例代码中,我们使用了一个 “打开登录框” 的按钮,当点击按钮时,我们调用 openModal()
方法来展示登录模态框。同时,我们也为模态框组件添加了标题、表单内容和保存按钮。
总结
在这篇文章中,我们介绍了如何使用 Custom Elements 创建一个简单的模态框组件。我们使用了 Shadow DOM 和 CSS Grid 布局来构建我们的组件,并定义了一些基本方法来控制组件的显示和隐藏。 Custom Elements 提供了一种创建可复用组件的方法,它们可以在不同的项目和页面上使用,可以帮助开发者减少重复编码的时间,提高代码的可维护性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6548bc3d7d4982a6eb2ff6a4