html 开关窗效果,纯css实现窗户玻璃雨滴逼真效果

这里仅是用CSS技术来演示这样的一个场景,可能并不太实用。然而这是一个探索CSS新功能的最佳机会。可以让你尝试使用一些新特性和新工具。并且逐渐将在工作中实践。在制作窗口雨滴效果,将使用到HAML和Sass。

案例效果

33d620b85822872808ff09f62e747440.png

看到上面的效果是不是有点像人站室内看窗外雨中的夜景,窗户上雨滴的效果是那么的真实,窗外的夜景却又是那么的模糊。咱们不在诗意化了,我想大家更为关注的是用什么样的技术来实现这样的一个效果。

预处理器

在这个示例中,使用了HAML和Sass来替代我们熟悉的HTML和CSS。主要是为了制作雨滴需要上百个

元素,另外需要对上百个
写样式,毕竟每个雨滴都长得不一致嘛。使用预处理器除了可以帮助我们减少工作量之外,还可以使用预处理器中的循环、变量等。最主要的是可以使用随机函数产生的随机值,让我们不需要单独处理上百个雨滴。

有关于HAML和Sass的语法可以各自到其官网上查阅。如果你自己本地电脑不具备这样的开发环境,可以直接在Codepen创建DEMO,并且选择对应的预处理器。在HTML和CSS的配置中选择对应的预处理器。比如在HTML设置中选择HAML,在CSS设置中选择SCSS。

有关于Sass更多的中文教程,可以点击这里阅读。

结构

制作窗户雨滴的效果,其结构并不太复杂。主要分两个层次,其中是窗户,而另个是雨滴。在案例中使用.window来表示窗户,在.raindrops容器中放置了上面个雨滴.雨滴是通过.border和.drops来制作。并且将窗户.window和雨滴.raindrops都放置在容器.

container中:

.container

.window

.raindrops

.borders

- (1..120).each do

.border

.drops

- (1..120).each do

.raindrop

编译出来的结构:

样式

样式分为三个层次:

模糊的窗外夜景(理解成窗户的效果也可以)

雨滴效果

雨滴下滑动画效果

接下来简单了解这些效果是怎么实现的,又使用了哪些CSS新特性。

设置变量

整个效果都是使用Sass来编写,如果你从未了解或接触过Sass,建议您先对其做一个简单的了解。这样更有助于你快速理解案例效果制作。

窗外的夜景找了一张华灯初上的图片,而且让窗户占据全屏,在这里首先声明三个变量:

$image: "http://www.w3cplus.com/sites/default/files/blogs/2015/1506/huadenchushang.jpg";

$width:100vw;

$height:100vh;

初此之外,需要设置雨滴变量:

$raindrops:120;

特别需要注意,雨滴的变量值最好和HTML中的雨滴结构相匹配。

让窗户占据全屏

首先要做的是让窗户占据全屏。其实就是让.window全屏显示。至于如何实现全屏效果,这也不是什么难的事情。我想懂点CSS的同学,分分钟就能搞定。不过这里采用的是CSS3的新方法,采用viewport单位来实现全屏效果:

.container{

position:relative;

width:$width;

height:$height;

overflow:hidden;

}

.window{

position:absolute;

width:$width;

height:$height;

background:url($image);

background-size:cover;

background-position:50%;

}

使用了两个关键知识点:

使用viewport单位vw和vh,让容器.container和.window和视窗窗口一样大。(有关于Viewport单位相关介绍,这里有做详细介绍)

使用CSS3的background-size属性,让背景图片满屏显示。

模糊效果(毛玻璃)

我们要的效果不仅仅是背景图全屏这么简单,看上去图片是模糊的效果。或许有同学会说,使用制作软件整一张模糊的背影图片,也就分分钟的事情。如果你还是使用这样的方法来处理,说明你已经Out了。

CSS3中有一个filter属性,将其设置blur(),效果就出来了。

.window{

...

filter:blur(10px);

}

2156f6172b04c1b8392bcf137ece0736.png

现实生活中的雨露

在我们继续讨论之前,让我们看看现实生活中雨滴在窗户上的效果:

8884eaf3eccbe7d205afa7cad09dbdfd.png

图片来自:Wikipedia

由于折射,雨滴翻转图像。另外,雨滴形状或多或少有些类似半球体,而且综们看起来有黑色边框。

雨滴

基于我们看到的雨滴效果,让我们来尝试制作一个单独的雨滴效果。

HAML

.container

.window

.raindrop

SCSS

$drop-width:15px;

$drop-stretch:1.1;

$drop-height:$drop-width*$drop-stretch;

.raindrop{

position:absolute;

top:$height/2;

left:$width/2;

width:$drop-width;

height:$drop-height;

border-radius:100%;

background-image:url($image);

background-size:$width*0.05 $height*0.05;

transform:rotate(180deg);

}

这是很简单的,我做就是使用div.raindrop画了一个椭圆。并且用了当初的背景图进行了填补,并做了一个倒转的效果。

d0f91ad3061f1268c15c49f70cca7da3.png

