Js click the button to implement the Water ripple effect code (CSS3 and Canves), css3canves

Source: Internet
Author: User

Js click the button to implement the Water ripple effect code (CSS3 and Canves), css3canves

Recently, I saw a good button click effect. When I click it, it produces a ripple effect, which is quite interesting. So I implemented it simply (without considering the compatibility of earlier browsers)

Let's take a look at the effect, for example, (the gif recording software is a little scum and looks like kakaka ...)

 

This effect can be implemented by nested canves in the element, or by css3.

Canves implementation

I picked a canves implementation code on the internet, slightly removed some repetitive styles and provided js comments. The Code is as follows:

Html code: <a class = "btn color-1 material-design" data-color = "#2f5398"> Press me! </A>

Css code:

* { box-sizing: border-box; outline: none;}body { font-family: 'Open Sans'; font-size: 100%; font-weight: 300; line-height: 1.5em; text-align: center;}.btn { border: none; display: inline-block; color: white; overflow: hidden; margin: 1rem; padding: 0; width: 150px; height: 40px; text-align: center; line-height: 40px; border-radius: 5px;}.btn.color-1 { background-color: #426fc5;}.btn-border.color-1 { background-color: transparent; border: 2px solid #426fc5; color: #426fc5;}.material-design { position: relative;}.material-design canvas { opacity: 0.25; position: absolute; top: 0; left: 0;}.container { align-content: center; align-items: flex-start; display: flex; flex-direction: row; flex-wrap: wrap; justify-content: center; margin: 0 auto; max-width: 46rem;}

Js Code:

Var canvas ={}, centerX = 0, centerY = 0, color = '', containers = document. getElementsByClassName ('material-Design') context ={}, element ={}, radius = 0, // generate the requestAnimationFrame animation requestAnimFrame = function () {return (window. requestAnimationFrame | window. required requestanimationframe | window. oRequestAnimationFrame | window. msRequestAnimationFrame | function (callback) {window. setTimeout (callback, 1000/60) ;}}(), // generate canves init = function () {containers = Array for each specified element. prototype. slice. call (containers); for (var I = 0; I <containers. length; I + = 1) {canvas = document. createElement ('canvas '); canvas. addEventListener ('click', press, false); containers [I]. appendChild (canvas); canvas. style. width = '000000'; canvas. style. height = '20180101'; canvas. width = canvas. offsetWidth; canvas. height = canvas. offsetHeight ;}}, // click to obtain the required data, such as click coordinates, element size, color press = function (event) {color = event. toElement. parentElement. dataset. color; element = event. toElement; context = element. getContext ('2d '); radius = 0; centerX = event. offsetX; centerY = event. offsetY; context. clearRect (0, 0, element. width, element. height); draw () ;}, // draw a circle and execute the animation draw = function () {context. beginPath (); context. arc (centerX, centerY, radius, 0, 2 * Math. PI, false); context. fillStyle = color; context. fill (); radius + = 2; // By judging that the radius is smaller than the element width, draw a circle with radius + = 2 if (radius <element. width) {requestAnimFrame (draw) ;}}; init ();

CSS3 implementation 

The next step is the pure-handed code... I think it is more convenient to implement css3. It may be because css is used to writing...

Html code

<A class = "waves ts-btn"> Press me! </A>

Css code

.waves{  position:relative;  cursor:pointer;  display:inline-block;  overflow:hidden;  text-align: center;  -webkit-tap-highlight-color:transparent;  z-index:1;}.waves .waves-animation{  position:absolute;  border-radius:50%;  width:25px;  height:25px;  opacity:0;  background:rgba(255,255,255,0.3);  transition:all 0.7s ease-out;  transition-property:transform, opacity, -webkit-transform;  -webkit-transform:scale(0);  transform:scale(0);  pointer-events:none}.ts-btn{  width: 200px;  height: 56px;  line-height: 56px;  background: #f57035;  color: #fff;  border-radius: 5px;}

Js Code

Document. addEventListener ('domainloaded', function () {var duration = 750; // style string patchwork var forStyle = function (position) {var cssStr = ''; for (var key in position) {if (position. hasOwnProperty (key) cssStr + = key + ':' + position [key] + ';}; return cssStr ;} // obtain the mouse click position var forRect = function (target) {var position = {top: 0, left: 0}, ele = document.doc umentElement; 'undefined '! = Typeof target. getBoundingClientRect & (position = target. getBoundingClientRect (); return {top: position. top + window. pageYOffset-ele. clientTop, left: position. left + window. pageXOffset-ele. clientLeft} var show = function (event) {var pDiv = event.tar get, cDiv = document. createElement ('div '); pDiv. appendChild (cDiv); var rectObj = forRect (pDiv), _ height = event. pageY-rectObj. top, _ left = Event. pageX-rectObj. left, _ scale = 'scale ('+ pDiv. clientWidth/100*10 + ')'; var position = {top: _ height + 'px ', left: _ left + 'px'}; cDiv. className = cDiv. className + "waves-animation", cDiv. setAttribute ("style", forStyle (position), position ["-webkit-transform"] = _ scale, position ["-moz-transform"] = _ scale, position ["-ms-transform"] = _ scale, position ["-o-transform"] = _ scale, position. t Ransform = _ scale, position. opacity = "1", position ["-webkit-transition-duration"] = duration + "ms ", position ["-moz-transition-duration"] = duration + "ms", position ["-o-transition-duration"] = duration + "ms ", position ["transition-duration"] = duration + "ms", position ["-webkit-transition-timing-function"] = "cubic-bezr (0.250, 0.460, 0.450, 0.940) ", position ["-moz-transition-timing-function "] = "Cubic-besuppliers (0.250, 0.460, 0.450, 0.940)", position ["-o-transition-timing-function"] = "cubic-besuppliers (0.250, 0.460, 0.450, 0.940) ", position [" transition-timing-function "] =" cubic-bezr (0.250, 0.460, 0.450, 0.940) ", cDiv. setAttribute ("style", forStyle (position); var finishStyle = {opacity: 0, "-webkit-transition-duration": duration + "ms ", // transition time "-moz-transition-duration": duration + "ms ", "-O-transition-duration": duration + "ms", "transition-duration": duration + "ms", "-webkit-transform": _ scale, "-moz-transform": _ scale, "-ms-transform": _ scale, "-o-transform": _ scale, top: _ height + "px ", left: _ left + "px",}; setTimeout (function () {cDiv. setAttribute ("style", forStyle (finishStyle); setTimeout (function () {pDiv. removeChild (cDiv) ;}, duration) ;}, 100)} document. querySelector ('.Wav es '). addEventListener ('click', function (e) {show (e );},! 1 );},! 1 );

In this case, the principle is also simple. Get the Click location> Add style. By the way, happy Mid-Autumn Festival ~

The above is all the content of this article. I hope it will be helpful for your learning and support for helping customers.

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.