Красивые уведомления на сайте используя CSS3 и jQuery

30 Апрель 2011

Всем привет, что-то меня в последнее время все больше и больше тянет на UI разработку :) Сегодня поговорим о том как создать красивые уведомления на сайте используя CSS3, а также как их привести в действие используя jQuery. Сами уведомления имеют небольшую кастомизацию, например можно показывать или скрывать превью-картинку, также можно ставить таймер на автоматическое закрытие, и оба функционала работают на каждое уведомление в отдельности.

И так, в первую очередь нам надо будет подготовить вертску и стили, в стилях мы будем использовать свойства из CSS3, а именно такие как градиент, border-radius, box-shadow, text-shadow, и opacity.

Шаг первый. Верстка

Нам нужно подготовить верстку для контейнера уведомления, чтобы на будущее знать как именно её нам генерировать в яваскрипте для вывода. Также нам нужен контейнер, в котором будут выводиться уведомления. Сам контейнер у нас будет:

<div id="notifier-box"></div>

Верстка контейнера уведомления будет следующая:

<div class="message-wrap">
	<div class="message-box">
		<a class="message-close" href="#" title="Закрыть уведомление"></a>
		<div class="message-header">Тайтл уведомления</div>
		<div class="message-body">
			<div class="thumb"><img src="image.png"></div>
			<span>Тут будет текст уведомления</span>
		</div>
	</div>
</div>

Так, с версткой мы определились, теперь пора застайлить бы все это, как можно красивее конечно же, ведь мы же любим когда все красиво :)

Шаг второй. Стилизация

И так контейнер каждого уведомления у нас будет с темным фоном, и даже градиентом, будет отбрасывать небольшую тень, также будут закругленные углы, а текст будет иметь строгую тень, откидывающаяся на один пиксель вниз по вертикали. Заголовок уведомления будет зеленного цвета, текст уведомления серего цвета. Собственно набрасываем все это в CSS и получаем вот такой код:

#notifier-box {
	position: fixed;
	bottom: 0;
	right: 10px;
}

