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" .... ... <form id="DailyFinancial" > @*class="form-inline"*@ <div class="fo ... HTML学习笔记 day two Charter three网站中的文本样式标签 3.1设置标题字体 语法结构:<h#>标题文字</h#> 注:其中的#可以为1,2,3,4,5 ... $('body').on('input propertychange', '.info-number-val-box', function(event) { xxxxx }); 在讲Singleton时我举例时用过这样一段代码: public class SingletonDemo { private static class SingletonHolder{ private ... 这两天在写一个爬虫,需要从网站返回的json数据提取一些有用的数据. 向url发起请求,返回的是response,在python3中,response.content是二进制bytes类型的,需要用d ... 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦, ... 解决:找不到资源文件: 系统会根据分辨率来选择加载不同drawable下文件夹的资源,如果只在一个文件下放了资源文件,不同的分辨率设备的会报错. 微服务和消息队列的基础都是RPC框架,比较有名的有WCF.gRPC.Dubbo等,我们的NewLife.ApiServer建立在网络库NewLife.Net之上,支持.Net Core,追求轻量级和高 ... 红外热像仪利用红外探测器接受被测目标的红外辐射能量,将红外辐射能量转换成带有温度信息的图像信号,并通过显视屏等显示工具显示红外热图像.这种红外热图像与物体表面的温度分布相对应.红外热像仪能够将探测到的 ... >>> import random>>> import time>>> x=list(range(10000))>>> y=se ...css 滚动视差 之 水波纹效果的更多相关文章
随机推荐