CSS动效集锦,视觉魔法的碰撞与融合(二) - 知乎

原文:CSS动效集锦,视觉魔法的碰撞与融合(二) - 知乎

引言

长久以来,我认识到。CSS,是存在极限的。正如曾经替你扛下一切的那个男人,也总有他眼含热泪地拼上一切,却也无法帮你做到的事情,他只能困窘地让你看到他的无能为力,怅然若失。 然后和曾经他成长的时代,做一一告别。

  • CSS有他难以做到的事情,我们帮他用lottie解决
  • CSS有他可以做到的事情,我们用我们的头脑帮他解决

本文实现的CSS效果一览

  • 标题吸顶
  • 手写箭头
  • 文字背景
  • 圆形天坑
  • 按钮波澜
  • 动态方形
  • 加载骨架
  • 多行省略

标题吸顶

sticky是一种和relative/fixed类似的定位方式,它可以实现这样的需求,就是一个标题栏nav,原本以普通默认的relative定位待在原位置,然后当页面向下滚动,当标题栏将要消失在窗口视野中时,它不但不跟随其他元素消失在窗口视野中,而是突然将定位方式变成fixed,显示成一直黏在窗口顶部的效果,就算鼠标再向下滚动,它也一直黏在那里。

这个效果实现,首先要通过position:sticky;设置成粘性定位,正如上面所说,它会在特定时候从relative转换为fixed,这个特定的时机由top/bottom等属性掌控,当元素距离小于top时候,便会触发,很显然,一般我们把top设置为0

.sticky {
    z-index: 100;
    width: 500px;
    height: 20px;
    background: red;
    position:sticky;
    position: -webkit-sticky;
    top:0px;
}

<div class="sticky" style="margin:30px;">
</div>

坑点:粘性定位生效的前提是,元素距离他的父元素顶部的距离要小于top,否则粘滞效果不起作用

手写箭头

我们一般会通过icon去实现一个箭头,可如果我们设置一点点难度:设计师如果不给你箭头Icon又改怎么办呢??我们可以这样:

  1. 先画一个div,border设置成箭头的颜色,同时呢,把div左边和下边的border变透明
  2. 再然后呢,把这个div右转45度:transform:rotate(45deg),这样就可以得到右边的箭头了

.arrow {
    width: 50px;
    height: 50px;
    border:10px solid blue;
    border-left-color: transparent;
    border-bottom-color: transparent;
    transform: rotate(45deg);
}

<div class="arrow" style="margin:30px"></div>

文字背景

  • A:CSS文字背景怎么实现?
  • B:我知道我知道!text-background
  • A: 你的猜测非常合理!但如果我们真有这个CSS属性就好了

对,问题在于我们没有text-background这样一个CSS属性实现文字背景,但是我们有background-clip: text;它可以把background按文本进行裁剪。裁剪之后呢,背景就只剩文本下面的这一块了,然后我们要注意,文本默认是不透明的呀,所以如果想要让人看到文本后面的背景,就要通过color:transparent将文本变成透明。

同时呢,我们有-webkit-background-clip可以特别针对webkit内核浏览器的实现,以进行兼容

body {
    background: #fff;
}
.text-bg {
    width: 800px;
    font-size: 70px;
    font-weight: bold;
    background: url(../demoImage/sea.jpg);
    background-clip: text;
    -webkit-background-clip: text;
    color: transparent;
    -webkit-text-fill-color: transparent;
}

<div class="text-bg" style="margin:30px">
        <p class="text">我叫彭湖湾,请叫我胖湾</p>
</div>

圆形天坑

在一些应用里,我们可能会看到有些用圆坑(或者说曲线)作为背景,例如知乎手机版的后面的这个很明显就是一个圆的底部。

下面这个圆坑怎么实现它呢?其实也很简单,就是在一个外壳div里面,放一个比它本身还要大的圆,然后让这个圆实现居中就好了。

.hole-wrapper {
    overflow: hidden;
    position: relative;
    width: 300px;
    height: 70px;
    background: white;
}
.hole {
    border-radius: 50%;
    background: blue;
    position: absolute;
    bottom:0;
    left:50%;
    margin-left: -200px;
    width: 400px;
    height:400px;
}

