 
									Идею этого эффекта я нагло стырил позаимствовал на сайте jomsocial. Там есть блоки (под кнопкой Learn More) с анонсами. При наведении мышки на эти блоки к ним добавляется картинка.
Реализовать такой эффект можно разными способами. Например, можно теги картинок вставить прямо в страницу и прятать/показывать их с помощью JavaScript.
Основное достоинство такого варианта – отсутствие задержек при появлении картинок (если конечно вы подождали пока страница полностью загрузится).
Но при этом увеличивается размер страницы и не факт, что посетитель вообще будет эти картинки рассматривать.
Поэтому я решил привести пример своей реализации этого эффекта.
Картинки будут загружаться только если посетитель наведет мышку на какой-нибудь блок с аннотацией. Естественно, что загрузка будет выполняться только один раз.
Если посетитель наведет курсор мышки на другую аннотацию, будет загружена картинка для неё, а предыдущая – исчезнет.
Говорят, что одна картинка стоит тысячи слов, поэтому я сделал демонстрационную страничку для этого примера.
Demo
Сразу же выкладываю архив с исходниками.
SourceА теперь разберем как это все работает.
Допустим у нас есть страница (index.html) со следующей разметкой.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title>Пердпросмотр с картинками</title>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <link rel="stylesheet" type="text/css" media="screen" href="styles.css" />
</head>
<body>
<div id="content">
    <div id="leftCol">
        <div id="butterfly" class="annotaionBlock">…</div>
        <div id="tiger" class="annotaionBlock">…</div>
        <div id="elephant" class="annotaionBlock">…</div>
        <div id="wolf" class="annotaionBlock">…</div>
        <div id="fish" class="annotaionBlock">…</div>
    </div>
    <div id="rightCol">
        <div id="whale" class="annotaionBlock">…</div>
        <div id="flamingo" class="annotaionBlock">…</div>
        <div id="bear" class="annotaionBlock">…</div>
        <div id="dog" class="annotaionBlock">…</div>
        <div id="cat" class="annotaionBlock">…</div>
    </div>
