CSS Secret——Visual Effect

各种特殊的阴影

阴影有5个值:
box-shadow: 0 5px 4px -4px black;
浏览器创建阴影的大概过程是这样的:
先创建一个和原有元素大小相同的块,颜色由最后一个值指定。
接下来由前两个值指定左偏移和上偏移。
第三个值来给定模糊的大小,你给了4,就意味着在现在块的边界向外向里分别模糊4。
第四个值用来在现有的块的基础上调整块的大小,给-4相当于在4个方向上都缩小4。

只有一边有的阴影

利用上面这些创建只有一边的阴影就很容易了。假设创建只有下面有的:
使用最后一个值将阴影缩小到正好被元素覆盖,在使用上偏移,将其下面的部分露出来。

box-shadow: 0 5px 4px -4px black;

只有相对的两边有阴影

啊。。。这个只有使用两个阴影才能实现了。。。

box-shadow: 5px 0 5px -5px black,
        -5px 0 5px -5px black;

不规则阴影

面对矩形或使用圆角属性创建出来的图形的时候,之前的阴影可以很好的起到作用,但是当有伪元素或透明背景等会使元素外形不规则的情形时,之前的阴影就不那么好用了。
这里有一个新的玩意,叫Filter Effects specification。
这个玩意是从SVG里借鉴来的,但是使用上不需要SVG的知识,简单的函数就好,比如blur()、grayscale()、drop-shadow()。
这里我们要用到的就是drop-shadow(),接收的参数和box-shadow差不多,没有改变大小的那个。

#irregularShadow{
  height:100px;
  color: deeppink;
  border: 10px dashed;
  text-shadow: .1em .2em yellow;
  -webkit-filter: drop-shadow(.1em .1em .5em rgba(255,255,0,1));
  filter: drop-shadow(.05em .05em .1em gray);
}

这个其实是对这个元素中所有不透明的部分应用了阴影,这时如果你使用text-shadow,就会多一层阴影哦。
这个阴影非常灵活,基本就意味着这个元素(包括其伪元素)在光照下哪里会有阴影,这里就会在哪里生成阴影。

色彩渲染图片滤镜

就是在图片上添加滤镜的效果咯。
以前我们使用图片编辑软件来编辑出各种不同效果的图片来达成目的,但这样不仅增加了HTTP请求,也使得维护变得更加困难。
还有一种是通过在图片上面覆盖一层透明的覆盖层,模拟给图片加上滤镜的效果,这样确实可以模拟有限的效果,但是这样做并不能模拟所有的效果。
使用CSS的Filter和Blending可以很好的达到效果。
使用JS的canvas可以将图片转换到画布中,这样可以在画布中获得对所有点的颜色的完全控制,如果你想编写自己的滤镜的算法的话,那这个非常适合,但是如果使用CSS中的Filter和Blending就可以达到的效果,使用这个方法无论是从速度,开销还是我们自己的工作量来说都是不划算的。

Filter

我们可以合并多个filter来达成我们的效果。而且,这个属性还可以使用动画。可以做出炫酷的效果哦。

#filter{
  width:200px;
  transition: 1s filter, 1s -webkit-filter;
  -webkit-filter: sepia() saturate(4) hue-rotate(295deg);
  filter: sepia() saturate(4) hue-rotate(295deg);
}
#filter:hover,
#filter:focus {
  -webkit-filter: none;
  filter: none;
}

Blending

这个就像是PS中的混合,有时filter并不能完全达到我们想要的效果时我们就可以使用这个。
这个东西在控制顶层的图层如何与底层的图层混合,我们将背景色放在背景图片下,再使用混合来混合这两个图层。

#blend{
  width:200px;
  height:200px;
  background-size: cover;
  background-position: center;
  background-color: hsl(335, 100%, 50%);
  background-blend-mode: luminosity;
  transition: .5s background-color;
  background-image: url("../img/tiger.jpg");
}
#blend:hover {
  background-color: transparent;
}

毛玻璃效果

在背景很复杂的情况下,我们需要呈现文字的时候就需要在文字下面一个半透明的底。
但有时半透明的底也还是不够,我们想参照macOS那样将背景高斯模糊一下。
我们当然不能在本元素上进行高斯模糊,这样内容也会被模糊,那么我们就使用伪元素吧。
对于背景元素,我们就简单的设置下背景图片,这里有一点是要注意的,首先一定要创建一个不为auto且不为负的z轴放置上下文,这个一会儿解释。

#blur {
  position: relative;
  padding:20px;
  height:400px;
  background: url("../img/tiger.jpg") 0/cover fixed;
  z-index: 1;
}

里面放置文字内容的元素放一个半透明的背景,伪元素模糊过的背景将放在这个半透明背景的下面。这里的z轴放置上下文一定要为默认值auto。

