[100天挑战100个前端效果]第十八天---动态搜索框

先让我们来看看实现的效果

在这里插入图片描述

html代码

<!DOCTYPE html>
<html lang="zh-Hans">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>第十八天</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>
    <!-- 搜索框最外边框,动画变化的边框,从圆形变成长条形圆角 -->
    <div class="search-box">
        <!-- 左侧搜索框 -->
        <div class="key">
            <input type="text" placeholder="请输入搜索关键词...">
        </div>
        <!-- 右侧搜索按钮 -->
        <div class="bt">
            <a href="" href="#">
                <i class="iconfont icon-sousuo"></i>
            </a>
        </div>
    </div>
    <script>
        // 搜索框box元素
        var box = document.querySelector('.search-box');

        // 增加监听mouseover事件
        box.addEventListener('mouseover', () => {
            // 增加active样式
            box.classList.add('active');
        });

        // 解决点击搜索框会触发 body.click事件问题
        box.addEventListener('click',(e)=>{
            // 防止事件冒泡
            e.stopPropagation();
        });

        document.body.addEventListener('click', () => {
            // 移除active样式
            box.classList.remove('active');
        });

    </script>
</body>

</html>

css代码

:root {
    --background-color: #2c3e50;
    --border-color: #34495e;
    --text-color: #7591AD;
    --color1: #EC3E27;
    --color2: #fd79a8;
    --color3: #0984e3;
    --color4: #00b894;
    --color5: #fdcb6e;
    --color6: #e056fd;
    --color7: #F97F51;
    --color8: #BDC581;
}

* {
    margin: 0;
    padding: 0;
}

html {
    font-size: 14px;
}

body {
    width: 100vw;
    height: 100vh;
    background-color: var(--background-color);
    display: flex;
    justify-content: center;
    align-items: center;
    font-family: 'Montserrat', sans-serif, Arial, 'Microsoft Yahei';
}

/* 原教程中使用的是第三方库 */

/* 这里使用iconfont.cn的图标导出 */

@font-face {
    font-family: "iconfont";
    src: url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAKsAAsAAAAABnAAAAJeAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCCcAp8gRgBNgIkAwgLBgAEIAWEbQcwG74FEdWTB2Q/DuyY8FcY0Z8Dxdjg34Pn37W3+5LMb0qoAFARg6qrQ14wdv8cv+DJEUhAt3rM2ozizqgIRZOMB/9VUzbQw+RyXwLAiMNp87wLZP55l8sYg8aaNKmL4jiQAhxrUWRFEnnD2AUu4TgECCKRfKSppWsIi8EaJ4Bsra/OY3NeDIYlLIKvZqlBbnGw6ky9hJvw+/K7VCwoHI1V0rfSvETdt0I7Re96u0z5BHwgoNUOoIF8wIAM1UZ70Aija4KihlTYV6HAt8zzfAuyVyPC/jorPwSAeCi6J7EruVVuBYCB7pAK1I66DXRQSMjOw92YmAfncSPv7XfvRt+8GX79eujt25FIkBVAPryltjj3cfLjfy+Snz971t7+ol0duO6BOlR+VwU013/AJ6kbh9r99cv15Bq2aDf9HeoA8HYNehcBBCrCyh7Nhlf9t8EGgE8hozuU9LOD3b9N4D+JezYYXWqZlVHFtUlFKvr8ZUEEAR7YGcXXsbrYm0oKlthbsweQkEJjSScaaj4cgimHD0stgsijdXUw0WyjERMI5HIEIETghyKMZ9BE8IpoqF/gEMdf+IgQjSBGJHrLYDJFW1yjojOM1P9pGeRkx2ouKrxhCnunWWnIeEH9EqAyK4qJFid0jhn+M1VmTKxyUANOw74LXSorBstms6vOc657UzbIEbmoUdEZRur/tAxyst/eXOnzN0xh77Slrsb7gvqldyqzogexVZ296u7lFf+ZKjMmVjmoAYOw70JX/aAVg2XziPBV53Yz7qvK1tccX7cDCIosvYrtfmnk8xJ8kCgCAAAA') format('woff2');
}

.iconfont {
    font-family: "iconfont" !important;
    font-size: 20px;
    font-style: normal;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

.icon-sousuo:before {
    content: "\e62e";
}

.search-box {
    width: 60px;
    height: 60px;
    background-color: var(--border-color);
    border-radius: 60px;
    /* 垂直居中,左右居左 */
    display: flex;
    justify-content: flex-end;
    align-items: center;
    transition: 0.5s;
}

.key {
    /* flex布局中本区域的缩放比例为1份 */
    flex-shrink: 1;
    flex-grow: 1;
    /* background-color: violet; */
}

.key input {
    width: calc(100% - 40px);
    height: 40px;
    padding: 0 20px;
    font-size: 18px;
    color: #fff;
    /* 边框背景为空 */
    background: none;
    border: none;
    outline: none;
}

.key input:focus {
    border: none;
    outline: none;
}

.key input::-webkit-input-placeholder {
    /* 提示文字的样式 */
    color: #999;
}

.bt {
    /* flex布局中本区域的缩放比例为0份,不缩放,保持原有大小 */
    flex-shrink: 0;
    flex-grow: 0;
    width: 60px;
    height: 60px;
    border-radius: 100%;
    /* 搜索图标居中 */
    display: flex;
    justify-content: center;
    align-items: center;
}

.bt a {
    padding: 10px;
    border-radius: 100%;
    text-decoration: none;
    color: #fff;
    /* background-color: violet; */
    transition: 0.5s;
}

.search-box.active {
    width: 300px;
}

.search-box.active .bt a {
    background-color: var(--background-color);
}

今日份知识总结

1.如何获得iconfont图标,请看下面这篇博客
不放弃每一个变美的机会!
2.

标签作用
placeholderplaceholder 属性提供可描述输入字段预期值的提示信息(hint)。该提示会在输入字段为空时显示,并会在字段获得焦点时消失。
addEventListeneraddEventListener() 方法用于向指定元素添加事件句柄。
mouseovermouseover事件因其具有冒泡的性质,在子元素内移动的时候,频繁被触发,如果我们不希望如此,可以使用mouseenter事件代替之,但是早期只有ie浏览器支持该事件
classList返回元素的类名classList 属性是只读的,但你可以使用 add() 和 remove() 方法修改它。
stopPropagation终止事件在传播过程的捕获、目标处理或起泡阶段进一步传播。
flex-end右对齐
flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。
flex-grow定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。
calc以混合计算绝对单元(比如百分比与视口单元)与相对单元(比如像素)。
:focus:focus 选择器用于选取获得焦点的元素。

设计思路:
首先,我们看看html,就很简单,search-box里面一个key关键词,一个bt(iconfont图标看前面的博客就会设置了)
然后,是js的代码,我们找到box,添加响应,通过改变classlist来改变搜索款的样式,当然这里还有一个body.click的bug,我们用到了stopPropagation。

然后是重头戏,css的代码:
其实敲出来一个大概的布局,不难但是应该要耗不少的时间。
我们用到了border outline none让左边的搜索框和背景融为一体。
改变box的width来实现搜索款的动态变化,记得协商transition让变化变得自然,肉眼可见。

谢谢大家看我的博客!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值