es6实现仿百度搜索建议
标签:
vue
大家好!很久没更新教程了,今天给大家出一期 es6的案例,使用 es6 语法 实现 百度搜索框建议的小案例
效果如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>百度风格搜索框</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css"> <style> * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background: linear-gradient(135deg, #1a2a6c, #b21f1f, #fdbb2d); min-height: 100vh; display: flex; justify-content: center; align-items: center; padding: 20px; } .container { width: 100%; max-width: 800px; text-align: center; } .logo { margin-bottom: 40px; } .logo h1 { font-size: 5rem; color: #fff; text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); letter-spacing: -5px; } .logo h1 span:nth-child(1) { color: #4285f4; } .logo h1 span:nth-child(2) { color: #ea4335; } .logo h1 span:nth-child(3) { color: #fbbc05; } .logo h1 span:nth-child(4) { color: #4285f4; } .logo h1 span:nth-child(5) { color: #34a853; } .logo h1 span:nth-child(6) { color: #ea4335; } .search-container { position: relative; width: 90%; max-width: 600px; margin: 0 auto 40px; } .search-box { display: flex; height: 60px; border-radius: 30px; overflow: hidden; box-shadow: 0 5px 20px rgba(0, 0, 0, 0.2); } #val { flex: 1; padding: 0 25px; font-size: 1.2rem; border: none; outline: none; background: rgba(255, 255, 255, 0.95); } #val::placeholder { color: #999; } #sub { width: 120px; background: #4285f4; color: white; border: none; font-size: 1.1rem; font-weight: 500; cursor: pointer; transition: background 0.3s; } #sub:hover { background: #3367d6; } .show { width: 100%; min-height: 100px; height: auto; background: rgba(255, 255, 255, 0.95); border-radius: 20px; margin-top: 10px; padding: 15px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); display: none; text-align: left; overflow: hidden; } .show h3 { color: #4285f4; margin-bottom: 15px; padding-bottom: 10px; border-bottom: 1px solid #eee; } .suggestion-list { list-style: none; } .suggestion-item { padding: 12px 15px; border-radius: 8px; margin-bottom: 8px; cursor: pointer; display: flex; align-items: center; transition: all 0.2s; } .suggestion-item:hover { background: #f1f5ff; } .suggestion-item i { margin-right: 12px; color: #4285f4; } .suggestion-text { flex: 1; display: flex; justify-content: space-between; } .highlight { color: #ea4335; font-weight: 500; } .popular-searches { margin-top: 30px; color: #fff; text-align: center; } .popular-searches h2 { margin-bottom: 20px; font-weight: 500; } .keywords { display: flex; justify-content: center; flex-wrap: wrap; gap: 15px; } .keyword { background: rgba(255, 255, 255, 0.2); color: #fff; padding: 8px 20px; border-radius: 20px; cursor: pointer; transition: all 0.3s; } .keyword:hover { background: rgba(255, 255, 255, 0.3); transform: translateY(-3px); } @media (max-width: 600px) { .logo h1 { font-size: 3.5rem; } .search-box { height: 50px; } #val { padding: 0 15px; font-size: 1rem; } #sub { width: 100px; font-size: 1rem; } } </style> </head> <body> <div class="container"> <div class="logo"> <h1> <span>百</span> <span>度</span> <span>一</span> <span>下</span> </h1> </div> <div class="search-container"> <div class="search-box"> <input type="text" id="val" placeholder="请输入课程关键词"> <input type="submit" id="sub" value="搜索"> </div> <div class="show" id="show"> <h3>搜索建议</h3> <ul class="suggestion-list" id="suggestion-list"> <!-- 搜索建议将通过JavaScript动态添加 --> </ul> </div> </div> <div class="popular-searches"> <h2>热门课程搜索</h2> <div class="keywords"> <div class="keyword">前端开发</div> <div class="keyword">JavaScript</div> <div class="keyword">Python编程</div> <div class="keyword">UI设计</div> <div class="keyword">数据分析</div> <div class="keyword">人工智能</div> </div> </div> </div> <script> // 获取DOM元素 const input = document.querySelector('#val'); const show = document.querySelector('#show'); const suggestionList = document.querySelector('#suggestion-list'); const submitBtn = document.querySelector('#sub'); const keywords = document.querySelectorAll('.keyword'); // 课程数据库(模拟) const courses = [ "HTML5基础教程", "CSS3高级技巧", "JavaScript入门到精通", "React框架实战", "Vue.js开发指南", "Node.js后端开发", "Python数据分析", "Java编程基础", "UI设计实战课程", "移动应用开发", "数据库原理与SQL", "Web安全技术", "人工智能入门", "机器学习实战", "数据结构与算法", "计算机网络基础", "向军前端开发教程" ]; // 输入框键盘事件 input.addEventListener('keyup', function () { const searchItem = this.value.trim(); if (searchItem.length > 0) { updateSuggestions(searchItem); show.style.display = "block"; } else { show.style.display = 'none'; } }); // 提交按钮事件 submitBtn.addEventListener('click', function () { const searchTerm = input.value.trim(); if (searchTerm.length > 0) { alert('正在搜索..'); } }); // 热门关键词点击事件 keywords.forEach(keyword => { keyword.addEventListener('click', function () { input.value = this.textContent; input.dispatchEvent(new Event('keyup')); input.focus(); }); }) function updateSuggestions(searchItem) { // 清空当前建议 suggestionList.innerHTML = ""; // 过滤匹配的课程 const filterCourses = courses.filter(course => course.toLowerCase().includes(searchItem.toLowerCase()) ); // 显示搜索结果数量限制 const maxSuggestions = 5; const displayCourses = filterCourses.slice(0, maxSuggestions); if (displayCourses.length === 0) { // 没有匹配结果 const item = document.createElement("li"); item.className = "suggestion-item"; item.innerHTML = `<i class="fa fa-search"></i><span>没有找到匹配的课程</span>`; suggestionList.append(item); } else { displayCourses.forEach(course => { const item = document.createElement("li"); item.className = "suggestion-item"; // 高亮匹配部分 const index = course.toLowerCase().indexOf(searchItem.toLowerCase()); if (index >= 0) { const before = course.substring(0, index); const match = course.substring(index, index + searchItem.length); const after = course.substring(index + searchItem.length); item.innerHTML = ` <i class="fas fa-graduation-cap"></i> <div class="suggestion-text"> <div>${before}<span class="highlight">${match}</span>${after}</div> </div> `; } else { item.innerHTML = ` <i class="fas fa-graduation-cap"></i> <div class="suggestion-text"> <div>${course}</div> </div> `; } // 点击建议项填入搜索框 item.addEventListener('click', function () { input.value = course; show.style.display = 'none'; }); suggestionList.appendChild(item); }) } } show.style.display = 'none'; </script> </body> </html>