Эффект Bubble с помощью CSS

Под эффектом Bubble, я имею в виду "всплытие" картинки на передний план, на подобии того, как это сделано в в операционных системах от Apple. В этой статье я расскажу вам как сделать меню с эффектом Bubble, используя только возможности CSS. И хотя этот метод лишён красивого перехода, как у Apple, он поможет вам сделать меню немного красивее. В статье описано два метода: CSS-спрайты (простейший метод) и метод подмена картинки (более продвинутый).

Первый метод: CSS-спрайты

Самый простой способ сделать эффект Bubble - это использовать CSS-спрайты. Всё что вам нужно сделать - это изменить фон картинки.

Но для начала напишем HTML:

<ul id="bubble"> <li> <a class="icon feed" href="#" title="Full RSS Feed">Full RSS Feed</a> </li> <li> <a class="icon email" href="#" title="Feed via Emal">Feed via email</a> </li> <li> <a class="icon twitter" href="#" title="Full RSS Feed">Follow me on Twitter</a> </li> <li> <a class="icon facebook" href="#" title="Full RSS Feed">I'm on Facebook</a> </li> <li> <a class="icon delicious" href="#" title="Full RSS Feed">Save me</a> </li> <li> <a class="icon technorati" href="#" title="Full RSS Feed">Fave me</a> </li> </ul>

Теперь готовим картинки для спрайтов. Они должны выглядеть следующим образом:

Prepare the image for css sprites

Осталось написать CSS-стили, чтобы сделать для пунктов меню фоновые изображения:

#bubble { list-style : none; margin : 0px; padding : 0px; } #bubble li { display : inline-block; margin : 0px; padding : 0px; } #bubble li a.icon { background : url(sprites.png) no-repeat; border : none; display : block; width : 128px; height : 128px; text-indent : -9999px; }

Следующий шаг - написать стиль для наведённых ссылок. Этот стиль будет сдвигать фоновое изображение, создавая таким образом эффект всплытия картинки.

#bubble li a.feed { background-position: -139px -12px; } #bubble li a.feed:hover { background-position: -13px -12px; } #bubble li a.email { background-position: -139px -149px; } #bubble li a.email:hover { background-position: -13px -149px; } #bubble li a.twitter { background-position: -139px -283px; } #bubble li a.twitter:hover { background-position: -13px -283px; } #bubble li a.facebook { background-position: -139px -422px; } #bubble li a.facebook:hover { background-position: -13px -422px; } #bubble li a.delicious { background-position: -139px -559px; } #bubble li a.delicious:hover { background-position: -13px -559px; } #bubble li a.technorati { background-position: -139px -698px; } #bubble li a.technorati:hover { background-position: -13px -698px; }

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

Второй метод: подмен картинки.

Для реализации этого метода, нужно написать немного больше HTML-разметки, но меньше стилей в CSS. Поскольку для каждой ссылки мы используем по две картинки, наш HTML будет выглядеть так:

<ul id="bubble2"> <li><a href="#" title="Full RSS Feed"> <img class="small" src="feed.png" alt="Full RSS" /> <img class="large" src="feed_large.png" alt="Full RSS" /> </a></li> <li><a href="#" title="Feed via Emal"> <img class="small" src="email.png" alt="Feed via Emal" /> <img class="large" src="email_large.png" alt="Feed via Emal" /> </a></li> <li><a href="#" title="Follow me on Twitter"> <img class="small" src="twitter.png" alt="Follow me on Twitter" /> <img class="large" src="twitter_large.png" alt="Follow me on Twitter" /> </a></li> <li><a href="#" title="I'm on Facebook"> <img class="small" src="facebook.png" alt="I'm on Facebook" /> <img class="large" src="facebook_large.png" alt="I'm on Facebook" /> </a></li> <li><a href="#" title="Save me"> <img class="small" src="delicious.png" alt="Save me" /> <img class="large" src="delicious_large.png" alt="Save me" /> </a></li> <li><a href="#" title="Fave me on Technorati"> <img class="small" src="technorati.png" alt="Fave me on Technorati" /> <img class="large" src="technorati_large.png" alt="Fave me on Technorati" /> </a></li> </ul>

В этом методе мы сделаем кое-какие изменения. При наведении мыши пункт меню будет "всплывать" над соседними пунктами. Разница с первым методом состоит в том, что сейчас необходимо задать ширину и высоту для элементов <li>. Иначе их размеры будут меняться при подмене картинки. Итак, файл CSS будет выглядеть так:

#bubble2 { list-style : none; margin : 20px 0px 0px; padding : 0px; } #bubble2 li { display : inline-block; margin : 0px 5px; padding : 0px; width : 72px; height : 72px; }

