افکت زیبا برای دکمه - Distorted Button Effects (نمونه 4)

زمان مطالعه: ۵ دقیقه
۱۴ آبان ۱۳۹۶

در این مطلب نمونه 4 از افکت زیبا برای دکمه یا Button با عنوان Distorted Button Effects رو در اختیارتون میزارم و امیدوارم که بدردتون بخوره و بتونین از اون در سایتتون استفاده کنید. زمانی که بر روی دکمه های مورد نظر کلیک میکنید، به زیبایی تغییر شکل میدن و افکت زیبایی رو به نمایش میزارن.

همونطور که در دمو مشاهده کردید، یک دکمه بنام Click وجود داره و زمانی که بر روی اون هاور و کلیک میکنید، به زیبایی تغییر شکل میده و بصورت ژله ای در میاد. برای حالت ژله ای شدن از SVG استفاده شده است. میتونین کد مربوط به این افکت رو در زیر مشاهده کنید.

کدهای مربوط به این افکت

کد HTML :

<section class="section">
	<h3 class="section__title">04</h3>
	<svg xmlns="http://www.w3.org/2000/svg" version="1.1" class="svg-filters">
		<defs>
			<filter id="filter-goo-4">
				<feGaussianBlur in="SourceGraphic" stdDeviation="7" result="blur" />
				<feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 19 -9" result="goo" />
			</filter>
		</defs>
	</svg>
	<button id="component-4" class="button button--4">
		click
		<span class="button__bg" style="filter: url('#filter-goo-4')">
		<span class="blob"></span>
		<span class="blob"></span>
		<span class="blob"></span>
		<span class="blob"></span>
		</span>
	</button>
</section>

کد CSS :

