Skip to content

动态搜索框和具体搜索逻辑

搜索框实现:

#html

html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>动态搜索栏</title>
</head>
<body>
    <div class="searchBar" id="searchBar">
        <input type="text" class="input" id='input'>
        <a href="#" class="img" id='img'>
            <img src="搜索框.png" style="width: 30px;">
        </a>
        <div class="results" id="results"></div>
    </div>
</body>
</html>

#css

css
.searchBar{
    position:absolute;
    transform: translate(-50%,-50%);/*将元素移动到父元素的中心*/
    background-color:#000000;
    height:40px;
    border-radius:40px;
    padding:10px;
    width: 40px;
    top: 50%;
    left: 50%;
}
.input{
    border:none;
    background:none;
    outline:none;
    
    width:0;
    padding:0;
    line-height:40px;
    font-size:20px;
    color:wheat;
}
.img{
    color:red;
    float:right;/*把控不好位置,最后发现一个float就搞定了*/
    border-radius: 50%;
    background-color: #000000;
    display: flex;
    justify-content: center;
    align-items: center;
    transition: 0.4s;
    width: 40px;
    height: 40px;
}
.addfocus{
    width: 200px;
    padding: 0 6px;
    transition: 1s;
}
.addfocusInput{/*解决了图片换行的问题*/
    width: 140px;
    padding: 0 6px;
    transition: 1s;
}
.nofocus{/*保证与初始状态一致*/
    width: 40px;
    padding: 10px;
    transition: 1s;
}
.nofocusInput{
    width: 0;
    padding: 0;
    transition: 1s;
}
.results {
    margin-top: 20px;
    color: #000000;
}

#js.1

javascript
const input = document.querySelector('.input')
const search = document.querySelector('.searchBar')
const img = document.querySelector('.img')
img.addEventListener('mouseenter',()=>{           
	input.classList.add('addfocusInput');
	search.classList.add('addfocus');
	input.classList.remove('nofocusInput');
	search.classList.remove('nofocus');
})
img.addEventListener('click',()=>{
	input.classList.add('nofocusInput');
	search.classList.add('nofocus');
	input.classList.remove('addfocusInput');
	search.classList.remove('addfocus');
})

​ 由于初始状态只能看见img,故采用这种形式。

主要实现逻辑为:鼠标移动到搜索图标内,搜索框展开,再次点击搜索图标,搜索框合上。

​ 使用hover的话,实现逻辑就更加清晰,而且根本不需要js部分,代码看上去也更加简洁。然而我在实际测试时,发现中文输入会导致丢失hover属性,导致搜索栏意外折叠,虽然能输入,但是观感很不好。

​ 我测试时使用微软拼音输入法。由于我没有测试更多的输入法,感兴趣的可以测试一下使用hover来代替JavaScript事件监听时,自己输入中文时具体是什么效果。如果没有出现bug当然是最好的。

​ 但我仍然建议使用js监听,因为大型项目或者个人网站是要给别人看的,当然要选择普适性最好、照顾大部分用户体验的方案。

​ 在使用中文输入法的时候,尤其是使用拼音输入时会出现这个情况。我的情况是输入法界面干扰:拼音输入时,汉字选择框虽然是贴在文字下方的,但是其实际体积要大一点——约为半个字母的高度,这时鼠标如果在这个范围里,模块就会因为覆盖而失去hover。

简单搜索逻辑:

#js.2

js
document.getElementById('searchBar').addEventListener('mouseenter', function() {
    const inputtxt = document.getElementById('input').value;
    const resultsDiv = document.getElementById('results');
    resultsDiv.innerHTML = '';
    const data = ['每日一题','学习笔记','问题解决'];//数据源

if(inputtxt){//否则会出现很可怕的后果,不信可以删去这个if!
    const results = data.filter(item => item.includes(inputtxt));
    if (results.length > 0) {
        results.forEach(item => {
            const p = document.createElement('p');
            p.textContent = item;
            resultsDiv.appendChild(p);
        });
    } else {
        resultsDiv.textContent = '没有结果';
    }
}
});

​ 实现逻辑:鼠标进入时清空result里的内容,通过检查inputtxt是否有值来判断要不要显示result。如果有input,则过滤数据,并判断result长度,如果大于0则显示,等于0则显示“没有结果”。

实际应用时请加上超链接!