Pull to refresh

Бьющееся сердце на CSS3

Reading time 4 min
Views 22K
Доброго времени суток, уважаемый хабражитель! Сегодня я покажу Вам безграничные возможности CSS и научу при их помощи создать красивое пульсирующее сердце.

image



ШАГ 1: Пишем HTML документ


Приступим к работе. Начнём с написания HTML-кода. Для создания нашего сердца нужен всего лишь один пустой блочный элемент, которому мы дадим класс heart.
<div class="heart"></div>
Это всё, что нам понадобится сейчас.



ШАГ 2: Как нарисовать сердце?


По схеме приведённой на рисунке ниже мы будем рисовать наше сердце. Подробнее алгоритм прорисовки описан в следующих шагах.
image


ШАГ 3: Начинаем рисовать


Зададим нашему блоку размер 100х100px, красну рамку толщиной в 1 пиксель и уберём рамку сверху и слева. Для псевдо-элементов .heart:before и .heart:after мы зададим размеры 70х100px, такую же красную рамку в 1 пиксель, уберём рамку справа, а также заокруглим левый верхний и левый нижний углы радиусом 50px.
.heart {
	position: relative;
	width: 100px;
	height: 100px;
	border: solid 1px red;
	border-top: none;
	border-left: none;
}

.heart:before, .heart:after {
	position:absolute;
	content: ' ';
	-webkit-border-radius: 50px 0 0 50px; /* для Chrome и Safari */
	-moz-border-radius: 50px 0 0 50px; /* для Firefox */ 
	border-radius: 50px 0 0 50px;
	width: 70px;
	height: 100px;
	border: solid 1px red;
	border-right: none;
}



ШАГ 4: Появление сердца


В итоге у нас получилось несколько непонятных линий. Для того чтобы сделать из них нужное для нас сердце нужно сделать следующее:
  • Повернуть псевдо-элемент .heart:after на 90o используя свойство transform: rotate(90deg);
  • Сместить псевдо-єлементы .heart:before и .heart:after так чтобы наш блочный элемент принял форму сердца;
  • Повернуть блочный элемент на 45o.

В результате у нас получится следующий код:
.heart {
	position: relative;
	width: 100px;
	height: 100px;
	-webkit-transform: rotate(45deg);  /* для Chrome и Safari */
	-moz-transform: rotate(45deg); /* для Firefox */ 
	-o-transform: rotate(45deg); /* для Opera */ 
	transform: rotate(45deg);
	border: solid 1px red;
	border-top: none;
	border-left: none;
}

.heart:before, .heart:after {
	position:absolute;
	content: ' ';
	-webkit-border-radius: 50px 0 0 50px;
	-moz-border-radius: 50px 0 0 50px;
	border-radius: 50px 0 0 50px;
	width: 70px;
	height: 100px;
	border: solid 1px red;
	border-right: none;
	left:-70px;
}
.heart:after {
	position: absolute;
	left: 15px;
	top: -85px;
	-webkit-transform: rotate(90deg);
	-moz-transform: rotate(90deg);
	-o-transform: rotate(90deg);
}
То что у нас получилось выглядит так:
image


ШАГ 5: Делаем фон