#blur .content{
  position: relative;
  max-width:400px;
  margin:0 auto;
  border-radius: 20px;
  padding:20px;
  background: hsla(0,0%,100%,.3);
  overflow: hidden;
  font: normal 22px/40px serif;
}

伪元素:

#blur .content:before{
  content: '';
  position: absolute;
  top: 0px;
  right: 0px;
  bottom: 0px;
  left: 0px;
  -webkit-filter: blur(20px);
  filter: blur(20px);
  background: url("../img/tiger.jpg") 0/cover fixed;
  z-index: -1;
  margin: -30px;
}

伪元素这里要说的比较多。
首先,我们这里是放一个伪装的图片用来模糊,所以这张图片显示的位置一定要保证和大背景位置相同才行,这里使用的是fixed的背景位置,如果你不喜欢使用别的也没问题,能保证位置一致就好。

其次,之前创建的z轴上下文在这里就用到了,我们想要的效果是将被模糊的伪装图片放在伪元素的父元素(在这里就是其生成元素)的透明背景的下面,但是要放在其父元素的父元素(真正背景所在元素)的背景的上面。
z-index: -1会使这个伪元素放到其z轴上下文的背景前,内容下面。在这里#blur创建了z轴上下文,.content因为还是默认值auto,所以没有创建。那么这个伪元素就理所当然的放在了我们想放的地方。

最后,因为模糊在边缘部分是有渐变的,模糊的半径会越来越小直至为0,我们不想要这样的效果,我们想要的是清晰的边界。那么margin: -30px就起到了这个作用,再配合其父元素的overflow:hidden,我们就将这部分渐变隐藏起来了。

折角效果

以前的实现是添加两个伪元素一个用来遮盖元素的一角,一个用来模仿折过来的角。
这样的解决方法不够灵活,有更灵活的嘛?

45度时的方案

首先利用线性渐变创建一个切角的元素。

#folded-corner{
  width:200px;
  height:200px;
  background: #58a; /* Fallback */
  background:
          linear-gradient(-135deg, transparent 2em, #58a 0);
}

然后我们再用线性渐变创建一个小小的矩形背景,这个矩形的对角线正好与切角的那条边重合,矩形的左下半部分作为折过去的角,右上半部分保持透明就好。

#folded-corner{
  width:200px;
  height:200px;
  background: #58a; /* Fallback */
  background:
            linear-gradient(-135deg,transparent 50%, rgba(0,0,0,.4) 0) no-repeat 100% 0 / 2em 2em,
            linear-gradient(-135deg, transparent 1.5em, #58a 0);
}

其他角度

其他角度可就不像45度这么简单咯。。。
首先你得计算好。。。其次这回折过来的角其实应该是反着的,用一个矩形小背景的办法行不通了,得用伪元素了。
我们首先来搞定形状的问题:
我们需要根据切角的角度和大小来计算伪元素的长宽。这里使用scss将会有很大的优势。

@mixin folded-corner($background, $size, $angle: 30deg) {
  $x: $size / sin($angle);
  $y: $size / cos($angle);
  &::before {
    content: '';
    position: absolute;
    top: 0; right: 0;
    width: $x; height: $y;
    background: linear-gradient(to left bottom,
        transparent 50%, rgba(0,0,0,.4) 0)
        100% 0 no-repeat;
  }
}

这时乍一看是完成了,但你找个真正的纸折一下就会发现,其实并不对。。。
伪元素还需要旋转一定的角度才行。
最后就是这样咯:

@mixin folded-corner($background, $size, $angle: 30deg) {
  position: relative;
  background: $background; /* Fallback */
  background:
          linear-gradient($angle - 180deg,
                  transparent $size, $background 0);
  border-radius: .5em;
  $x: $size / sin($angle);
  $y: $size / cos($angle);
  &::before {
    content: '';
    position: absolute;
    top: 0; right: 0;
    background: linear-gradient(to left bottom,
            transparent 50%, rgba(0,0,0,.2) 0,
            rgba(0,0,0,.4)) 100% 0 no-repeat;
    width: $y; height: $x;
    transform: translateY($y - $x)
    rotate(2*$angle - 90deg);
    transform-origin: bottom right;
    border-bottom-left-radius: inherit;
    box-shadow: -.2em .2em .3em -.1em rgba(0,0,0,.2);
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,837评论 25 707
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,737评论 1 92
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,066评论 4 62
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,306评论 0 11
  • 我一直都想说自己是不幸福的,原来我一直就是幸福的。有多久没有那种摇摇欲坠的感觉了,还是小学吧。多怕失去啊!十多年...
    邵氏佳人阅读 132评论 1 1