读者 Jason Lucchesi 向我发送了一个很酷的演示,演示了鼠标悬停时图片标题滑入图片顶部的效果。 该效果使用了一堆嵌套的 div 来实现,所以我考虑用标准的 HTML5 结构来实现带标题的图片,并用 CSS3 来完成。
为什么要做这样的事情?也许是为了节省布局空间。也许标题本身在特定设计中会分散注意力,而有条件地显示它们会更简洁。我不知道,这只是一个演示。如果你不喜欢它,就不要用它。
HTML5 结构
除了图片和标题的纯语义标记外,这里没有其他内容。
<figure>
<img src="yay.jpg" alt="">
<figcaption>
yay!!!
</figcaption>
</figure>
CSS 结构
figure
元素包裹了所有内容,是我们的基本构建块。 赋能的概念从这里开始。 figure
需要设置 position: relative;
,这样我们就可以将标题绝对定位在我们想要的位置,并且不会占用任何额外的空间。 我们还需要 overflow: hidden;
,这样当我们进行滑动操作时,标题就会消失在 figure
的边界之外。
figure {
display: block;
position: relative;
overflow: hidden;
}
figcaption {
position: absolute;
background: rgba(0,0,0,0.75);
color: white;
padding: 10px 20px;
}
热滑动操作
我们需要隐藏标题,以便在鼠标悬停在图片上时,通过热滑动操作来显示它们。 让我们将标题定位在左下角之外,并用不透明度将其完全隐藏。 然后,当鼠标悬停在 figure
上时,我们将其滑入位置,并将不透明度调整回来。 为了使它真正滑动,我们将使用 transition
。
figcaption {
position: absolute;
background: rgba(0,0,0,0.75);
color: white;
padding: 10px 20px;
opacity: 0;
bottom: 0;
left: -30%;
-webkit-transition: all 0.6s ease;
-moz-transition: all 0.6s ease;
-o-transition: all 0.6s ease;
}
figure:hover figcaption {
opacity: 1;
left: 0;
}
选项,选项
在 演示 中,每个图片的位置和滑入方向都不一样。 我们只是通过向 figure
添加类名,并根据类名对位置进行不同的设置来实现这一点。
<figure class="cap-top">
.cap-left figcaption { bottom: 0; left: -30%; }
.cap-left:hover figcaption { left: 0; }
.cap-right figcaption { bottom: 0; right: -30%; }
.cap-right:hover figcaption { right: 0; }
.cap-top figcaption { left: 0; top: -30%; }
.cap-top:hover figcaption { top: 0; }
.cap-bot figcaption { left: 0; bottom: -30%;}
.cap-bot:hover figcaption { bottom: 0; }
那么,人们怎么知道那里有标题呢?
如果你要费心制作漂亮的标题,而没有指示它们的存在,那将是一件很可惜的事情(读作:UX 失败)。 让我们用一个微妙的问号指示器来表示标题的存在。 我们不会使用非语义的额外标记来实现这一点,而是会使用伪元素的形式,在 figure
上生成内容。
figure:before {
content: "?";
position: absolute;
background: rgba(255,255,255,0.75);
color: black;
width: 24px;
height: 24px;
-webkit-border-radius: 12px;
-moz-border-radius: 12px;
border-radius: 12px;
text-align: center;
font-size: 14px;
line-height: 24px;
/* Only Fx 4 supporting transitions on psuedo elements so far... */
-webkit-transition: all 0.6s ease;
-moz-transition: all 0.6s ease;
-o-transition: all 0.6s ease;
opacity: 0.75;
}
figure:hover:before {
opacity: 0;
}
请注意,上面的 CSS 代码中没有定位值,尽管有 position: absolute;
。 位置将取决于我们设置的选项类。 你可能希望将问号放置在标题滑入的角落。 就像
.cap-left:before { bottom: 10px; left: 10px; }
使用
就像你在本网站上找到的任何东西一样。 请随意将其用在你想要的任何地方。 最好是那些你告诉老板这是你的主意,然后你就能得到大幅加薪的大型企业项目。
我真的很喜欢这个!干得漂亮!
在内角添加圆角也很不错 :)
问候
Jonny007
你的网站风格在 chrome 11 中坏了
我也注意到了... CSS 出了点问题...
我已经在 Twitter 上给他发了一个关于这个问题的推文 - 也许他有点忙 ;-)
太棒了,我会在我的博客上尝试一下。 嘿嘿
非常酷。 我以为需要用到一些 JavaScript 才能实现。 谢谢分享。
看起来不错,不过列出它在哪些浏览器中起作用和不起作用会更好。
:before – 除 < IE7 外的所有浏览器
figure, figcaption – HTML5 浏览器。
transition、border-radius、rgba、opacity 将会有可接受的缺陷。
如何在 WordPress 中使用这个小技巧? 我在使用 TwentyTen 主题的 HTML5 版本。
只需将代码添加到帖子或小部件中,并确保声明为
抱歉双重评论,没有评论表单预览...
确保声明(即 CSS 代码)在主题目录中的 CSS 代码样式表中? 你是这个意思吗? CSS 文本在 CSS 中,HTML 在实际的帖子中?
真棒。 非常棒。
快速建议,如果我们用“i”替换“?”怎么样?
我还没有真正学习过很多 HTML5,只学习了 CSS3 的主要部分。
那么会发生什么?
哈哈,我应该花点时间学习它。
那会没问题。
content
属性实际上可以容纳几乎任何东西。世界末日彼得。 世界末日。
谢谢... 好建议。 Chris.!
Chris,这有点无关紧要,但你有没有在 Prancing Pony 喝酒?
hrrr...
几天前我在寻找这样的东西。
在我的 Chrome 版本中可以正常工作,Ben。
你忘记提到一个重要的样式定义
img {display: block;}
如果没有这个,figcaption 不会准确地对齐到图像的底部和右边缘。
这真是一个很棒的教程,它包含了 HTML5 和 CSS3!此外,该网站的新外观看起来真的很棒,使用了 CSS3 和 HTML5…
非常棒的演示:)
如果你也能像对 HTML5 标记那样,压缩 CSS 代码就更好了,例如
你不需要为 border-radius 添加供应商特定的前缀,只需要使用 border-radius: 12px; 就可以在 Firefox 和 Chrome 中同时生效,无需添加 -moz- 和 -webkit-
我认为这在 IE9 中也应该可以工作(但我没有测试过),但你可能需要声明所有角的 border-radius: 12px 12px 12px 12px; 才能让它在 IE9 中生效。
我不知道如何编辑我之前的评论,但我想要指出我指的是当前的浏览器版本(Chrome10、Firefox4 和 IE9)
我注意到你语气有所变化,克里斯。也许是我感觉错了。
一个很棒的关于使用新 HTML5 标签的演示。
我会尝试将它实现到侧边栏,侧边栏通常空间比较紧凑。
再次感谢。
首先是“PFF!去死吧,Flash”。
现在是时候了“PFF!去死吧,JavaScript”。:)
下次请在冒犯性或淫秽词语旁边加星号。要知道,孩子们/青少年也会浏览这个网站。
感谢 =)
非常棒的工作。我很喜欢这个。
在 IE8 及以下版本中无法运行,但它仍然是一个非常酷的实验!
太棒了,我必须马上尝试一下。感谢分享。正在下载。
很棒,克里斯:) 几个月前我做过类似的事情 - http://blog.cooljaz124.com/labs/css3/slick-css3-animated-image-caption/
我认为我们将在不久的将来看到很多类似的效果。看起来它是一个非常棒的替代方案,可以取代使用 jQuery 和 Flash 来实现类似的任务——而且它不像那些方法那么冗长!就我个人而言,我还没有深入研究 HTML5 的深度(仅仅是因为某些方面仍然处于测试版阶段),但我将在我的下一个网站中尝试使用一些类似于此的效果,因此感谢你让我对此感到兴奋!我看到未来会出现一些非常棒的设计,它们源自像这样的 HTML5 教程!
不错。简洁有效,并且解释/演示清晰。我会使用它。
(顺便说一句,我真的很喜欢在演示中将 CSS 和标记分别显示在右侧。)
感谢
非常棒,克里斯,我喜欢你的作品!
关于使用部分的内容真的让我笑了。
很酷,虽然我们知道这在 IE 中无法运行,而且我所有的客户都要求所有东西都必须在 IE 6 及以上版本中运行。我真的讨厌 IE。选择你的版本吧。
将它与 Anything-Slider 集成(当然可以根据需要选择)似乎是个好主意。
大家,尤其是克里斯,你们怎么看?
太棒了!感谢!是时候修改我的代码并使用这个了……哈哈
我很喜欢!
感谢分享,克里斯
实际上,它在 IE7/8 中降级得很好。标题会稍微露出一点,暗示着它们的存在。它们不会平滑过渡,但确实会显示出来。
在 IE6 中,你只需要删除隐藏状态,它就会完美运行。很酷的技术。
非常感谢,这太棒了!
克里斯,我在让标题在 Firefox 上生效时遇到了一些问题,不太确定是什么原因?
http://www.stickbagbuddy.co.uk/ben/index1.html
这是网站的模拟,它在 Chrome 上运行得很好,但在 Firefox 上标题只是淡出,?框也消失了,有什么想法吗?
嘿,太棒了!我不知道将来是否会使用它,但我确实很期待学习 HTML5 和 css3,这里又多了一个学习的例子!
感谢,它很棒,因为它很简短,而且真的很容易!
我认为这可以用 jQuery Cycle 的“shuffle”效果来实现
感谢你的想法。我会在我的网站上测试它,因为我很喜欢它。
我认为这可以用 jQuery Cycle 的“shuffle”效果来实现
此功能在 WordPress 资源库中的“Autofocus”主题中可用
喜欢 css-tricks,希望能够掌握所有内容,正在慢慢学习,每天学习一篇文章
非常感谢!我很喜欢它
使用问号来告诉人们有标题是一个不错的技巧,很明显,人们会出于好奇而将鼠标悬停在那个小问号上,这样就会显示出标题。
代码格式很好。我还要学习一些 HTML5 技巧。
保持良好的工作。
嗨,克里斯,
我认为我发现了一个在 IE 中解决标题问题的办法……。
我尝试为 IE 制作一个解决办法,因为它总是将标题显示在顶部……而在其他浏览器中运行良好。
因此我在你的代码中添加了以下修改
在 CSS 中将 figcaption 的 visibility 设置为 hidden;
并添加了
在 CSS 中将 ‘figure: hover figcaption’ 的 visibility 设置为 visible;
它在 IE 中可以工作……效果不同,但仍然可以工作
我在 IE 8、9、Safari、Firefox 和 Chrome 中测试过,它运行良好……。
缺点是你将丢失图像上的“?”
非常棒的脚本,我会尝试实现它并看看它的效果。喜欢 html5!
大家好,我找到了解决方案!它在 IE8 中可以工作!http://bit.ly/fveeo5
我对这个效果感到震惊;我第一次在 Phone Arena 上看到这个效果,它在每部手机上都显示了简短的描述。
它看起来不错,并且运行良好……但我仍然偏爱 HTML4:)
哇——我印象深刻。非常棒!顺便说一句,也许我的拖放效果会让你印象深刻:)
干杯!
非常棒的效果!!
不错!我在我的博客上使用了它,我非常喜欢它!
但我想要问一个问题。当我将图像缩小后,为什么标题会出现在图像外部?有没有办法让标题在更改图像尺寸时自动调整?
感谢。
非常棒
这段代码运行得很好,但是如何居中图像呢?
在受到这篇文章的启发后,我制作了这个=>
http://google101100.blogspot.in/2013/11/cool-hover-image-effect.html
为了某些样式,我用“⇪”替换了“?”,但把它放在一个方框里而不是圆圈里,看起来很漂亮!
演示在 Firefox 29.0.1 中不再有效。在 MAC Chrome 和 Safari 中看起来还不错。