css 滚动视差 之 水波纹效果
核心属性: background-attachment
这个属性就牛逼了, 它可以定义背景图片是相对视口固定,
还是随着视口滚动, 加上这个属性网页瞬间就从屌丝变成
高大上。
我们来看个例子:
html:
<div class="attach view"></div>
<div class="text view">I WANT FLY</div>
<div class="attach view"></div>
<div class="text view">I WANT FLY</div>
<div class="attach view"></div>
<div class="text view">I WANT FLY</div>
<div class="attach view"></div>
css:
body{
background-color: #cccccc;
margin: 0;
padding: 0;
}
.attach{
background-image: url("./img/1.jpg");
background-size: cover;
/*background-attachment: fixed;*/
background-position: center center;
}
.view{
height: 100vh;
}
.text{
font-size: 45px;
text-align: center;
line-height: 100vh;
color: #ffffff;
}
代码很简单,让视口出现滚动条,
然后它是这样的:

很普通的一个滚动效果, 然后我们把注释去掉,
就是加上这句话:
background-attachment: fixed;
华丽变身:

由于它相对视口固定, 看起来就好像只有一个背景一样。
我们就用这个属性来制作水波纹效果:
波纹效果其实就是动态生成几个div 叠加在一起, 并且背景图片一样
它们的宽高逐渐变大, 透明度逐渐变为0, 并且每个div有delay, 效果
结束后remove掉,并且多次点击产生的波纹的层级越来越高才不会被前面的波纹覆盖;
HTML:
<div class="water-wave"> </div>
CSS:
/*整体的背景*/
.water-wave {
/*占满整个屏幕*/
position: relative;
height: 100vh;
width: 100vw;
background-image: url("./img/1.jpg");
background-size: cover;
background-position: center center;
background-attachment: fixed;
overflow: hidden;
cursor: pointer; } /*存放波纹的一个自适应的正方形*/
.wave-container {
position: absolute;
/* vmin = 视口width > 视口height ? height : width*/
width: 80vmin;
height: 80vmin;
}
.center{
position: relative;
width: 100%;
height: 100%;
/*背景铺满*/
background-size: cover;
}
.wave {
/*每个波纹居中*/
position: absolute;
top: calc((100% - 10vmin) / 2);
left: calc((100% - 10vmin) / 2);
width: 10vmin;
height: 10vmin;
border-radius: 50%;
/*开启3d加速*/
transform: translate3d(0, 0, 0);
background-image: url("./img/1.jpg");
background-position: center center;
background-attachment: fixed;
/*所有属性变化过渡200ms*/
transition: all .2s;
} /*每个波纹的动画延迟不一样, size由大变小再
变为100%这样效果更逼真*/
.wave1 {
/*forwards停留在动画的最后一帧*/
animation: move 1s ease-out .1s forwards;
background-size: 106%;
z-index: 10; } .wave2 {
animation: move 1s ease-out .15s forwards;
background-size: 102%;
z-index: 20; } .wave3 {
animation: move 1s ease-out .25s forwards;
background-size: 104%;
z-index: 30; } .wave4 {
animation: move 1s ease-out .4s forwards;
background-size: 100%;
z-index: 40; } @keyframes move {
0% {
top: calc((100% - 10vmin) / 2);
left: calc((100% - 10vmin) / 2);
width: 10vmin;
height: 10vmin;
opacity: 1;
}
/*动画过程中不能让opacity渐变,不然没有水波纹的效果*/
/*但是这样又会产生一点小抖动, 不过不影响效果*/
/*你也可以注释掉看看*/
99% {
opacity: 1;
}
100% {
top: calc((100% - 40vmin) / 2);
left: calc((100% - 40vmin) / 2);
width: 40vmin;
height: 40vmin;
opacity: 0;
}
}
JS: 我尽量每行都写注释
const container = document.getElementsByClassName('water-wave'); // 取父级
const number = 4; // 自定义产生几个水波纹
let index = 0; // 定义每次点击产生的波纹的层级
const containerWidth = document.body.clientHeight > document.body.clientWidth
? document.body.clientWidth * 0.8 / 2 : document.body.clientHeight * 0.8 / 2;
// 取包裹波纹的正方形的半个宽 这是为了计算点击时正方形的位置
container[0].addEventListener('click', (e) => {
// 传入事件, 父级, 波纹数, 层级
addWave(e, container[0], number, index++)
}, false); // 注册点击事件
// 点击触发
function addWave(e, parentNode, number, index) {
// 渲染完波纹后插入父级, 传入波纹数, 点击的坐标x, y ,层级
parentNode.appendChild(renderWave(number, e.pageX, e.pageY, index));
// 移除每次点击产生的波纹,
// index是用来识别每次点击的波纹相当于唯一的ID
removeWave(parentNode, index);
}
// 渲染波纹的函数
function renderWave(number, x, y, z) {
let childrenNode = '';
// 创建一个父级div元素用来包裹波纹
let childrenContainer = document.createElement('div');
// 添加一个class用来标记,方便删除
childrenContainer.classList.add(`remove${z}`);
// 循环产生波纹
for (let i = 0; i < number; i++) {
childrenNode += `<div class='wave wave${i + 1}'></div>`
}
// 波纹放进div里
childrenContainer.innerHTML =
`<div class='wave-container' style='left:${x - containerWidth}px;top:${y - containerWidth}px;z-index:${z}'>
<div class="center">
${childrenNode}
</div>
</div>`;
// 返回这个div
return childrenContainer;
}
function removeWave(parentNode, index) {
// 延迟3秒删除波纹
setTimeout(() => {
const node = document.getElementsByClassName(`remove${index}`)[0];
parentNode.removeChild(node);
}, 3000);
}
注释已经写的很详细了, 自己动手写写才能发现问题哦
我们来看看最终效果:

