// 显示弹出层(添加或编辑联系人) function showModal(type, index) { let modal = document.getElementById('modal'); let form = modal.querySelector('form'); let saveBtn = modal.querySelector('#save-btn'); let cancelBtn = modal.querySelector('#cancel-btn'); if (type === 'add') { form.reset(); saveBtn.textContent = '添加'; } else if (type === 'edit') { let contact = contacts[index]; form.name.value = contact.name; form.phone.value = contact.phone; form.email.value = contact.email; saveBtn.textContent = '保存'; } modal.style.display = 'block';添加一个弹窗抖动

时间: 2023-07-14 14:13:10 浏览: 46
可以通过 CSS3 的动画效果来实现弹窗抖动的效果。具体实现步骤如下: 1. 在 CSS 文件中添加以下代码: ``` @keyframes shake { 0% { transform: translateX(0); } 10%, 30%, 50%, 70%, 90% { transform: translateX(-10px); } 20%, 40%, 60%, 80%, 100% { transform: translateX(10px); } } .shake { animation: shake 0.5s; } ``` 2. 在 JavaScript 文件中,在显示弹窗的代码后面添加以下代码: ``` modal.classList.add('shake'); setTimeout(() => { modal.classList.remove('shake'); }, 500); ``` 这段代码会给弹窗添加 `shake` 类,触发 CSS 中的抖动动画效果,然后在 0.5 秒后移除 `shake` 类,使弹窗停止抖动。 注意:需要根据实际情况调整动画效果的时间和距离,以达到最佳效果。
相关问题