*,
*:after,
*:before {
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
}
body {
  font-family: Avenir, 'Helvetica Neue', 'Lato', 'Segoe UI', Helvetica, Arial, sans-serif;
  color: #222;
  background: #f6f6f6;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
.section {
	width: 400px;
	height: 400px;
	margin: 0 auto;
}

.section__title {
  font-size: 5em;
  font-weight: 900;
  letter-spacing: -0.05em;
  margin: 0 0 1em 0;
  color: #ddd;
  position: relative;
  text-align: left;
  width: 100%;
}

.section__title::before {
  content: '';
  position: absolute;
  top: 1.15em;
  width: 40%;
  height: 0.1em;
  background: #ddd;
  left: 0;
}

.svg-filters {
  position: absolute;
  visibility: hidden;
  width: 1px;
  height: 1px;
}

.button {
	cursor: pointer;
}

.button--1, .button--1 .button__bg, .button--2, .button--4, .button--4 .button__bg, .button--5, .button--6, .button--7, .button--8, .button--9, .button--10 {
  -webkit-font-smoothing: antialiased;
  background-color: #222;
  border: none;
  display: inline-block;
  font-family: 'Montserrat', sans-serif;
  font-size: 0.85em;
  font-weight: 700;
  text-decoration: none;
  user-select: none;
  letter-spacing: 0.1em;
  color: white;
  padding: 20px 40px;
  text-transform: uppercase;
  transition: background-color 0.1s ease-out;
}

.button--1:hover, .button--1 .button__bg:hover, .button--2:hover, .button--4:hover, .button--4 .button__bg:hover, .button--5:hover, .button--6:hover, .button--7:hover, .button--8:hover, .button--9:hover, .button--10:hover {
  background-color: #2CD892;
  color: #fff;
}

.button--1:focus, .button--1 .button__bg:focus, .button--2:focus, .button--4:focus, .button--4 .button__bg:focus, .button--5:focus, .button--6:focus, .button--7:focus, .button--8:focus, .button--9:focus, .button--10:focus {
  outline: none;
  color: #fff;
}

/* Indivudual styles */
.button--4 {
  position: relative;
  z-index: 1;
  width: 80px;
  height: 80px;
  line-height: 80px;
  padding: 0;
  background: none;
}

.button--4:hover {
  background: none;
}

.button--4:focus {
  outline: none;
}

.button--4:active .button__bg {
  transform: scale(0.8);
}

.button--4 .button__bg {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  outline: 90px solid transparent !important;
  padding: 0;
  border-radius: 100px;
  -webkit-transform: translateZ(0);
  -moz-transform: translateZ(0);
  -ms-transform: translateZ(0);
  -o-transform: translateZ(0);
  transform: translateZ(0);
  background: none;
  font-weight: bold;
  z-index: -2;
  -webkit-transition: all 0.1s ease-out;
  -moz-transition: all 0.1s ease-out;
  transition: all 0.1s ease-out;
}

.button--4 .button__bg:hover {
  background: none;
}

.button--4 .blob {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: auto;
  width: 100%;
  height: 100%;
  border-radius: 70px;
  opacity: 0.3;
  background: #222;
  -webkit-transition: background 0.1s ease-out;
  -moz-transition: background 0.1s ease-out;
  transition: background 0.1s ease-out;
  z-index: -1;
  pointer-events: none;
}

.button--4 .blob:first-child {
  opacity: 1;
}

.button--4 .blob:nth-child(n+2) {
  width: 100%;
  height: 100%;
}

کد JS:

در این مطلب از TweenMax استفاده شده است.

function getRandom(min, max){
  return Math.random() * (max - min) + min;
}

// Remove click on button for demo purpose
document.querySelector('.button').addEventListener('click', function(e) {
	e.preventDefault();
});

initBt4();

// Button 4
function initBt4() {
  var bt = document.querySelectorAll('#component-4')[0];
  var bg = document.querySelectorAll('#component-4 .button')[0];
  var blob = document.querySelectorAll('#component-4 .blob');
  var filter = document.querySelector('#filter-goo-4 feGaussianBlur');

  bt.addEventListener('mousemove', function(e) {
    var x = (e.pageX - bt.offsetLeft - bt.offsetWidth / 2) * 0.6;
    var y = (e.pageY - bt.offsetTop - bt.offsetHeight / 2) * 0.6;

    TweenLite.to(blob[1], 4.2, { x: x, y: y, ease: Elastic.easeOut.config(1, 0.1) });
    TweenLite.to(blob[2], 2.8, { x: x, y: -y, ease: Elastic.easeOut.config(1, 0.1) });
    TweenLite.to(blob[3], 2.8, { x: -x, y: -y, ease: Elastic.easeOut.config(1, 0.1) });
    TweenLite.to(filter, 5, { onUpdate: function() { filter.setAttribute('x', 0); }});
  });

  bt.addEventListener('mouseup', function(e) {
    var x = e.pageX - bt.offsetLeft - blob[0].offsetWidth / 2;
    var y = e.pageY - bt.offsetTop - blob[0].offsetHeight / 2;

    var dirX = Math.random() > 0.5 ? -1 : 1;
    var dirY = Math.random() > 0.5 ? -1 : 1;
    var r = getRandom(60, 80);
    
    Array.prototype.slice.call(blob, 1).forEach(function(bt) {
      var tl = new TimelineLite();
      tl.to(bt, 1.2, { x: dirX * r * Math.random() + '%', y: dirY * r * Math.random() + '%', ease: Elastic.easeOut.config(1, 0.2) });
      tl.to(bt, 1.2, { x: '0%', y: '0%', ease: Elastic.easeOut.config(1, 0.2) }, '-=1.1');
    });
  });
}

امیدوارم خوشتون بیاد.

موفق باشید. یا علی

Source

نویسنده
بسیار به طراحی وب علاقمندم و به سرعت در حال یادگیری تمام مباحث پیشرفته هستم و دوست دارم که به دیگران هم یاد بدهم.

نظرات کاربران

مهرداد نادری

بسیار عالی و کار بردی???

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :

 
گزارش مشکل