核心属性: 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);
}

注释已经写的很详细了, 自己动手写写才能发现问题哦

我们来看看最终效果:

可在下方评论大声说出你的看法 ↓↓

css 滚动视差 之 水波纹效果的更多相关文章

  1. jquery ripples水波纹效果( 涟漪效果)

    这个效果是我从bootstrap-material-design上面分离下来的,bootstrap-material-design的一些组件样式我不太不喜欢,但是非常喜欢这个水波纹效果,所以就有了这篇 ...

  2. 如何使用 HTML5 Canvas 制作水波纹效果

    今天,我们继续分享 JavaScript 实现的效果例子,这篇文章会介绍使用 JavaScript 实现水波纹效果.水波效果以图片为背景,点击图片任意位置都会触发.有时候,我们使用普通的 Javasc ...

  3. 纯css滚动视差

    1.何为滚动视差 视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验. 作为网页设计的热点趋势,越来越多的网站应用了这项技术.效 ...

  4. 兼容Android的水波纹效果

    Android的水波纹效果只有高版本才有,我们希望自己的应用在低版本用低版本的阴影,高版本用水波纹,这怎么做呢?其实,只要分drawable和drawablev21两个文件夹就好了. 普通情况下的se ...

  5. android自定义控件(4)-自定义水波纹效果

    一.实现单击出现水波纹单圈效果: 照例来说,还是一个自定义控件,观察这个效果,发现应该需要重写onTouchEvent和onDraw方法,通过在onTouchEvent中获取触摸的坐标,然后以这个坐标 ...

  6. 自定义view实现水波纹效果

    水波纹效果: 1.标准正余弦水波纹: 2.非标准圆形液柱水波纹: 虽说都是水波纹,但两者在实现上差异是比较大的,一个通过正余弦函数模拟水波纹效果,另外一个会运用到图像的混合模式(PorterDuffX ...

  7. Android 颜色渲染(七) RadialGradient 环形渲染实现水波纹效果

    利用环形渲染我们可以做到什么? 其实很多都是非常常见的,比如上一篇实现的帮帮糖效果, 彩色的热气球,比如这里要讲到的水波纹效果,或者也可以理解为扩散色渲染效果 首先看一下效果图: 轻触屏幕,即可看到对 ...

  8. 聊聊Android5.0中的水波纹效果

    水波纹效果已经不是什么稀罕的东西了,用过5.0新控件的小伙伴都知道这个效果,可是如果使用一个TextView或者Button或者其它普通控件的话,你是否知道如何给它设置水波纹效果呢?OK,我们今天就来 ...

  9. android 点击水波纹效果

    这里是重点,<ripple>是API21才有的新Tag,正是实现水波纹效果的; 其中<ripple android:color="#FF21272B" .... ...

随机推荐

  1. CDN公共资源

    SAE: http://lib.sinaapp.com/ Google: https://developers.google.com/speed/libraries/devguide?hl=zh-CN ...

  2. Commandline OpenVPN client on Mac OSX with macports

    http://www.tuicool.com/articles/FjuyQj  注:文中有些内容做了修改,特别是那个配置文件,不能直接抄着用. Most people use TunnelBrick ...

  3. MySQL快速生成本地测试数据

    利用数据的存储过程生成测试数据: 我们可以通过数据库的的 INSERT 语句直接在存储过程中向普通数据表中添加数据,但是 当我们添加到百万数据后,往普通表插入测试数据的性能就会明显降低.所以在这里建议 ...

  4. CentOS7搭建LAMP实战

    环境配置从官网下载稳定的源码包解压预编译编译编译安装启动服务 环境配置 # yum install -y vim wget links //安装一下基本工具# systemctl stop firew ...

  5. 条件随机场CRF(二) 前向后向算法评估标记序列概率

    条件随机场CRF(一)从随机场到线性链条件随机场 条件随机场CRF(二) 前向后向算法评估标记序列概率 条件随机场CRF(三) 模型学习与维特比算法解码 在条件随机场CRF(一)中我们总结了CRF的模 ...

  6. [ 搭建Redis本地服务器实践系列 ] :序言

    说起来,是在一个气候适宜的下午,虽然临近下班,不过办公室里还是充满了忙碌的身影,不时的还会从办公区传来小伙伴们为了一个需求而激烈争论的声音,自从入了互联网这个行业,说实话,也就很少休息了,当然了也不全 ...

  7. 字符流Reader和Writer

    1.Rader是字符输入流的父类. 2.Writer是字符输出流的父类. 3.字符流是以字符(char)为单位读取数据的,一次处理一个unicod. 4.字符类的底层仍然是基本的字节流. 5.Read ...

  8. PAT1120: Friend Numbers

    1120. Friend Numbers (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Two in ...

  9. iOS开发-程序的生命周期

    为了更好的管理程序,了解程序的生命周期是很有必要的. 运行结果: 1.首次启动: 2015-05-26 17:33:28.362 Live[4858:214241] 程序开始 2015-05-26 1 ...

  10. 在centos,docker中安装HeadlessChrome

    在centos6中安装chrome与chrome-driver,中间走了很多弯路,遇到很多坑,现将详细步骤总结如下.参考博客链接:https://blog.csdn.net/u013849486/ar ...