Чтобы наше сердце стало красивее мы рыскрасим его с помощью градиентов. Так как официально CSS3 не утверждён и ни один браузер его полностью не поддерживает, то градиенты я прописал отдельно для нескольких браузеров.
Градиент для тела самого блока:
.heart {
	background: red;
		/* для браузеров, которые не поддерживают градиент */
	background: -webkit-radial-gradient(115% 50%, 75px 110px, #8B0000, #8B0000, red);
		/* для Chrome и Safari */
	background: -moz-radial-gradient(170% 50%, circle , #8B0000 0%, #8B0000 52%,  red 76%);
		/* для Firefox */
	background: -o-radial-gradient(115% 50%, 75px 110px, #8B0000, #8B0000, red);
		/* для Opera */
	background: radial-gradient(115% 50%, 75px 110px, #8B0000, #8B0000, red);
		/* по стандартам CSS3 */
}

Гадиент для псевдо-элемента .heart:before:
.heart:before {
	background: red;
	background: -webkit-radial-gradient(15% 50%, 65px 65px, #FFE4E1, red);
	background: -moz-radial-gradient(15% 50%, circle, #FFE4E1, red 85%);
	background: -o-radial-gradient(15% 50%, 65% 65%, #FFE4E1, red);
	background: radial-gradient(15% 50%, 65% 65%, #FFE4E1, red);
}

Гадиент для псевдо-элемента .heart:before:
.heart:after {
	background: red;
	background: -webkit-radial-gradient(50% 80%, 85px 80px, #FFB6C1, red, #8B0000);
	background: -moz-radial-gradient(50% 80%, circle, #FFB6C1, red, #8B0000 90%);
	background: -o-radial-gradient(50% 80%, 85px 80px, #FFB6C1, red, #8B0000);
	background: radial-gradient(50% 80%, 85px 80px, #FFB6C1, red, #8B0000);
}

Градиенты подобраны лично мною методом научного тыка ;)
Браузеры, которые по каким то непонятным причинам не понимают CSS3-градиенты, будут видеть просто красное сердечко.


ШАГ 6: Заставим наше сердце биться


Теперь попытаемся заставить наше сердечко биться. В этом нам поможет чудесное свойство CSS3 — animation. В нём записывается название так называемого кейфрейма (в нём описано как изменяются стили элемента во время анимации), длительность анимации, количество повторений и т.п.
Чтобы указать браузеру что он должен анимировать наш элемент в классе .heart напишем:
.heart {
	animation-name: 'anime';
		/* имя кейфрейма для анимации */
	animation-duration: 300ms;
		/* длительность анимации */
	animation-iteration-count: infinite;
		/* количество повторений, в данном случае - бесконечно */
	animation-direction: alternate;
		/* проигрывать анимацию в прямом и в обратном порядке */
	animation-timing-function: ease-in;
		/* вычисление временных промежутков для анимации, в данном случае анимация ускоряется */
}

Теперь напишем наш кейфрейм для анимации. В нём мы напишем что элемент во время анимации должен увеличиваться в 1,1 раза, а потом возвращаться к исхожному размеру. Не забываем о том, что элемент мы повернули на 45o.
@keyframes 'anime' {
	from {
		transform: scale(1) rotate(45deg);
	}
	to {
		transform: scale(1.1) rotate(45deg);
	}
}



ШАГ 7: Вопросы кроссбраузерности


Дело в том что браузеры пока что не поддерживают большинство нативных свойств CSS3, а имеют свои аналоги под своими названиями. Поэтому для многих свойств нам приходиться в начале писать префиксы типа -webkit- или -moz-.
Для разных браузеров свои префиксы:
  • -webkit- для браузеров на движке Webkit (Chrome, Safari);
  • -moz- для браузеров на движке Gecko (Firefox, SeaMonkey);
  • -o- для браузеров на движке Presto (Opera, Nintendo DS Browser);
Для того чтобы наша анимация работала в разных браузерах (а работать она будет в Chrome, Safari 5 и Firefox), нам нужно блоки с анимацией написать с разными префиксами. Рассмотрим случай для браузера Google Chrome:
.heart {
	-webkit-animation-name: 'anime';
	-webkit-animation-duration: 300ms;
	-webkit-animation-iteration-count: infinite;
	-webkit-animation-direction: alternate;
	-webkit-animation-timing-function: ease-in;
}
@-webkit-keyframes 'anime' {
	from {
		-webkit-transform: scale(1) rotate(45deg);
	}
	to {
		-webkit-transform: scale(1.1) rotate(45deg);
	}
}

Обратите внимание, что при написании кейфрейма для браузеров на движке Gecko, кавычки в имени кейфрейма ставить не нужно.


Результат


Результат как по мне потрясающий: красиво, изящно, просто. Демо вы можете посмотреть тут.
Корректно будет работать в Mozilla Firefox 4.0+, Safari 4, Google Chrome 3.0+. В Opera начиная с версии 12 будут видны лишь градиенты.

P.S.: Мне кажется, что данное сердечко будет отличным подарком девушке-айтишнице на День влюблённых. Как вы считаете?
Tags:
Hubs:
+52
Comments 40
Comments Comments 40

Articles