惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
Martin Fowler
Martin Fowler
Last Week in AI
Last Week in AI
罗磊的独立博客
阮一峰的网络日志
阮一峰的网络日志
博客园 - 【当耐特】
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
V
Visual Studio Blog
Hugging Face - Blog
Hugging Face - Blog
雷峰网
雷峰网
博客园_首页
人人都是产品经理
人人都是产品经理
量子位
美团技术团队
The Cloudflare Blog
小众软件
小众软件
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
Microsoft Security Blog
Microsoft Security Blog
D
DataBreaches.Net
博客园 - Franky

OhYee 博客

小鹏辅助驾驶测评|OhYee 博客 小鹏非支持手机开启自动解锁|OhYee 博客 使用函数计算实现 301 重定向|OhYee 博客 针对 HTML 内容使用 Ant Design 图片弹框|OhYee 博客 博客进程泄露及僵尸进程解决|OhYee 博客 蓝易云服务器体验|OhYee 博客 SSH 调起本地 VSCode|OhYee 博客 【2022 秋招内推】阿里云后端研发工程师|OhYee 博客 使用函数计算获取 IP 地址信息|OhYee 博客 正确获取客户端 IP/HTTP Header 也可能重复|OhYee 博客 评测 Oculus Quest2 及 BigScreen|OhYee 博客 NextJS 热重载保留状态|OhYee 博客 如何优雅地贴 gist 代码|OhYee 博客 Linux 精细化文件权限|OhYee 博客 VSCode 容器开发环境|OhYee 博客 Clash 的不兼容更新排查|OhYee 博客 Zeek 导出 PCAP|OhYee 博客 记一次 ssh 配置问题|OhYee 博客 Git Commit 规范化工具|OhYee 博客 谈谈《星之卡比-探索发现》|OhYee 博客 VSCode 快捷键绑定 Shell 命令|OhYee 博客 ASN.1 语法及 X.509 证书格式解析解析|OhYee 博客 腾讯企业邮箱忽略 MX 记录发信|OhYee 博客 Chrome/Edge 标签组插件|OhYee 博客 【应届内推】阿里云后端研发工程师|OhYee 博客 损坏的 Typecho 备份处理为 JSON|OhYee 博客 VS Code VIM 插件高效使用|OhYee 博客 SSH 正反向代理|OhYee 博客 Let's Encrypt 根证书过期引发的问题|OhYee 博客 OpenWRT 忽略内核依赖|OhYee 博客
使用CSS过渡动画实现一种有趣的效果|OhYee 博客
2020-07-21 · via OhYee 博客

使用CSS过渡动画实现一种有趣的效果

在交换友链的过程中,发现 Kaciras' Blog 的友链有一个很有趣的特效。

大概效果可以看下面的演示,也可以去 Kaciras 的博客查看

OhYee

不过,想了下我的博客似乎没什么用得到的地方,所以留个笔记以供后用吧

实现思路

这个是纯 CSS 即可实现的,主要依赖于 CSS 过渡动画transition

过渡动画

作为一个专业的非前端人员,虽然知道transition属性,但是为了严谨还是打开对应的文档

从文档可知,该属性有 1∼41\sim4 个参数,根据参数个数不同,分别有如下功能:

  • 要添加过渡动画的属性
  • 要添加过渡动画的属性,动画
  • 要添加过渡动画的属性,持续时间,动画
  • 要添加过渡动画的属性,持续时间,动画,延迟时间

首先是要过渡动画的属性,其设置的是要针对哪一个 CSS 属性增加过渡动画。其并非支持所有的 CSS 属性,具体支持的列表可见 Animatable CSS properties,如果想对所有属性都开启过渡动画,可使用all

动画属性表明了过渡动画的执行曲线

数值 效果
linear 匀速直线动画,相当于cubic-bezier(0,0,1,1)
ease 开始和结束缓速,相当于cubic-bezier(0,0,1,1)
ease-in 慢速开始,相当于cubic-bezier(0.42,0,1,1)
ease-out 慢速结束,相当于cubic-bezier(0,0,0.58,1)
ease-in-out 开始和结束缓速,相当于cubic-bezier(0.42,0,0.58,1)
cubic-bezier(n,n,n,n) 使用自定义的贝塞尔曲线,四个值都应该是[0,1][0,1],分别是起始点的控制坐标和结束点的控制坐标

另外两个参数则顾名思义是相应的动画持续时间和动画开始前的延迟。

需要特别注意的是,过渡动画应该是针对同一个属性不同数值。在此处,使用topbottom来实现上下两个区域的位置。即使默认情况下,topbottom的初始值是0,这里仍然需要显式知名0px,否则可能在某些情况下无法正确执行动画。

实现代码

样式代码

如果使用 less 应该会更优雅一点,不过这里还是使用更常用的 css 来做演示。

<style>
    .wrapper{
        width: 300px;
        height: 150px;
        background: pink;
        overflow: hidden;
        /* content 需要使用绝对定位,而绝对定位的基础是第一个非 static 父元素 */
        position: relative; 
    }
    .wrapper .top-wrapper{
        width: 100%;
        height: 75px;
        background: rgba(255,255,255,0.9);
        box-shadow: 0px 0px 10px rgba(0,0,0,0.5);
        text-align: center;
        position: relative;
        /* 默认 top 为 0px */
        top: 0px;
        /* z轴在第二层 */
        z-index: 2;
        /* top过渡动画为1秒 */
        transition: top 1s ease;
    }
    .wrapper:hover .top-wrapper{
        /* hover后向上偏移100px */
        top: -100px;
    }
    .wrapper .top-wrapper img{
        /* 图片大小和位置 */
        width: 50px;
        height: 50px;
        border-radius: 50px;
        background: white;
        padding: 5px;
        box-shadow: 0px 0px 10px rgba(0,0,0,0.5);
        margin-top:50px;
    }
    .wrapper .bottom-wrapper {
        width: 100%;
        height: 75px;
        background: rgba(255,255,255,0.7);
        box-shadow: 0px 0px 10px rgba(0,0,0,0.5);
        text-align: center;
        position: relative;
        bottom: 0px;
        z-index: 1;
        transition: bottom 1s ease;
    }
    .wrapper:hover .bottom-wrapper{
        bottom: -100px;
    }
    .wrapper .bottom-wrapper p{
        padding-top: 25px;
    }
    .wrapper .content {
        width:100%;
        height:100%;
        position: absolute;
        top:0;
        left:0;
        padding: 5px;
    }
</style>

页面代码

<div class="wrapper">
    <div class="top-wrapper">
        <img src="https://www.oyohyee.com/static/img/logo.svg">
    </div>
    <div class="bottom-wrapper">
        <p>OhYee</p>
    </div>
    <div class="content">
        <p>打开后可以看到更多详细信息</p>
        <p>这里也可以放一个图片</p>
    </div>
</div>