<div class="hole-wrapper" style="margin:30px">
        <div class="hole">
        </div>
</div>

你可能会问,为什么我画的这个圆上面一部分也要截掉,只留下一个圆坑呢?像上面知乎案例的要求,就算不把圆坑上面部分截成平的也可以实现啊。这是因为,在实际需求中,设计给你的UI需求,不一定就是整个大圆的一部分,而是可能需要将圆div的底部和上面一个长div结合起来才能实现,这时候,顶部被“截平”的圆就具有了容易组合的灵活优势了

按钮波澜

比如一些UI框架,当点击按钮的时候会看到波澜,那么这个效果是怎么实现的呢?首先我们这样分析(下面用悬浮模拟点击,从而实现纯CSS的效果)

  • 波澜的轮廓是一个不断扩大的圆,我们联想到可以通过变化的transform:scale()控制大小的变化
  • 圆随着扩大越来颜色越淡直到消失,我们可以给他设置白色background,并且通过变化的opacity控制透明度的变化
  • 通过animation来控制每个阶段,圆的具体的大小和颜色浓淡变化

@keyframes wave{
    20% {
        transform: scale(0.2);
        opacity: 0.8;
    }
    40% {
        transform: scale(0.4);
        opacity: 0.6;
    }
    60% {
        transform: scale(0.6);
        opacity: 0.4;
    }
    80% {
        transform: scale(0.8);
        opacity: 0.2;
    }
    100% {
        transform: scale(1);
        opacity: 0;
    }
}
.button {
  overflow: hidden;
  position: relative;
  border:2px solid #fff;
  background:#2894FF;
  border-radius: 10px;
  width: 200px;
  height: 50px;
}

.wave {
    border-radius: 50%;
    position: absolute;
    top:50%;
    margin-top: -200px;
    left: 50%;
    margin-left: -200px;
    background: #fff;
    width: 400px;
    height: 400px;
    transform: scale(0.01);
    opacity: 0;
}
/* 悬浮替代点击 */
.button:hover .wave{
  animation: wave linear 1s;
}
<div class="button" style="margin:30px">
        <div class="wave"></div>
</div>

动态方形

  • A:你实现一个高度和宽度一样的正方形!
  • B:太简单了!不要耍我!我会width:20px;height:20px;
  • A:但是,我的要求是要随外部div的长度变化,而变化的正方形
  • B:还是太简单了,我会width:20%;height:20% 。。。。。(被打断)
  • A:但是!这个外部包裹的div可能是一个变化的长方形!而你还是要在里面实现一个宽高成比例变化的正方形!
  • B:喵喵喵???

如下所示

首先要和大家说,下面这种方法是无效的,曾有人建议使用calc方法传入width作为参数,调用后赋给height,但是这是没有用的,浏览器无法识别。

/* 不知道是哪个大猪蹄子想出来的运行不了的方法 */
div {
  width: 20%;
  height:calc(width)
}

我们的思路

这时候,我们需要一条关键的信息:padding-top/padding-bottom是参考父元素的宽度去计算,这难免让人感觉到有一点点惊讶,垂直方向的padding-top居然会依靠水平方向的福元素的width去计算。但事实确实如此。

接下来事情你一定知道了:我们用padding-top去模拟了height!!

.square-wrapper {
    display: flex;
    justify-content: center;
    align-items: center;
    border: 2px solid blue;
    width: 300px;
    height: 200px;
}

.square-wrapper:hover {
    transition:width 2s,height 2s;
    width: 400px;
    height: 300px;
}

.square {
    background: red;
    width: 25%;
    padding-top:25%;
}

<div class="square-wrapper" style="margin:30px">
        <div class="square"></div>
</div>

加载条

加载条,或者加载骨架(skeleton),是在网页加载的时候用到的,加载条可以说很简单,但是要实现得方便易维护却要花点心思,比如说有得时候,我们可能单独为它编写一个skeleton组件,并且判断当前数据还没取到时候,就返回这个组件。这样没什么问题,但是,如果我们能把这段逻辑全部搬到CSS中去完成呢?那不就更好了吗?