可在下方评论大声说出你的看法 ↓↓
这个效果是我从bootstrap-material-design上面分离下来的,bootstrap-material-design的一些组件样式我不太不喜欢,但是非常喜欢这个水波纹效果,所以就有了这篇 ... 今天,我们继续分享 JavaScript 实现的效果例子,这篇文章会介绍使用 JavaScript 实现水波纹效果.水波效果以图片为背景,点击图片任意位置都会触发.有时候,我们使用普通的 Javasc ... 1.何为滚动视差 视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验. 作为网页设计的热点趋势,越来越多的网站应用了这项技术.效 ... Android的水波纹效果只有高版本才有,我们希望自己的应用在低版本用低版本的阴影,高版本用水波纹,这怎么做呢?其实,只要分drawable和drawablev21两个文件夹就好了. 普通情况下的se ... 一.实现单击出现水波纹单圈效果: 照例来说,还是一个自定义控件,观察这个效果,发现应该需要重写onTouchEvent和onDraw方法,通过在onTouchEvent中获取触摸的坐标,然后以这个坐标 ... 水波纹效果: 1.标准正余弦水波纹: 2.非标准圆形液柱水波纹: 虽说都是水波纹,但两者在实现上差异是比较大的,一个通过正余弦函数模拟水波纹效果,另外一个会运用到图像的混合模式(PorterDuffX ... 利用环形渲染我们可以做到什么? 其实很多都是非常常见的,比如上一篇实现的帮帮糖效果, 彩色的热气球,比如这里要讲到的水波纹效果,或者也可以理解为扩散色渲染效果 首先看一下效果图: 轻触屏幕,即可看到对 ... 水波纹效果已经不是什么稀罕的东西了,用过5.0新控件的小伙伴都知道这个效果,可是如果使用一个TextView或者Button或者其它普通控件的话,你是否知道如何给它设置水波纹效果呢?OK,我们今天就来 ... 这里是重点,<ripple>是API21才有的新Tag,正是实现水波纹效果的; 其中<ripple android:color="#FF21272B" .... ... http://blog.csdn.NET/aigestudio/article/details/47155769 在5.0以前我们想要实现像网易新闻客户端那样的的Tab可以有很多种选择: 比如古老的T ... 从廖雪峰老师的python教程入门的,最近在看python爬虫,入手了一下 代码比较low,没有用到多线程和ip代理池 然后呢,由于robots.txt的限定,构建了一些user-agent,并放慢的 ... 关于RabbitMQ是什么以及它的概念,不了解的可以先查看一下下面推荐的几篇博客 https://blog.csdn.net/whoamiyang/article/details/54954780 h ... 前言 通常 RPC 调用需要客户端使用服务端提供的接口,而具体的形式则是使用 jar 包,通过引用 jar 包获取接口的的具体信息,例如接口名称,方法名称,参数类型,返回值类型. 但也存在一些情况,例 ... <API管理平台XXL-API> 一.简介 1.1 概述 XXL-API是一个简洁易用API管理平台,提供API的"管理"."文档"."M ... 表弟17岁就没读书了,在我家呆了差不多一年吧. 呆的前几个月,每天上网打游戏,我又不好怎么在言语上管教他,就琢磨着看他要不要跟我学习Python编程.他开始问我Python编程什么?我打开了我给学生上 ... 源地址:http://www.cnblogs.com/2050/p/3191744.html 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通 ... oracle 用imp导入数据的时候报错:遇到ORACLE 错误1658: 无法为表空间 MAXDATA 中的段创建 INITIAL 区 解决办法:需要添加数据文件而不是新增表空间,代码如下: alt ... -------------初级篇---------------------------------------- 在一般的href中路径的引用问题 ./index.aspx与index.aspx都 ... 1. Nordic官网及资料下载 Nordic官网主页:https://www.nordicsemi.com/,进入官网后,一般点击"Products"标签页,即进入Nordic产 ...css 滚动视差 之 水波纹效果的更多相关文章
随机推荐