核心属性: 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. python---生成器、迭代器

    # -*- coding:utf-8 -*- # LC # 列表生成式 def func(x): print(x) return 2*x print([ func(i) for i in range( ...

  2. Bootstrap 4,“未捕获错误:Bootstrap工具提示需要Tether(http://github.hubspot.com/tether/)”

    如果出现了这个错误,我想你是没有引用tether文件,这在v4之前不需要单独引入的. https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/te ...

  3. (转)java之Spring(IOC)注解装配Bean详解

    java之Spring(IOC)注解装配Bean详解   在这里我们要详细说明一下利用Annotation-注解来装配Bean. 因为如果你学会了注解,你就再也不愿意去手动配置xml文件了,下面就看看 ...

  4. MQTT入手笔记

    MQTT服务官网:http://mosquitto.org/download/ 在unix系统按照以下步骤运行并启动mqtt服务: 1. # 下载源代码包wget http://mosquitto.o ...

  5. 全文检索-Lucene.net

    Lucene.net是Lucene的.net移植版本,在较早之前是比较受欢迎的一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎. ...

  6. 使用清华源替代Ubuntu源

    sudo nano /etc/apt/source.list 替换为如下文本 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main ...

  7. 银行卡号、电话号、身份证号 EditText 自定义格式的输入框

    package com.yidian.AddSpaceEditText;import android.text.Editable;import android.text.InputFilter;imp ...

  8. 团队项目第二阶段个人进展——Day9

    一.昨天工作总结 冲刺第九天,完成图片的优化,与队友一起讨论如何合并并优化 二.遇到的问题 无 三.今日工作规划 合并后优化

  9. java客户端调用webService

    啥也不想说,以前使用的方法突然不行了.各种网搜(记得别忘记到jar包哦:axis.jar) 看代码,第一种方式,也就是以前的方式: 改方式不用表名参数名称 public static String i ...

  10. Javassist字节码增强示例

    概述 Javassist是一款字节码编辑工具,可以直接编辑和生成Java生成的字节码,以达到对.class文件进行动态修改的效果.熟练使用这套工具,可以让Java编程更接近与动态语言编程. 下面一个方 ...