CSS实现隐藏搜索框功能(动画正反向序列)


Posted in HTML / CSS onJuly 21, 2021

顶部菜单栏中放置搜索框是一个常见的场景,但如果搜索功能使用的不那么频繁,同时菜单栏中内容本来就比较拥挤,再放一个完整的搜索框在那就显得不那么美观。因此也有一个挺常见的做法是,只放一个搜索图标,需要时再显示整个搜索框,如下图所示:

CSS实现隐藏搜索框功能(动画正反向序列)

实现思路

起始状态时搜索框没有显示,鼠标移入后从右侧滑入,因此不能使用搜索框自身的 hidden 或透明度属性,需要使用父元素的 overflow: hidden 将其隐藏,并把输入框移动到父元素的显示范围以外,需要时再移动回来。

CSS 中有 transitionanimation 两种方式来实现动画效果,由于这里只有搜索框位置移动、图标透明度改变两个简单效果,用 transition 就足够了。

这两个动画本身实现很简单,但有一些小细节:

  • 两个动画不是同时进行,而是有先后,需要使用 transition-delay 实现两个效果的序列
  • 显示、隐藏两个过程好像完全一样,但仔细看会发现动画的顺序有不同:显示时图标先消失、搜索框后移入;隐藏时搜索框先移出、图标后出现。因此需要单独设置。

代码实现

完整的样式表附在文末,不想看具体思路的可以跳过本节直接去复制。

基础样式

先普普通通的写一下基础样式,这里用的图标是 material design icon

<div class="search">
  <input class="bar" placeholder="请输入内容" />
  <span class="material-icons icon">search</span>
</div>
.icon {
  width: 24px;
  height: 24px;
}

.bar {
  height: 26px;
  width: 200px;
  padding: 1px 9px;
  border: #fff 1px solid;
  border-radius: 3px;
  background-color: transparent;
  color: #fff;
}
::placeholder {
  color: #ccc;	/* 修改input中placeholder的颜色*/
}

.search {
  height: 30px;
  display: flex;
  align-items: center;
}

CSS实现隐藏搜索框功能(动画正反向序列)

隐藏搜索框

移动搜索框位置的方法有很多,比如可以使用 absolute 或者 relative 定位。

  • 如果将搜索框设为 absolute 定位(position: absolute),搜索框会从输入流中抽出,通俗的说就是父元素在渲染时会当它不存在,这样父元素的宽度、搜索图标的位置都需要额外指定。
  • 相比之下,relative 定位(position: relative)只是简单地移动元素的位置,对其他元素没有任何影响,在此处使用更加简单一些。

还有一种更直接的方法:transform 属性。通过这个属性,可以实现对元素的平移、旋转、缩放等变形操作,同时对其他元素不产生影响。在这里使用的 translateX() 属性就是将元素沿X轴(横向)平移指定距离。单从平移来说,各方面效果和使用 relative 定位没有明显区别。

PS: transition, transform, translate 这几个词不会只有我一直分不清吧555

.search {
  overflow: hidden;
}
.bar {
  transform: translateX(224px);
  /* 
    上一句也可以替换为下面两句,效果相同
    position: relative;
    left: 224px;
  */
}

动画序列

动画通过 transition 属性实现。transition 是 transition-property,transition-duration,transition-timing-function 和 transition-delay 四个属性的简写(类比border: red 1px solid;),四个属性分别指定了过渡动画的属性、持续时间、时间曲线、延迟时间。

  • 属性即要应用过渡动画的属性
  • 时间曲线是动画的速度变化,比如开始慢、中间快、结束慢,可以比匀速运动更好看更平滑
  • 延迟时间即达到触发条件后延迟一段时间再触发动画,可以用来实现多个动画有先后顺序地执行

transition 属性本质上是小学电脑课学过的 flash 补间动画,指定一个属性的起止两个状态,自动补全中间的过渡动画。元素本来的属性是起始状态,鼠标移上后的动画,自然元素的 :hover 伪类属性是终止状态。

.icon {
  opacity: 1;
  transition: opacity 0.3s ease; /* delay 属性默认值为0 */
}
.search:hover .icon {
  opacity: 0;
}

.bar {
  transform: translateX(224px);
  transition: transform 0.3s ease-in-out 0.3s;
}
.search:hover .bar {
  transform: translateX(24px);
}

逆向序列

这样能够基本实现想要的动画效果了,但是在隐藏搜索框的时候也是图标先出现,搜索框后滑出,不够美观。解决方案也很简单,为 hover 伪类单独设置不同的 delay 属性即可。

有一点需要注意一下,hover 伪类中的 delay 属性对应的是鼠标移上时的延迟,元素本身属性中的 delay 对应的是鼠标移出时恢复动画的延迟。可能和第一反应不太一样(不过仔细想想倒也挺合理的),别写反了。

.icon {
  transition: opacity 0.3s ease 0.3s;
}

.search:hover .icon {
  transition-delay: 0s;
}

.bar {
  transition: transform 0.3s ease-in-out 0s;
}

.search:hover .bar {
  transition-delay: 0.3s;
}

触发区域

其实但就想要的动画效果,以上几步就足够了。但是这样还有一个小问题:动画是通过父元素 .search 的 hover 状态触发的,因此如果鼠标移入搜索图标左侧本来应该是搜索框的位置(但是现在什么也没有,被隐藏了),还是会触发显示搜索框动画。这其实也不是不能接受。