</div>
</body>
</html>
Сразу обратите внимание на блок content. Он состоит из двух колонок (leftCol и rightCol) в которых размещены аннотации.
Всем аннотациям присвоен CSS класс annotaionBlock и уникальный id. Этот id будет использоваться для определения нужной картинки.
Сами аннотации представляют собой обычный текст с HTML разметкой или без неё.
Теперь напишем JS скрипт, который будет подгружать картинки.
<script type="text/javascript" src="jquery-1.3.1.min.js"></script>
<script type="text/javascript">
$(function() {
    $('.annotaionBlock').hover(
        function(event) {
            var curAnnotation = $(this);
            var curId = curAnnotation.attr('id');
            var annotImg = curAnnotation.children('.annotImg');
            if (annotImg.length == 0) {
                $.get('getimage.php', {img : curId}, function(data) {
                    annotImg = $('<div class="annotImg"><img src="' + data + '" alt="Картинка" /></div>').hide();
                    curAnnotation.append(annotImg);
                    $('.annotImg').not(this).slideUp('fast');
                    annotImg.slideDown('fast');
                });
            }
            else {
                $('.annotImg').not(annotImg).slideUp('fast');
                annotImg.slideDown('fast');
            }
        },
        function() {
        }
    );
});
</script>
Прежде всего мы подключаем библиотеку jQuery и пишем функцию, которая будет вызвана сразу после загрузки страницы (строки 3-25).
В этой функции мы объявляем обработчик события hover для всех элементов страницы с классом annotaionBlock, т.е. для всех наших аннотаций.
В качестве параметров этому обработчику передается 2 функции. Первая будет вызвана при появлении мышки над блоком, вторая – при выходе из него.
Вторую функцию (строки 22-23) мы оставляем пустой, т.к. вставлять и прятать картинки будем в первой.
Алгоритм работы.
1) При появлении курсора над аннотацией, сохраняем указатель на неё и её id (строки 6-7).
2) Проверяем загружен ли рисунок для данной аннотации (строки 8-9) и если нет, выполняем AJAX запрос к серверному (PHP) скрипту, в параметрах которого передаем id блока (строки 10-15).
3) После получения ответа сервера создаем скрытый тег img и вставляем его в конец блока с аннотацией (строки 11, 12). После этого применяем эффект slideUp ко всем картинкам в блоках с аннотацией кроме текущей (строка 13). И с помощью эффекта slideDown показываем картинку для данной аннотации (строка 14).
4) Если картинка была вставлена раньше, то AJAX запрос мы не отправляем, а просто показываем её и прячем остальные (с помощью эффектов slideUp и slideDown, строки 18-19).
Обратите внимание. Если применять эффекты slideDown и slideUp непосредственно к тегу img картинка будет плавно изменять как вертикальный, так и горизонтальный размеры. Т.е. она будет «выезжать» из левого верхнего угла.
Чтобы изменялась только высота картинки нужно поместить её внутрь тега div и примерять эффекты к нему.
Серверная часть
PHP скрипт, который обрабатывает запросы на получение картинок (getimage.php) должен прочитать id запрашиваемой картинки и вернуть соответствующую ссылку.
Эти ссылки можно хранить в БД или текстовом файле, выбирать случайным образом или однозначно связать с аннотациями. Всё это зависит от конкретной ситуации. Мы ограничимся простейшим вариантом с использованием оператора switch.
$image = $_GET['img'];
switch ($image) {
    case 'butterfly': echo 'http://farm1.static.flickr.com/152/408688454_2d868d0104_m.jpg'; break;
    case 'tiger': echo 'http://farm4.static.flickr.com/3284/2507729467_915274dab3_m.jpg'; break;
    case 'elephant': echo 'http://farm3.static.flickr.com/2377/1520324747_e468eab773_m.jpg'; break;
    case 'wolf': echo 'http://farm1.static.flickr.com/177/402657323_ebf5c7ce51_m.jpg'; break;
    case 'fish': echo 'http://farm2.static.flickr.com/1084/892454941_56fd34ac3c_m.jpg'; break;
    case 'whale': echo 'http://farm3.static.flickr.com/2401/2052477420_fe7fb452b0_m.jpg'; break;
    case 'flamingo': echo 'http://farm4.static.flickr.com/3303/3557243577_3c1bab1ec3_m.jpg'; break;
    case 'bear': echo 'http://farm1.static.flickr.com/172/401014816_9d879ceac6_m.jpg'; break;
    case 'dog': echo 'http://farm1.static.flickr.com/68/215233902_0f2d1ac9e5_m.jpg'; break;
    case 'cat': echo 'http://farm3.static.flickr.com/2068/2532467266_d8b5c9ea15_m.jpg'; break;
}
Как видите, у нас есть десять аннотаций и каждой соответствует своя ссылка.
И в заключение несколько слов об оформлении страницы.
Размещение аннотаций и их внешний вид задаётся с помощью CSS стилей (файл styles.css).
Я приведу только его фрагмент, который создаёт две колонки (в архиве вы найдете полный вариант).
#content {
    width: 600px;
    margin: auto;
    text-align: justify;
}
#leftCol {
    float: left;
    width: 299px;
}
#rightCol {
    margin-left: 301px;
}
Как видите, ширину всего блока с аннотациями мы установили равной 600px. Для левой колонки указали правило float: left и ширину 299px, а для правой – отступ слева 301px (внутри этого отступа будет находится левая колонка).
Вот и всё. На мой взгляд, эффект довольно симпатичный, но подходит не для всех сайтов.
Как всегда, буду рад ответить на вопросы и выслушать замечания.
До встречи!
Интересно почитать
Актуально про seo и поисковые системы от SeoProfy