72px - это высота маленького изображения.

CSS для ссылок:

#bubble2 li a img { position : relative; border : none; } #bubble2 li a img.large { display : none; } #bubble2 li a:hover img.small { display : none; z-index : 0; } #bubble2 li a:hover img.large { display : block; margin-top : -28px; margin-left : -28px; z-index : 1000; }

Не забудьте установить свойство position в значение relative, потому что нам необходимо использовать свойство z-index, а это свойство работает только при абсолютном или относительном позиционировании элемента.

native image changing

Для того, чтобы при наведении мыши, картинка выводилась по центру, мы будем устанавливать отрицательный внешний отступ, равный -28px. Это очень важно, для того чтобы получился эффект увеличения. Значения отступов рассчитывается так:
margin-top= – ([высота большой картинки] – [высота маленькой картинки])/2
и
margin-left= – ([ширина большой картинки] – [ширина маленькой картинки])/2.

Для того, чтобы меню работало корректно в IE, добавим ещё один стиль в HTML:

<!--[if IE 7]> <style type="text/css"> #bubble li, #bubble2 li { display: inline; } </style> <![endif]-->

Бонус. Делаем тоже самое, используя CSS3.

В CSS3 есть такое свойство как transform, одним из возможных значений которого является функция scale. С помощью этого свойства мы можем значительно уменьшить количество кода. Смотрим.

HTML

<ul id="bubble3"> <li><a href="#" title="Full RSS Feed"> <img src="feed_large.png" alt="Full RSS" /> </a></li> <li><a href="#" title="Feed via Emal"> <img src="email_large.png" alt="Feed via Emal" /> </a></li> <li><a href="#" title="Follow me on Twitter"> <img src="twitter_large.png" alt="Follow me on Twitter" /> </a></li> <li><a href="#" title="I'm on Facebook"> <img src="facebook_large.png" alt="I'm on Facebook" /> </a></li> <li><a href="#" title="Save me"> <img src="delicious_large.png" alt="Save me" /> </a></li> <li><a href="#" title="Fave me on Technorati"> <img src="technorati_large.png" alt="Fave me on Technorati" /> </a></li> </ul>

CSS

#bubble3 { list-style : none; margin : 20px 0px 0px; padding : 0px; } #bubble3 li { display : inline-block; margin : -28px 33px 0 -28px; padding : 0px; width : 72px; height : 72px; } #bubble3 li a img { position : relative; border : none; transform : scale(0.5625); -moz-transform : scale(0.5625); -webkit-transform: scale(0.5625); z-index : 0; } #bubble3 li a:hover img { margin-top : -28px; transform : scale(1); -moz-transform : scale(1); -webkit-transform: scale(1); z-index : 1000; } 

Пример

Опубликовано: 23.11.2009 Просмотров 22856 Ссылка на оригинал Tweet it!
8 comments  

Павел

2010.08.10 17:27

 Опера = некорректно
експлор 6.0 = полная жопа
 

Илья

2010.12.21 13:51

 Осел 6 некорректно работает со спрайтами ПНГ при использовании пнгфикса поэтому метод не будет универсальным на любых дизайнах. Для 6 ослика придется искать альтернативные способы (делать гиф или джипеги с фоном)
Ксс3 для 6 ослика также не работает - тут подойдет 1 способ.
Замена картинки для него не подойдет т.к. наследование после hover'а 6 ослик не понимает и не будет показывать. Так же возможны косяки с отобржением ПНГ картинок.
 

I.KALITA

2011.03.06 11:50

 хреново дело если так поливают грязью
 

iprit

2011.04.07 14:57

 Все норм работает
 

Не представился

2011.12.16 17:40

 почем нынче реклама на www.css-tricks.ru ?
 

basilkot

2011.12.16 17:47

  • обговаривается индивидуально, пишите что вам надо через форму обратной связи, обсудим.

Не представился

2011.12.30 08:30

 Я впечатлен! Реально информативный сайт www.css-tricks.ru , просто хотел покомментить и поддержать качество работы.
 

Не представился

2012.11.08 18:42

 для ИЕ6, вместо дизайна лучше просто прописать скриптину которая бы выводила месседж: "пожалуйста, воспользуйтесь бразуером, для открытия сайта"
 

Не представился

2015.02.09 17:09

 2010-2012 год - да когда уже этот чертов ИЕ6 подохнет! Вместе с 7, 8, и, на всякий случай, с 9.
 

Оставить после себя комментарий

user

2016.09.11

Отправить сообщение:

Email

Сообщение

Бонус на первый депозит в слоте Грейт Пигсби Мегавейс дарит тебе онлайн казино Вавада! Переходи по ссылке и получай 100 бесплатных вращений на депозит до 1000$!