现在,我们要添加一个小边框,让雨滴看起来更像雨点(看起来有立体效果)。

HAML

.container

.window

.border

.raindrop

SCSS

.border{

position:absolute;

top:$height/2;

left:$width/2;

margin-left:2px;

margin-top:1px;

width:$drop-width - 4;

height:$drop-height;

border-radius:100%;

box-shadow:0 0 0 2px rgba(0,0,0,0.6);

}

f2689efeba08d3ad1be59fc6b4b56c44.png

请注意,我们不只是添加了一个边框,我们还对边框进行了挤压,所以看起来雨滴更自然一些。

雨滴看上去OK了,这个时候我们可以添加数以百计的雨滴:

HAML

.container

.window

.raindrops

.borders

- (1..120).each do

.border

.drops

- (1..120).each do

.raindrop

我们做了120个雨滴。

接下来使用Sass的循环给每个雨滴写样式:

@for $i from 1 through $raindrops{

$x:random();

$y:random();

$drop-width:5px+random(11);

$drop-stretch:0.7+(random()*0.5);

$drop-height:$drop-width*$drop-stretch;

.raindrop:nth-child(#{$i}){

left:$x * $width;

top:$y * $height;

width:$drop-width;

height:$drop-height;

background-position:percentage($x) percentage($y);

}

.border:nth-child(#{$i}){

left:$x * $width;

top:$y * $height;

width:$drop-width - 4;

height:$drop-height;

}

}

这里采用了Sass的@for循环对每个雨滴做样式处理,并且使用随机函数random()产生随机值,让每个雨滴的大小,挤压都不一致。同时还使用percentage()函数,让雨滴的背景图采用不同的位置。

59b5140b31fc99319771fa6d462ce880.png

上面看到的效果都是静态的,为了让它更具下雨的效果。雨滴滴下的效果,可以使用CSS3的animation来制作动画效果。

@keyframes falling {

from {

}

to {

transform: translateY(500px);

}

}

定义好falling动画之后,只需要在雨滴上调用:

@for $i from 1 through $raindrops{

$x:random();

$y:random();

$drop-width:5px+random(11);

$drop-stretch:0.7+(random()*0.5);

$drop-delay: (random()*2.5) + 1;

$drop-height:$drop-width*$drop-stretch;

.raindrop:nth-child(#{$i}){

left:$x * $width;

top:$y * $height;

width:$drop-width;

height:$drop-height;

background-position:percentage($x) percentage($y);

animation: #{$drop-delay}s falling 0.3s ease-in infinite;

}

.border:nth-child(#{$i}){

left:$x * $width;

top:$y * $height;

width:$drop-width - 4;

height:$drop-height;

animation: #{$drop-delay}s falling 0.3s ease-in infinite;

}

}

到了这一步,你也就能看到文章开头显示的雨滴窗户的效果了。是不是感觉很爽呀。

总结

文章一步一步演示了如何使用CSS新特性制作一个华灯初上,雨滴窗户的效果。整个实现过程采用了预处理器来编写代码。从整个过程中你可以很明显的感知,如果没有HAML和Sass这样的预处理器,你要为数以百计的雨滴写样式效果,那绝对是一件非常苦逼的事情。而使用之后,采用他们的功能特性,配合CSS3的一些新特性就能很轻松的完成。

浏览这个效果建议您使用Chrome浏览器浏览,因为这里使用了CSS3一些新特性,大家应该都懂的。千万别问我IE6浏览器怎么破,我也破不了。

纯css实现窗户玻璃雨滴逼真效果,内容到此为止,希望大家喜欢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用CSS3中的伪类和过渡属性来实现滑动按钮的效果。以下是一个简单的实现示例: HTML代码: ```html <label class="switch"> <input type="checkbox"> <span class="slider"></span> </label> ``` CSS代码: ```css .switch { position: relative; display: inline-block; width: 60px; height: 34px; } .switch input[type="checkbox"] { display: none; } .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; transition: .4s; } .slider:before { position: absolute; content: ""; height: 26px; width: 26px; left: 4px; bottom: 4px; background-color: white; transition: .4s; } input:checked + .slider { background-color: #2196F3; } input:focus + .slider { box-shadow: 0 0 1px #2196F3; } input:checked + .slider:before { transform: translateX(26px); } .slider.round { border-radius: 34px; } .slider.round:before { border-radius: 50%; } ``` 解释: - `.switch`类设置了开关按钮的基本样式,包括宽高、定位等。 - `input[type="checkbox"]`选择器隐藏了原生的复选框。 - `.slider`类设置了按钮的背景色、过渡效果等。 - `.slider:before`伪类设置了按钮内部的小圆点,以及其过渡效果。 - `input:checked + .slider`选择器设置了按钮选中时的背景色。 - `input:focus + .slider`选择器设置了按钮获取焦点时的阴影效果。 - `input:checked + .slider:before`选择器设置了按钮选中时,内部小圆点的位移效果。 - `.slider.round`和`.slider.round:before`类用于设置圆形按钮的样式,可根据需要选择使用。 这样就可以实现一个简单的滑动按钮效果了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值