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转换功能transform主要属性值分析及实现分享
May 06 HTML / CSS
css3 按钮样式简单可扩展创建
Mar 18 HTML / CSS
css3实现一款模仿iphone样式的注册表单
Mar 20 HTML / CSS
css3 中translate和transition的使用方法
Mar 26 HTML / CSS
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
Jan 30 HTML / CSS
深入解析HTML5 Canvas控制图形矩阵变换的方法
Mar 24 HTML / CSS
Html5元素及基本语法详解
Aug 02 HTML / CSS
canvas绘图按照contain或者cover方式适配并居中显示
Feb 18 HTML / CSS
HTML5实现无刷新修改URL的方法
Nov 14 HTML / CSS
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
May 26 HTML / CSS
详解淘宝H5 sign加密算法
Aug 25 HTML / CSS
萌新的HTML5 入门指南
Nov 06 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
创建配置文件 用PHP写出自己的BLOG系统 2
2010/04/12 PHP
PHP里的中文变量说明
2011/07/23 PHP
对PHP PDO的一些认识小结
2015/01/23 PHP
jQuery创建自己的插件(自定义插件)的方法
2010/06/10 Javascript
jQuery EasyUI API 中文文档 - Draggable 可拖拽
2011/09/29 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
js实现背景图片感应鼠标变化的方法
2015/02/28 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
Angularjs中使用轮播图指令swiper
2017/05/30 Javascript
webpack3之loader全解析
2017/10/26 Javascript
vue组件与复用详解
2018/04/08 Javascript
小程序清理本地缓存的方法
2018/08/17 Javascript
Vue多组件仓库开发与发布详解
2019/02/28 Javascript
基于webpack4+vue-cli3项目实现换肤功能
2019/07/17 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
javascript实现多边形碰撞检测
2020/10/24 Javascript
[56:00]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第一局
2016/03/05 DOTA
Python中字典的基本知识初步介绍
2015/05/21 Python
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
2019/05/13 Python
wxPython实现列表增删改查功能
2019/11/19 Python
python numpy数组复制使用实例解析
2020/01/10 Python
Python实现一个优先级队列的方法
2020/07/31 Python
浅谈关于html5中图片抛物线运动的一些心得
2018/01/09 HTML / CSS
土木工程应届生求职信
2013/10/31 职场文书
工程测量与监理专业应届生求职信
2013/11/27 职场文书
酒店经理职责
2014/01/30 职场文书
专题组织生活会方案
2014/06/15 职场文书
王兆力在市委党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
质监局领导班子践行群众路线整改方案
2014/10/26 职场文书
小学秋季运动会通讯稿
2015/11/25 职场文书
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android
Win10本地连接不见了怎么恢复? win10系统电脑本地连接不见了解决方法
2023/01/09 数码科技