div.message-wrap {
	background: #111;
	
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#222222', endColorstr='#111111');
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #222), color-stop(1, #111));
	background: -moz-linear-gradient(top, #222, #111);
	background: -o-linear-gradient(#222, #111);
	
	border: 1px solid #000;
	margin: 0 0 10px 0;
	width: 300px;
	
	color: #888; font-size: 11px; font-family: Tahoma;
		
	-webkit-box-shadow: 0 0 7px #969490;
	-moz-box-shadow: 0 0 7px #969490;
	-o-box-shadow: 0 0 7px #969490;
	box-shadow: 0 0 7px #969490;
	
	-webkit-text-shadow: 0 1px 0 #000;
	-moz-text-shadow: 0 1px 0 #000;
	-o-text-shadow: 0 1px 0 #000;
	text-shadow: 0 1px 0 #000;

	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
	-o-border-radius: 5px;
	border-radius: 5px;	
}

div.message-box {
	border-top: 1px solid #666;
	padding: 10px;
	
	-webkit-border-radius: 4px;
	-moz-border-radius: 4px;
	-o-border-radius: 4px;
	border-radius: 4px;
}

div.message-box div.message-header {
	color: #61cd07; font-weight: bold; font-size: 11px;
	margin: 0 0 10px 0;
}

div.message-box a.message-close {
	background: #000 url('../images/message-close.png') center no-repeat;
	width: 15px; height: 15px;
	display: block; float: right;
	
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	-o-border-radius: 3px;
	border-radius: 3px;
	
	-webkit-opacity: .2;
	-moz-opacity: .2;
	-o-opacity: .2;
	opacity: .2;
}

div.message-box:hover a.message-close {
	-webkit-opacity: 1;
	-moz-opacity: 1;
	-o-opacity: 1;
	opacity: 1;
}

div.message-box div.message-body {
	overflow: hidden;
}

div.message-box div.message-body div.thumb {
	width: 48px;
	height: 48px;
	margin: 0 10px 0 0;
	float: left;
	
	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
	-o-border-radius: 5px;
	border-radius: 5px;
}

div.message-box div.message-body div.thumb img {
	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
	-o-border-radius: 5px;
	border-radius: 5px;
}

Теперь открываем браузер и радуемся результату, но это еще не все, осталось оживить все это дело.

Шаг третий. Оживление на jQuery

И так, со стороны jQuery нам нужно сделать плагин для простого способа создавать уведомления и манипулирования ими. Плагин будет находить контейнер стека уведомлений, если не найдет тогда создаст, затем будем собирать верстку контейнера уведомления с переданными данными. Получившийся результат будет вставляться в стек уведомлений.

(function($) {
	$.jnotify = function(title, text, pictureSrc, options) {
		var stackContainer, messageWrap, messageBox, messageBody, messageTextBox, closeButton, messagePicture, image;

		options = $.extend({
			lifeTime: 0,
			click: undefined
		}, options);
		
		// находим контейнер с сообщениями, если его нет, тогда создаём
		stackContainer = $('#notifier-box');
		if (!stackContainer.length) {
			stackContainer = $('<div>', {id: 'notifier-box'}).prependTo(document.body);
		}

		// создаём элементы вертски контейнера сообщения
		messageWrap = $('<div>', {
			className: 'message-wrap',
			css: {
				display: 'none'
			}
		});

		messageBox = $('<div>', {
			className: 'message-box'
		});

		messageHeader = $('<div>', {
			className: 'message-header',
			text: title
		});

		messageBody = $('<div>', {
			className: 'message-body'
		});

		messageTextBox = $('<span>', {
			text: text
		});
		
		closeButton = $('<a>', {
			className: 'message-close',
			href: '#',
			title: 'Закрыть уведомление',
			click: function() {
				$(this).parent().parent().fadeOut(300, function() {
					$(this).remove();
				});
			}
		});

		// если указан путь к картинке, тогда создадим контейнер и для неё :)
		if (pictureSrc != undefined) {
			messagePicture = $('<div>', {
				className: 'thumb'
			});
			image = $('<img>', {
				src: pictureSrc
			});
		}

		// теперь расположим все на свои места
		messageWrap.appendTo(stackContainer).fadeIn();
		messageBox.appendTo(messageWrap);
		closeButton.appendTo(messageBox);
		messageHeader.appendTo(messageBox);
		messageBody.appendTo(messageBox);

		if (messagePicture != undefined) {
			messagePicture.appendTo(messageBody);
			image.appendTo(messagePicture);
		}
		messageTextBox.appendTo(messageBody);

		// если время жизни уведомления больше 0, ставим таймер
		if (options.lifeTime > 0) {
			setTimeout(function() {
				$(messageWrap).fadeOut(300, function() {
					$(this).remove();
				});
			}, options.lifeTime);
		}
		
		// если установлен колбек
		if (options.click != undefined) {
			messageWrap.click(function(e) {
				if (!jQuery(e.target).is('.message-close')) {
					options.click.call(this);
				}
			});
		}
		
		return this;
	}
})(jQuery);

Ну вот теперь у нас есть готовый код, для добавления уведомлений на вашем сайте. Как видите по коду я добавил еще возможность привязать колбек на клик по уведомлению. Данный колбек может быть пригодным, например если необходимо открыть новую вкладку в браузере или редиректить, когда пользователь кликает на уведомление.

Шаг четвертый. Подготовка к работе

Теперь у нас есть всё для полной работоспособности уведомлений. Осталось накинуть пробный исходник HTML кода, чтобы для новичков в этом деле было понятно как запускать такое чудо. Собственно вот и сам код, с пояснительными комментариями:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>Notification messages</title>

	<link href="css/base.css" rel="stylesheet" type="text/css" />
	
	<!-- Подключаем стили уведомлений -->
	<link href="css/jnotifier.css" rel="stylesheet" type="text/css" />
	
	<!-- Подключаем jQuery -->
	<script src="js/jquery.min.js" type="text/javascript"></script>
	
	<!-- Подключаем наш плагин -->
	<script src="js/jnotifier.jquery.js" type="text/javascript"></script>
	
	<script type="text/javascript">
	function showMesssage() {
		// тут мы вызываем уведомление, без таймера и без колбека
		$.jnotify(
			'Сообщение от Василия Пупкина', 
			'Это просто обычный текст для проверки работы jQuery-плагина сообщений уведомлений. Кстати, знаете ли вы, что в Европе признано считать людей с ...',
			'image.png'
		);
	}
	</script>
</head>
<body>
	<!-- При клике показываем уведомление -->
	<a href="javascript:showMesssage();">Показать уведомление</a>
</body>
</html>

Собственно, на этом можно и закончить, надеюсь урок вам понравился. Подписывайтесь на RSS, ибо дальше статьи и уроки будут еще вкуснее и полезней :)

Комментарии к записи

  • 23 Май 2011

    Это супер сайт! Очень полезный!! Спасибо автору :)

    • 24 Май 2011

      Спасибо за приятный отзыв :) Скоро ждите еще вкусных статеек, жаль что немного времени сейчас не хватает на бложек :)

  • Osiris
    1 Июнь 2011

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

    • 12 Июнь 2011

      Такой эффект можно использовать для уведомления о фоновых действиях на сайте, а вот уведомление о добавлении товара в корзину думаю лучше уведомлять таким образом .

  • 8 Июль 2011

    А можно к уведомлению привязать звук?

    • 10 Июль 2011

      Естественно, нужно добавить элемент audio на страницу (либо embed если не HTML5) и воспроизводить (без репита) при показе уведомлений.

  • Артем
    12 Октябрь 2011

    Сайт просто супер!!! Автору респект

  • JoHn
    11 Январь 2012

    Помогите пожалуйста доделать этот замечательный скрипт:
    1) Переделать, что бы работал с последним jQuery. Сейчас не работает ;((
    2) Добавить возможность повесить callback-функцию на кнопку закрытия окна.

    Второе не так принципиально, как первое

    • JoHn
      11 Январь 2012

      Ага. С первым разобрался надо просто className заменить на class

    • 12 Январь 2012

      Позже добавлю в статью.

  • Oleg
    12 Февраль 2012

    Спасибо вам за вашу работу!
    Подскажите пожалуйста, как мне сделать чтоб уведомление автоматически появлялось при загрузке страницы?

  • Сергей
    16 Март 2012

    Скажите, а что влияет на месторасположение окна? Как можно его выводить не справа а слева страницы ? Спасибо.

    • 16 Март 2012

      Отвечает за это CSS. В CSS у #notifier-box изменить right: 10px; на left: 10px; и будет отображаться слева.

  • Сергей
    16 Март 2012

    Спасибо большое, а можно еще вопрос. Как сделать чтоб был коллбек и исчезающее через 3 секунды. Параметров ведь всего 4.

    • 16 Март 2012

      Вот так вот:

      $.jnotify('Сообщение', 'текст', 'image.png', {lifeTime: 4000, click: function () { /* тут ваш код колбека */ }});
  • Сергей
    16 Март 2012

    Большое человеческое спасибо. Добавил в закладки Ваш сайт. За такой сервис и скорость ответов отплачу кликами по баннерам. Спасибо.

  • Regnar
    7 Май 2012

    А как добавить два, три и более уведомлений со временем и разным текстом?

    • 8 Май 2012

      Вызвать нужное количестве раз функцию с разными параметрами, которые вам необходимы.

    • Regnar
      8 Май 2012

      Спасибо!

  • manj
    10 Май 2012

    можно ли вывести в уведомлении информацию об изменении базы?
    например в базу добавляю запись, а в уведомлении : «В базу успешно добавлен: ИВАНОВ ИВАН ИВАНОВИЧ «

    • 11 Май 2012

      Вы можете выводить всё, что вам угодно, просто вызывайте функцию на странице, когда, что либо добавляете в базу.

  • Сергей Ракипов
    29 Июнь 2012

    А как можно сделать что бы эффект был всего одни раз, особенно с последней ссылкой

    • 2 Июль 2012

      Т.е. один раз? Достаточно один раз вызвать функцию.

  • 16 Сентябрь 2012

    Добрый день, а возможно ли сделать так, чтобы сообщение открывалось не при клике на ссылку, а примерно так http://demo.sofcase.net/jnotifier/?showDefaultMessage=true , переходит человек по ссылке и ему покажут окошко.

    • 23 Сентябрь 2012
      <?php if (isset($_GET['showDefaultMessage'])) { ?>
      Тут js код
      <?php } ?>
      
    • 25 Октябрь 2012

      А можно как-нибудь сделать чтобы код появлялся по тому же принципу только на JavaScript или на Jquery?

Оставьте свой комментарий