如果想只在鼠标悬停在图标时才触发动画,只要将触发条件改成 .icon 的悬停状态即可。不过由于 CSS 中只有后继元素选择器而没有前驱元素选择器(因为 DOM 渲染 CSS 的原则是不能出现回溯),需要调整一下 HTML 中图标和搜索框的顺序。

<div class="search">
  <span class="material-icons icon">search</span>
  <input class="bar" placeholder="请输入内容" />
</div>

然后修改相应的样式和选择器即可。

.icon:hover {
  opacity: 0;
  transition-delay: 0s;
}

.icon:hover + .bar {	/* + 紧邻兄弟选择器 */
  transform: translateX(24px);
  transition-delay: 0.3s;
}

.search {
  display: flex;
  flex-direction: row-reverse;	/* 让搜索框还在图标左边 */
}

附录:完整样式表

<div class="search">
  <span class="material-icons icon">search</span>
  <input class="bar" placeholder="请输入内容" />
</div>
.icon {
  width: 24px;
  height: 24px;
  opacity: 1;
  transition: opacity 0.3s ease 0.3s;
}

.icon:hover {
  opacity: 0;
  transition-delay: 0s;
}

.bar {
  height: 26px;
  width: 180px;
  padding: 1px 9px;
  border: #fff 1px solid;
  border-radius: 3px;
  background-color: transparent;
  color: #fff;
  transform: translateX(224px);
  transition: transform 0.3s ease-in-out 0s;
}

.icon:hover + .bar {
  transform: translateX(24px);
  transition-delay: 0.3s;
}

::placeholder {
  color: #ccc;
}

.search {
  height: 30px;
  display: flex;
  flex-direction: row-reverse;
  align-items: center;
  overflow: hidden;
}

到此这篇关于CSS实现隐藏搜索框功能(动画正反向序列)的文章就介绍到这了,更多相关css动画正反向序列内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
HTML / CSS 相关文章推荐
纯css3无js实现的Android Logo(有简单动画)
Jan 21 HTML / CSS
用CSS3绘制三角形的简单方法
Jul 17 HTML / CSS
CSS3 2D模拟实现摩天轮旋转效果
Nov 16 HTML / CSS
浅谈css3中calc在less编译时被计算的解决办法
Dec 04 HTML / CSS
CSS3 box-shadow属性实例详解
Jun 19 HTML / CSS
CSS3 实现雷达扫描图的示例代码
Sep 21 HTML / CSS
HTML5离线缓存Manifest是什么
Mar 09 HTML / CSS
高清屏中使用Canvas绘图出现模糊的问题及解决方法
Jun 03 HTML / CSS
Canvas波浪花环的示例代码
Aug 21 HTML / CSS
关于flex 上下文中自动 margin的问题(完整例子)
May 20 HTML / CSS
html+css实现文字折叠特效实例
Jun 02 HTML / CSS
HTML5 新增内容和 API详解
Nov 17 HTML / CSS
详解CSS3.0(Cascading Style Sheet) 层叠级联样式表
html5实现点击弹出图片功能
Jul 16 #HTML / CSS
纯CSS3实现div按照顺序出入效果
CSS3中Animation实现简单的手指点击动画的示例
详解CSS中的特指度和层叠问题
Jul 15 #HTML / CSS
html form表单基础入门案例讲解
html+css实现环绕倒影加载特效
You might like
DIY实用性框形天线
2021/03/02 无线电
PHP扩展框架之Yaf框架的安装与使用
2016/05/18 PHP
详解phpstorm2020最新破解方法
2020/09/17 PHP
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
jQuery实现验证年龄简单思路
2016/02/24 Javascript
jQuery实现的瀑布流加载效果示例
2016/09/13 Javascript
JS实现“隐藏与显示”功能(多种方法)
2016/11/24 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
Vue学习之路之登录注册实例代码
2017/07/06 Javascript
jQuery实现菜单栏导航效果
2017/08/15 jQuery
基于javascript中的typeof和类型判断(详解)
2017/10/27 Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
2018/05/28 Javascript
React SSR样式及SEO的实践
2018/10/22 Javascript
js中值引用和地址引用实例分析
2019/06/21 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
关于Layui Table隐藏列问题
2019/09/16 Javascript
微信小程序整个页面的自动适应布局的实现
2020/07/12 Javascript
Postman如何实现参数化执行及断言处理
2020/07/28 Javascript
Python 逐行分割大txt文件的方法
2017/10/10 Python
分析python切片原理和方法
2017/12/19 Python
Python调用C语言的方法【基于ctypes模块】
2018/01/22 Python
Python安装whl文件过程图解
2020/02/18 Python
Python3+selenium实现cookie免密登录的示例代码
2020/03/18 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
2020/04/21 Python
Python创建自己的加密货币的示例
2021/03/01 Python
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
瑜伽服装品牌:露露柠檬(lululemon athletica)
2017/06/04 全球购物
食品安全宣传标语
2014/06/07 职场文书
党员自评材料范文
2014/12/17 职场文书
大专护理专业自荐信
2015/03/25 职场文书
酒店开业主持词
2015/07/02 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书
浅谈Python类的单继承相关知识
2021/05/12 Python