css实现元素hover状态元素底部上移半透明浮层

起因:
偶尔翻了个网站,看到里面的小动效简单但又能使页面交互变得生动,便f12看了下动画实现代码。

图一



最终实现效果:

图二



具体实现代码:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <style type="text/css">
*{
    padding: 0;
    margin: 0
}
.content{
    width: 100%;
    font-size: 0; /*消除li inline-block 为行内元素后的默认间距*/
    list-style: none;
}
.content li {
    display: inline-block;
    width: 33.333%;
    vertical-align: top;
}
.box{
    height: auto;
    display: block;
    position: relative; /*关键点: 设置绝对定位*/
    overflow: hidden;
    text-decoration: none;
    transition: all 0.25s; 
    box-sizing: border-box; /*使盒子边距包含在盒子高度上*/
    padding-top: 40px; /*上下总共80边距*/
    padding-bottom: 40px;
}
.box .info{
   width: 70%;
   height: 123px;
   margin: 0 auto;
   transition: all 0.25s;

   color: #fff;
   font-size: 30px;
   text-align: center;
}
.box .text{
    display: block;
    position: absolute; /*关键点: 绝对定位于.box*/
    width: 100%;
    left: 0;
    right: 0;
    bottom: 0;
    height: auto;
    padding: 20px 0;
    background-color: rgba(255, 255, 255, 0.4);
    transition: all 0.25s;
    transform: translateY(100%);

    color: #fff;
    font-size: 17px;
    text-align: center;
    font-family: Arial;
}

.box:hover{
    padding-top: 10px; /*上下总共80边距*/
    padding-bottom: 70px;
}
.box:hover .text {
    transform: translateY(0%);
    transition: all 0.3s;
}

</style>

</head>
<body style="background: #fcc">
<ul class="content">
    <li class="content" style="background: #38beac">
     <a href="" class="box">
         <div class="info">文章</div>
         <span class="text">here you can check all what i had writed in public</span>
     </a>   
    </li>
    <li class="content" style="background: #000">
     <a href="" class="box">
         <div class="info">动态</div>
         <span class="text">you can know more about me in here</span>
     </a>   
    </li>
    <li class="content" style="background: #ff5a5f">
     <a href="" class="box">
         <div class="info">热门文章</div>
         <span class="text">the articals i gat likenum heighter</span>
     </a>   
    </li>
</ul>
</body>
</html>



解析:

  1. 关键点:
    设 .box 为绝对定位,而浮层 .text 为他的绝对定位,定位在 .box 盒子的底部。

  2. 动效1 — 浮层出现
    先来看下图,把 .box 盒子的 overflow:hidden 去掉之后的效果

图三

如果把 “浮层出现” 说出 “浮层上移” 有没有好理解些。

即浮层(.text) 原本就是有的,只是他的父级设置了超过限定高度的内容隐藏不见,然后 hover 时让浮层上移到父级可见区域内。这就做到了浮层的出现/隐藏。

看下浮层(.text 的样式)

.box .text{
    display: block;
    width: 100%;
    left: 0;
    right: 0;
    bottom: 0;
    height: auto;
    padding: 20px 0;
    transform: translateY(100%);
}

注意点:

.box .text{
    transform: translateY(100%);
}
.box:hover .text {
    transform: translateY(0%);
}

默认就让浮层 下移 了自身高度,hover 时再让下移值为 0 。而其父级的 overflow:hidden,浮层下移后超出了父级元素限定高度,自然是看不见了,下移值为 0 时,浮层出现,就是我们看到的 “上移” 效果

图二中 浮层的高度是不同的,如何做到刚好上移自身的全部高度呢?
来看 浮层设置的样式

.text 设为块级元素后,宽度为 100%,高度设为auto或者不不设置(即默认由内容撑开)。我们所看到的浮层高度实际是由 里面的文字和 padding: 20px 0 撑开的。
那么 hover 上移时,上移自身高度的100%是不是就可以了。
其实给 浮层 设置一个固定高度,hover 时上移这个高度值也是可以的,但这样就变得不灵活,里面内容需做一定的限制了。


  1. 动效2 — "文章/动态/热门" 文字上移

其实能看到文字上移,实际上是包含文字的父级盒子(.box)的padding值在改变。
例如,把 .box 的 padding-top 值,从 40px 变为 10px,这样的话文字是不是就上移了。

看看图二红框部分,.box 设置的 padding 的上下值共 80(40+40) ,而 hover 时,padding的上下值也共有80(10+70)。即上移幅度的大小可以自己控制,只要原本的总 padding 上下总和 等于 hover 时 padding 上下总和 就可以达到效果了。

这里要注意一点:
把 .box 盒子设置一个高度,让后盒子模型设置为 “box-sizeing” 模式(边距边框高度包含在盒子高度内),这样改变在后面改变padding 值时,只要改变的总值等于原本的总之,视觉上盒子高度就不会有改变。



后记:
如果看过 xxxx 这一篇的话,或许会问,这里的 .text 元素用伪类来代替可不可以,当然是可行,如果浮层内容就那么简单的话。但是实际业务中,浮层内容可能不止那么单调,可能是要嵌套好几个元素才能实现的,而这样元素又有各自的样式。其实这些都是灵活可变的,可据实际需求来选择。

动画关键点就那么几个:

  1. 父子元素控制好相对定位;
  2. hover 状态下需展示的元素先写好,只是默认状态下是隐藏的;
  3. 隐藏的方法可以是: 透明度的控制(opacity)、位移的控制(position、translate)、体积大小的控制(width、height、scale);
  4. hover 时把元素从 无 -> 有,即改变上面 “隐藏方法” 的值;
  5. 在改变这些值的同时用 transform 设置一个过度时间,使视觉上能看这个过度过程。过度时一般为 2.5s - 5s ,看具体过度距离来定。





\color{#ccc}{相关文章:}
纯css 实现tab导航栏下划线跟随动画
小程序 纯css 实现tab导航栏下划线跟随动画
css实现input聚焦底部边框动态
css小动画(大小变换 、水波纹、loading)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,699评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,124评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,127评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,342评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,356评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,057评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,654评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,572评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,095评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,205评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,343评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,015评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,704评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,196评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,320评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,690评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,348评论 2 358

推荐阅读更多精彩内容

  • 1.CSS基本概念 1.1 CSS的定义 CSS(Cascading Style Sheets)层叠样式表,主要用...
    寥寥十一阅读 1,838评论 0 6
  • 1.行内元素和块级元素?img算什么?行内元素怎么转化为块级元素? 行内元素:和有他元素都在一行上,高度、行高及外...
    极乐君阅读 2,424评论 0 20
  • (这是15年初学css时记的笔记) 选择器 简单选择器 标签选择器 直接把标签名加前面。 类选择器 用.+ cla...
    burningalive阅读 950评论 0 0
  • 一、CSS入门 1、css选择器 选择器的作用是“用于确定(选定)要进行样式设定的标签(元素)”。 有若干种形式的...
    宠辱不惊丶岁月静好阅读 1,600评论 0 6
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,316评论 0 11