function showModal(type, index) { let modal = document.getElementById('modal'); let form = modal.querySelector('form'); let saveBtn = modal.querySelector('#save-btn'); let cancelBtn = modal.querySelector('#cancel-btn'); if (type === 'add') { form.reset(); saveBtn.textContent = '添加'; } else if (type === 'edit') { let contact = contacts[index]; form.name.value = contact.name; form.phone.value = contact.phone; form.email.value = contact.email; saveBtn.textContent = '保存'; } modal.style.display = 'block';怎么给里面的编辑和删除按钮添加样式

你可以在 HTML 代码中为编辑和删除按钮添加类名,然后在 CSS 中定义这些类的样式。例如: HTML 代码: ``` <button class="edit-btn">编辑</button> <button class="delete-btn">删除</button> ``` CSS 代码: ``` .edit-btn { background-color: blue; color: white; border: none; padding: 5px 10px; cursor: pointer; } .delete-btn { background-color: red; color: white; border: none; padding: 5px 10px; cursor: pointer; } ``` 在这个示例中,我们为编辑按钮和删除按钮分别添加了 `edit-btn` 和 `delete-btn` 类,并为这些类定义了一些基本的样式,包括背景颜色、文字颜色、边框、内边距和鼠标指针样式。你可以根据自己的需要调整这些样式。

<h1>通讯录</h1> <button class="add-btn">添加联系人</button> <table> <thead> <tr> <th>姓名</th> <th>电话</th> <th>邮箱</th> <th>操作</th> </tr> </thead> <tbody> <!-- 数据渲染 --> </tbody> </table> <!-- 弹出层,用于添加或编辑联系人 --> <div id="modal" class="modal" style="display: none;"> <div class="modal-content"> <span class="close">&times;</span> <form> <div class="form-group"> <label for="name">姓名</label> <input type="text" id="name" name="name" required> </div> <div class="form-group"> <label for="phone">电话</label> <input type="text" id="phone" name="phone" required> </div> <div class="form-group"> <label for="email">邮箱</label> <input type="text" id="email" name="email" required> </div> <button id="save-btn">保存</button> <button id="cancel-btn">取消</button> </form> </div> </div>添加一个搜索框来进行正则查找和数据显示到五行时可以翻页

好的,以下是使用JavaScript实现的代码: HTML部分: ``` <h1>通讯录</h1> <button class="add-btn">添加联系人</button> <input type="text" id="search-input" placeholder="搜索姓名或电话"> <table> <thead> <tr> <th>姓名</th> <th>电话</th> <th>邮箱</th> <th>操作</th> </tr> </thead> <tbody id="contact-list"> <!-- 数据渲染 --> </tbody> </table> <!-- 分页按钮 --> <div id="page-buttons"></div> <!-- 弹出层,用于添加或编辑联系人 --> <div id="modal" class="modal" style="display: none;"> <div class="modal-content"> <span class="close">&times;</span> <form> <div class="form-group"> <label for="name">姓名</label> <input type="text" id="name" name="name" required> </div> <div class="form-group"> <label for="phone">电话</label> <input type="text" id="phone" name="phone" required> </div> <div class="form-group"> <label for="email">邮箱</label> <input type="text" id="email" name="email" required> </div> <button id="save-btn">保存</button> <button id="cancel-btn">取消</button> </form> </div> </div> ``` CSS部分: ``` /* 省略其他样式 */ /* 分页按钮样式 */ #page-buttons { margin-top: 20px; display: flex; justify-content: center; align-items: center; } .page-btn { margin: 0 10px; padding: 5px 10px; border: 1px solid #ccc; cursor: pointer; } .page-btn.active { background-color: #ccc; color: #fff; } ``` JavaScript部分: ``` // 定义全局变量 var contacts = []; // 联系人数据 var currentPage = 1; // 当前页码 var pageSize = 5; // 每页显示的数据条数 var totalPages = 1; // 总页数 // 页面加载完成后执行 window.onload = function() { // 获取元素 var contactList = document.getElementById('contact-list'); var searchInput = document.getElementById('search-input'); var pageButtons = document.getElementById('page-buttons'); // 添加联系人按钮点击事件 var addBtn = document.querySelector('.add-btn'); addBtn.onclick = function() { showModal(); }; // 关闭弹出层 var closeBtn = document.querySelector('.close'); closeBtn.onclick = function() { hideModal(); }; // 取消按钮点击事件 var cancelBtn = document.getElementById('cancel-btn'); cancelBtn.onclick = function() { hideModal(); }; // 保存按钮点击事件 var saveBtn = document.getElementById('save-btn'); saveBtn.onclick = function(event) { event.preventDefault(); // 阻止表单提交 // 获取表单数据 var name = document.getElementById('name').value.trim(); var phone = document.getElementById('phone').value.trim(); var email = document.getElementById('email').value.trim(); // 判断表单数据是否为空 if (!name || !phone || !email) { alert('请填写完整的联系人信息!'); return; } // 保存联系人数据 var contact = {name: name, phone: phone, email: email}; contacts.push(contact); saveContacts(); hideModal(); renderContacts(); // 重新渲染联系人数据 }; // 搜索框输入事件 searchInput.oninput = function() { renderContacts(); }; // 渲染联系人数据 function renderContacts() { var keyword = searchInput.value.trim(); // 获取搜索关键字 var filteredContacts = contacts.filter(function(contact) { // 过滤联系人数据 return contact.name.indexOf(keyword) !== -1 || contact.phone.indexOf(keyword) !== -1; }); // 计算分页数据 totalPages = Math.ceil(filteredContacts.length / pageSize); currentPage = Math.min(currentPage, totalPages); // 渲染分页按钮 var pageBtns = ''; for (var i = 1; i <= totalPages; i++) { pageBtns += '<div class="page-btn ' + (i === currentPage ? 'active' : '') + '">' + i + '</div>'; } pageButtons.innerHTML = pageBtns; // 绑定分页按钮点击事件 var pageBtnList = document.querySelectorAll('.page-btn'); for (var i = 0; i < pageBtnList.length; i++) { pageBtnList[i].onclick = function() { currentPage = parseInt(this.innerText); renderContacts(); }; } // 计算数据起始和结束索引 var startIndex = (currentPage - 1) * pageSize; var endIndex = startIndex + pageSize; // 渲染联系人数据 var html = ''; for (var i = startIndex; i < endIndex && i < filteredContacts.length; i++) { var contact = filteredContacts[i]; html += '<tr>'; html += '<td>' + contact.name + '</td>'; html += '<td>' + contact.phone + '</td>'; html += '<td>' + contact.email + '</td>'; html += '<td><button class="edit-btn">编辑</button><button class="delete-btn">删除</button></td>'; html += '</tr>'; } contactList.innerHTML = html; // 绑定编辑按钮点击事件 var editBtnList = document.querySelectorAll('.edit-btn'); for (var i = 0; i < editBtnList.length; i++) { editBtnList[i].onclick = function() { var tr = this.parentNode.parentNode; var name = tr.children[0].innerText; var phone = tr.children[1].innerText; var email = tr.children[2].innerText; showModal(name, phone, email); }; } // 绑定删除按钮点击事件 var deleteBtnList = document.querySelectorAll('.delete-btn'); for (var i = 0; i < deleteBtnList.length; i++) { deleteBtnList[i].onclick = function() { var tr = this.parentNode.parentNode; var name = tr.children[0].innerText; var phone = tr.children[1].innerText; var index = findContactIndex(name, phone); if (index !== -1 && confirm('确定要删除该联系人吗?')) { contacts.splice(index, 1); saveContacts(); renderContacts(); // 重新渲染联系人数据 } }; } } // 显示弹出层 function showModal(name, phone, email) { var modal = document.getElementById('modal'); var title = name ? '编辑联系人' : '添加联系人'; var saveBtn = document.getElementById('save-btn'); document.querySelector('.modal-content h2').innerText = title; document.getElementById('name').value = name || ''; document.getElementById('phone').value = phone || ''; document.getElementById('email').value = email || ''; saveBtn.innerText = name ? '保存' : '添加'; modal.style.display = 'block'; } // 隐藏弹出层 function hideModal() { var modal = document.getElementById('modal'); modal.style.display = 'none'; } // 查找联系人索引 function findContactIndex(name, phone) { for (var i = 0; i < contacts.length; i++) { if (contacts[i].name === name && contacts[i].phone === phone) { return i; } } return -1; } // 保存联系人数据到本地存储 function saveContacts() { localStorage.setItem('contacts', JSON.stringify(contacts)); } // 加载联系人数据 var savedContacts = localStorage.getItem('contacts'); if (savedContacts) { contacts = JSON.parse(savedContacts); } renderContacts(); }; ``` 以上就是添加了搜索框和分页功能的通讯录代码。使用正则表达式进行匹配也可以在过滤函数中实现,但这样会影响性能,因此建议使用字符串的indexOf方法进行匹配。

相关推荐

最新推荐

recommend-type

WX小程序源码运动健身

WX小程序源码运动健身提取方式是百度网盘分享地址
recommend-type

sja1314.x86_64.tar.gz

SQLyong 各个版本,免费下载 SQLyog是业界著名的Webyog公司出品的一款简洁高效、功能强大的图形化MySQL数据库管理工具。使用SQLyog可以快速直观地让您从世界的任何角落通过网络来维护远端的MySQL数据库。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

用Spring boot和vue写一个登录注册界面

好的,这是一个比较常见的技术问题,我可以为您提供一些参考资料和思路。首先,您可以使用Spring Boot作为后端框架来处理用户认证和注册的逻辑,比如使用Spring Security实现用户登录认证。同时,您还需要设计相应的数据模型和数据库表结构来存储用户信息。在前端方面,您可以使用Vue.js作为框架来构建登录注册页面,使用Axios来发起API请求并和后端进行交互。当然,在实现过程中,还需要考虑一些具体细节,比如数据校验、安全性和用户体验等方面。希望这些信息能够帮助到您。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

MATLAB柱状图在数据分析中的作用:从可视化到洞察

![MATLAB柱状图在数据分析中的作用:从可视化到洞察](https://img-blog.csdnimg.cn/img_convert/1a36558cefc0339f7836cca7680c0aef.png) # 1. MATLAB柱状图概述** 柱状图是一种广泛用于数据可视化的图表类型,它使用垂直条形来表示数据中不同类别或组别的值。在MATLAB中,柱状图通过`bar`函数创建,该函数接受数据向量或矩阵作为输入,并生成相应的高度条形。 柱状图的优点在于其简单性和易于理解性。它们可以快速有效地传达数据分布和组别之间的比较。此外,MATLAB提供了广泛的定制选项,允许用户调整条形颜色、
recommend-type

命名ACL和拓展ACL标准ACL的具体区别

命名ACL和标准ACL的主要区别在于匹配条件和作用范围。命名ACL可以基于协议、端口和其他条件进行匹配,并可以应用到接口、VLAN和其他范围。而标准ACL只能基于源地址进行匹配,并只能应用到接口。拓展ACL则可以基于源地址、目的地址、协议、端口和其他条件进行匹配,并可以应用到接口、VLAN和其他范围。