css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
16 Июл
Эту работу проделал Alen Grakalic. В статье CSS: создание диаграмм я уже знакомил читателей блога с его оригинальными идеями и вот теперь нашел еще одно интересное, изящное решение, с которым и предлагаю подробно познакомиться…
Итак, для чего это? Иногда на странице не имеется достаточно пространства, чтобы показать большие изображения, но все же очень хочется избежать маленьких и едва распознаваемых картинок. Используя предложенную уловку, мы ограничиваем видимые размеры изображения, и показываем полноразмерное изображение, только когда пользователь наводит указатель мыши на миниатюрное изображение. Впрочем, посмотрите все на примере:
Вы можете скачать исходный код примера, и воспроизвести этот пример на своем сайте.
То, что мы видим, это не фактическое изменение размеров изображения. Это – изменение размеров видимой области при наведении указателя мыши. Здесь используется CSS-свойство overflow.
Свойство overflow определяет отображение контента, когда он переполняет область контейнера. Если размеры контейнера ограничены по какой-либо причине, свойство overflow используют, чтобы определить поведение при переполнении контейнера. Возможные значения свойства overflow: visible, hidden, scroll и auto. На использовании свойства overflow и построен этот трюк. По умолчанию часть картиники скрывается, и появляется только при наведении указателя мыши.
Идея состоит в том, чтобы поместить изображение в какой-либо контейнер. Договоримся о том, что таким контейнером для изображения будет являться тэг a. Мы устанавливаем размеры (ширину и высоту) контейнера в требуемые значения, и устанавливаем свойство position контейнера relative. Изображение же внутри имеет position:absolute. Используем отрицательные значения свойств top и left, чтобы сместить изображение. Таким образом мы теперь видим только часть картинки в нашем контейнере. Оставшаяся часть картинки скрыта. И показана целиком она будет только лишь при наведении указателя мыши, т.е. при a:hover мы установим свойству overflow значение visible и покажем картинку целиком.
HTML-код – проще не бывает:
<ul id="thumbs">
<li>
<a href="http://example.com/"><img src="1.jpg" /></a>
</li>
<li>
<a href="http://example.com/"><img src="2.jpg" /></a>
</li>
<li>
<a href="http://example.com/"><img src="3.jpg" /></a>
</li>
<li>
<a href="http://example.com/"><img src="4.jpg" /></a>
</li>
</ul>
Вот фрагмент CSS-кода с комментариями:
/* убираем поля и отступы, */
/* скрываем маркеры списка */
ul#thumbs, ul#thumbs li{
margin:0;
padding:0;
list-style:none;
}
/* включаем элементы списка в плавающую модель, */
/* смещая их влево и таким образом вытягивая по */
/* горизонтали, заодно ставим легкую рамочку и */
/* задаем небольшое поле справа */
ul#thumbs li{
float:left;
margin-right:2px;
border:1px solid #999;
padding:1px;
}
/* вот он, контейнер для картинки, "глазок", в */
/* котором отображается ее часть */
ul#thumbs a{
display:block;
float:left;
width:70px; /* ширина видимой части */
height:70px; /* высота видимой части */
line-height:70px;
overflow:hidden; /* скрываем "лишнее" */
position:relative; /* это важно! */
z-index:1;
}
/* ну и сама картинка позиционируется абсолютно, */
/* ее верхний левый край смещается в невидимую */
/* область */
ul#thumbs a img{
float:left;
position:absolute;
top:-10px;
left:-35px;
}
Теперь CSS-код, который определит поведение при наведении указателя мыши на картинку.
/* показываем картинку полностью, "поднимаем" */
/* ее над соседними картинками и убираем рамку с */
/* элемента - она теперь не нужна. */
ul#thumbs a:hover{
overflow:visible;
z-index:1000;
border:none;
}
/* а вот полной картинке рамочку добавим */
ul#thumbs a:hover img{
border:1px solid #999;
background:#fff;
padding:2px;
}
Эту идею можно использовать и для единичной картинки. Исходный код разбирать подробно наверное уже не стоит, потому как в интересующей нас части он ничем не отличается от уже разобранного нами. А пример – пожалуйста:
Вы можете скачать исходный код примера, и воспроизвести этот пример на своем сайте.
Вот и все. Надеюсь, кому-нибудь пригодится.
Отзывов (17) на «CSS: использование свойства overflow для создания thumbnail’ов с изменяющимися размерами.»
Отлично Геннадий, очень полезная функция, сгодиться для небольшой галереи
Хотел бы напомнить, что авторство не мое. Благодарить следует Alen Grakalic. Я всего лишь дал разъяснения на русском языке.
А как добавить эффект? чтобы плавно картинка увеличивалась?
MFD – такой эффект боюсь только с помощью JS достижим
Идея очень хороша, но при использовании в галерии будет много недостатков.
Я пока Lightbox люблю
>А как добавить эффект? чтобы плавно картинка увеличивалась?
Сейчас это можно сделать только с помощью JavaScript.
Однако, анимация должна появиться в CSS3: http://webkit.org/specs/CSSVisualEffects/CSSAnimation.html
спасибо Генадий. Отличная заметка! побольше бы таких «хитростей» и мир станет лучше ) мне реально пригодится – скоро покажу где реализовано
что-то как-то не увеличение ни разу получается
просто изначально скрываем часть картинки, а при наведении мыши – показываем и скрытую часть… имхо – далеко не каждому такое подойдёт… уж лучше в в дефолтном состоянии показывать уменьшенный вариант картинки, скажем, 50х50 пикселей, а при ховере – полный, вот это будет нормальный вариант и пользователь, глядя на маленькое превью, ничего не упустит, а в вашем варианте неплохая часть фотки не видна изначально…
забыл добавить
всё вышенаписаное – ИМХО и претензий ни к кому не имею
каждый сам творец своего счастья
и творит его, как хочет
А имхо, так даже симпатичней уменьшенного варианта
Много ли можно увидеть на варианте 50х50 картинки, которая изначально была куда больше? Можно выделить для каждой картинки какую-то ключевую часть, которую будет хорошо видно.
А не подскажете как можно сделать так чтоб элемент, например div оставался всегда например внизу экрана независимо от прокрутки и был всегда виден пользователю. Спасибо
Почитайте статью Как прижать footer к низу окна браузера с помощью CSS?. В данном случае footer – это div, который прижимается к нижней части, если контента на странице мало и отодвигается к нижней границе контента, если его много.
А вообще на xhtml.ru очень много полезного как раз по CSS.
Не много ли float-ов?
«ul#thumbs, ul#thumbs li{
margin:0;
padding:0;
list-style:none;
}
ul#thumbs li{
float:left;
margin-right:2px;
border:1px solid #999;
padding:1px;
}
»
Переписываем как:
ul, li {
margin:0;
padding:0;
list-style:none;
float:left;
}
ul li {
margin-right:2px;
border:1px solid #999;
}
ul – тоже флоатим иначе схлопывается.
Далее:
«ul#thumbs a{
display:block;
float:left;
width:70px; /* ширина видимой части */
height:70px; /* высота видимой части */
line-height:70px;
overflow:hidden; /* скрываем «лишнее» */
position:relative; /* это важно! */
z-index:1;
}
»
Переписываем как:
ul li a {
width:70px;
height:70px;
line-height:70px;
overflow:hidden;
display:block;
position:relative;
z-index:1;
}
Ибо или display:block; или просто float:left; что тоже дает элементу блоковость. Поскольку флоатить вообще-то нечего и не нужно – оставляем просто display:block;
Далее
«ul#thumbs a img{
float:left;
position:absolute;
top:-10px;
left:-35px;
}»
Тут тоже флоат не нужен. Опять же изымать из потока картинки нет смысла, так что тоже можно поставить position:relative;
Спасибо Геннадий за перевод, полезнейшая функция, а то я пытался замудрить нечто на js+css
т.е сначала в header подключаем js_script, а после в тексте DIV-ами выводим скрытое изображение, кому интересно могу написать подробнее, но вариант перевеленный Геннадием мне больше понравился, сэнкс!
Очень полезный пример, но если изображение меньше div’a для превью, было бы неплохо его центровать, а так оно занимает верхний левый угол.
Эх.. а я всё ищу, как сделать слайдер на основе overflow. Хоть это и не то, но всё равно спасибо.
Вполне оригинальное решение. Отдолжу для дальнейшего испольования. Как-то самому в голову не приходило использовать overflow конкретно для такой задачи – всё больше jQuery
Оставьте отзыв