有一个叫做:empty的伪元素,可以定位“还没有任何内容”的标签,这样的话,我们可以在empty 伪元素的代码块里编写加载条。这样的话,就不用把加载条逻辑代码搬到JS中了,尽量减少了对关键的业务代码的侵入性

.content {
    width: 200px;
    height: 20px;
    background:red ;
}
.content:empty{
    background: grey
}

<div class="skeleton" style="margin:30px">
        <div class="content">我有文本内容呢</div>
        <div class="content"></div>
</div>

使用CSS自定义属性构建骨架屏 - 掘金?juejin.im

怎么让加载条动起来

你也许对上面纯静态的加载条感到有些不悦,但是没关系,因为这个实现很简单,方法也很多很多,如果是我的话,我会采用类似上一节讲到的第一个动效去完成它

彭湖湾:CSS动效集锦,视觉魔法的碰撞与融合(一)?zhuanlan.zhihu.com

单/多行省略

在处理单/多行文本时候,我们可能会需要对过多的文字做省略处理,并且在截断的文字的结尾留下“...”的样式,笔者过去有篇知乎的文章对此进行了详细的总结,大家可以查看下面给的链接

<div style=‘width:400px;
         height:70px;
         border:1px solid red;‘>
        <p style=‘display: -webkit-box;
            -webkit-box-orient: vertical;
            -webkit-line-clamp: 2;
            overflow:hidden;‘>
            这是一些文本这是一些文本这是一些文本这是一些文本这是一些文本
            这是一些文本这是一些文本这是一些文本这是一些文本这是一些文本
        </p>
</div>

总结和感悟

我想借文章标题和内容,去表达作为一个前端工程师,曾经深切感受的心境:

“这个特效我实现不了啊!怎么办!?”

如果看似用一个方式解决不了,那就换一个,我发现,有趣的CSS样式玩的就是视觉欺骗,实际的实现,和表面上看到的东西往往是不一样的,在经过多方的拼凑之后,它就用那种也许不太优雅,但是却行之有效的方式出现在我们眼前。

个人介绍

大家好! 我叫彭湖湾,CSS职业选手,18年中韩前端大师邀请赛垫底最后一名,JavaScript排位赛中国区广东分区前1600强,我擅长使用的英雄是React和Vue,快速响应从而给短时间内敌人造成大量伤害! 我喜欢使用的武器是Node.js,但是武艺不精经常误伤自己,我的口号是:“我是IE守护者,痛击我的队友,保护我的敌人! ” 9102年9月1日,我将在知乎前端职业联赛ZPL (Zhihu Pro League)上送上我的精彩表现,敬请期待!

编辑于 2019-09-15

原文地址:https://www.cnblogs.com/lonelyxmas/p/12255596.html

时间: 2024-10-09 21:14:35

CSS动效集锦,视觉魔法的碰撞与融合(二) - 知乎的相关文章

【CSS】CSS特效集锦,视觉魔法的碰撞与融合(一)

原文:[CSS]CSS特效集锦,视觉魔法的碰撞与融合(一) 目录 前言 一.浮光掠影 二.发光球体 三.圆环进度条 四.三角形 五.有色到透明的渐变 六.模糊效果和毛玻璃效果 七.斜角标签 技术总结 知乎主页和专栏 正文 回到顶部 前言 在本文中我讲述了7种CSS的特效,它们也许看起来并不惊艳,但是我认为却足够传达本文的理念:编写一些特殊的CSS样式的时候需要不拘于常理,要用特殊的认识角度看待标签和样式属性,从而用「绕个弯」的方式达到效果. 回到顶部 一.浮光掠影 首先我们看第一个实现效果:在鼠

CSS动效集锦,视觉魔法的碰撞与融合(三)

本文讲述的原理和相关demo 扇形DIV的使用——实现雷达扫描图 DIV环形布局—实现loading圈 动画的向量合成—实现抛物线动画 无限滚动动画—实现跑马灯效果 perspective和transform的运用——实现卡片翻转 话不多说,请看. 扇形DIV的使用——实现雷达扫描图 在一些杀毒或文件扫描类的软件上,我们可能会看到一些雷达扫描的UI样式,例如下图所示 如果我们要通过CSS该如何去实现话,我们的想法一般是先画个扇形,然后给它加上渐变. 实现渐变的方式很简单,但我们该如何实现一个扇形

