先让我们来看看实现的效果
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.
标签 | 作用 |
---|---|
placeholder | placeholder 属性提供可描述输入字段预期值的提示信息(hint)。该提示会在输入字段为空时显示,并会在字段获得焦点时消失。 |
addEventListener | addEventListener() 方法用于向指定元素添加事件句柄。 |
mouseover | mouseover事件因其具有冒泡的性质,在子元素内移动的时候,频繁被触发,如果我们不希望如此,可以使用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让变化变得自然,肉眼可见。
谢谢大家看我的博客!