CSS实现一个粒子动效的按钮

原文链接 github.com/XboxYan/not… 按钮(button)可能是网页中最常见的组件之一了,大部分都平淡无奇,如果你碰到的是一个这样的按钮,会不会忍不住多点几次呢? 通常这类效果第一反应可能就是借助canvas了,比如下面这个案例 效果就更加震撼了,当然canvas实现也有一定的门槛,而且实际使用起来也略微麻烦(所有js实现的通病),这里尝试一下CSS的实现方式. 生成粒子 抛开js方案,还有HTML和CSS实现方式.HTML就不用说了,直接写上大量的标签 <button>

iOS 停止不必要的UI动效设计

http://www.cocoachina.com/design/20151124/14400.html 前言:这篇短文将会探讨UI设计中动画的过度使用,并将其与早期的视觉设计进行对比,提出一些对于有效的GUI动效设计的建议. 我们将在下文中,简单探讨如何改善下面的这个交互. UI动效设计的反面案例(线上Demo) 注:这个反面案例并非假设,而是来自近期的真实客户案例. 概述 自从 70.80 年代首个光栅图像在CRT屏幕出现以来,人们对于(数字)视觉设计的态度一直在不断进化.与其他艺术领域不同

box-shadow的动效制作

突然发现原来box-shadow的功能很强大,还能做动效,下面整理下box-shadow几个效果 案例1:hover效果 <a href="/app/list">WEB小应用</a> css: #list_nav li a { height: 38px; display: block; width: 150px; background: #FFF; margin: 10px; text-decoration: none; border: 1px solid #2

css动画库

转载自:http://www.cnblogs.com/starof/p/4968769.html 本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/4968769.html有问题欢迎与我讨论,共同进步. 一.animates.css animate.css是来自dropbox的工程师Daniel Eden开发的一款CSS3的动画效果小类库.包含了60

转:玩转HTML5移动页面(动效篇)

作为一名前端,在拿到设计稿时你有两种选择: 1.快速输出静态页面 2.加上高级大气上档次狂拽炫酷屌炸天的动画让页面动起来 作为一个有志向的前端,当然是选2啦!可是需求时间又很短很短,怎么办呢? 这次就来谈谈一些动画设计的小技巧,能在你时间不多又没有动画想法的时候瞬间让页面增色不少. 同时也会谈及移动端H5页面的优化细节与关键点,因此本文章将分为动效篇和优化篇. ====前方高能==== (1)  CSS3时序错开渐显动画 这是一种比较常用的动画,它的优点是节奏感强,做法就是先让每个元素隐藏,然后

玩转HTML5移动页面(动效篇)(转载)

作为一名前端,在拿到设计稿时你有两种选择: 1.快速输出静态页面 2.加上高级大气上档次狂拽炫酷屌炸天的动画让页面动起来 作为一个有志向的前端,当然是选2啦!可是需求时间又很短很短,怎么办呢? 这次就来谈谈一些动画设计的小技巧,能在你时间不多又没有动画想法的时候瞬间让页面增色不少. 同时也会谈及移动端H5页面的优化细节与关键点,因此本文章将分为动效篇和优化篇. ====前方高能==== (1)  CSS3时序错开渐显动画 这是一种比较常用的动画,它的优点是节奏感强,做法就是先让每个元素隐藏,然后

基于clip-path的任意元素的碎片拼接动效(源自鑫空间)

一.实现原理. 效果本质上是CSS3动画,就是旋转transform:rotate和位移:transform:translate,只是旋转和位移的部件是三角碎片而已.三角是使用CSS3 clip-path剪裁出来的. JS把元素剪裁成一个个等腰直角三角形,然后随机分布在四周,然后通过CSS3 animation动画,让所有的在四周的元素归位就可以了. 于是,核心CSS如下: .clip[style] { opacity: 0; } .active .clip[style]{ will-chang