我希望我的主要标志在鼠标悬停时改变。
我知道有几种方法可以实现这一点,并且想知道稳定性、浏览器兼容性、效率和易于设置的最佳方法是什么。
我发现的一些方法是:
- Javascript (jQuery) 替换“src”属性。
- CSS 使用背景和“悬停”
还有吗?什么是最好的?
我希望我的主要标志在鼠标悬停时改变。
我知道有几种方法可以实现这一点,并且想知道稳定性、浏览器兼容性、效率和易于设置的最佳方法是什么。
我发现的一些方法是:
还有吗?什么是最好的?
对于内容丰富的图像,您希望src
在 HTML 标记中包含 。您想使用 Javascript 解决方案并将翻转图像放入属性中。
对于无内容的图像 UI 元素,尤其是在整个站点中常见或重复的元素,直接的 CSS 解决方案将是最好的(因此您不必在每次调用时重新声明图像位置)。在 CSS 解决方案中,精灵是最好的,因为它们不需要预加载开销。
HTML:
<img src="/img/one.jpg" data-rollover="/img/two.jpg" />
在 jQuery 中:
$(function(){
$('img.rollover').hover(function(){
var e = $(this);
e.data('originalSrc', e.attr('src'));
e.attr('src', e.attr('data-rollover'));
}, function(){
var e = $(this);
e.attr('src', e.data('originalSrc'));
}); /* a preloader could easily go here too */
});
示例实现:http: //jsfiddle.net/dtPRM/1/
好处:很容易;这说得通; 一旦您设置了库,它就可以使用最少的附加标记。
缺点:需要 Javascript 和加载 jQuery 库的开销。
可能是最好的选择。如果您的用户正在使用与翻转相关的浏览器(可能是这种情况),则他们具有运行此选项的 Javascript 功能。出于某种原因有意关闭 Javascript 的人会发现,如果您留下一个小<noscript>
便条,说明他们可能无法获得完整的功能集。
HTML:
<div id="img1" />
CSS:
div#img1 {
height: 400px;
width: 300px;
background: url('http://dummyimage.com/600x400/000/fff') no-repeat top left;}
div#img1:hover {
background-position: top right;}
示例实现:http: //jsfiddle.net/dtPRM/5/
就个人而言,我认为对于内容丰富的图像,这是比 CSS + 两个背景图像解决方案更糟糕的选择。您将 HTML 标记与显示的语义值分开。
但是,如果您使用的是 UI 元素等无内容图像,我认为这是最好的解决方案。
另一个不涉及背景图像的 CSS 选项是可用的(如果您想在 HTML 中包含图像标签,则在 CSS 解决方案中首选,例如语义上有意义的图像)。
<div class="rollover">
<img class="rollover" src="http://dummyimage.com/600x400/000/fff" />
<img class="" src="http://dummyimage.com/600x400/fff/000" />
</div>
CSS(我在:not
这里使用伪选择器,但很容易避免使用它;我也认为我在语义上得到了类名):
div.rollover img:not(.rollover) {display: none;}
div.rollover:hover img:not(.rollover) {display: inline;}
div.rollover:hover img.rollover {display: none;}
示例实现:http: //jsfiddle.net/dtPRM/2/
优点:与之前将所有信息放在样式表中的 CSS 解决方案相比,在语义上是明智的。
缺点:需要额外的标记。
评论:这个可能会根据浏览器是否需要自动预加载。
底线:如果选项 (1) 不可用,这是一个不错的后备方案,因为您绝对需要 IE2 兼容性或非 JS 支持。
我之所以提到这一点,只是因为您在问题中提到了它。我不会用它。
HTML:
<div id="img1" />
CSS:
div#img1 {
height: 400px;
width: 600px;
background: url('http://dummyimage.com/600x400/000/fff') no-repeat top left;}
div#img1:hover {
background-image: url('http://dummyimage.com/600x400/fff/000');}
示例实现:http: //jsfiddle.net/dtPRM/4/
优点:广泛兼容;您真正需要支持的只是背景图像和悬停。
缺点:将图像放在 CSS 中并在那里集中在语义上很奇怪。使未来的修改更加困难。话虽如此,如果您有一个需要翻转图像的场景,那么它很有可能是非内容图像(例如,UI 元素),在这种情况下,CSS 在语义上(可能)甚至比常规图像。请参阅下面关于精灵的注释。
其他缺点:您必须小心声明图像的高度和宽度(无论如何这是一个很好的做法,但当您只想完成任务时可能会变得很麻烦)。在移动浏览器上查看的用户可能会异常处理 CSS 背景图像。
更多的缺点:如果你想在它上面放置一个预加载器,你将使用 Javascript 并以某种方式选择可翻转的元素,并且按照这个速度,你还不如使用 Javascript 来处理所有事情。
底线:不要将其用于内容丰富的图像。如果您必须远离 Javascript,请为 UI 元素使用精灵,为具有语义意义的图像使用替代解决方案。
#btn{
width:100px; height:100px;/*the dimensions of your image*/
background:url(bird.png) left top no-repeat;
}
#btn:hover{
background-position:left bottom;/* pixel references can be used if prefered */
}
使用这样的图像:
注意:避免 JS 图像替换,因为如果之前没有缓存图像,则会导致图像加载时间短。
希望这对兄弟有帮助!
W。
CSS 使用背景和“悬停”
使用 CSS sprites,换句话说,将两个图像合二为一,然后使用 css:hover
移动图像。
使用 CSS 的一个优点是即使关闭 JavaScript 也能正常工作。
使用单个图像的一个优点是它可以避免额外的 HTTP 请求。
见:http ://css-tricks.com/css-sprites/
帮助生成图像和 CSS 的工具:
您应该使用:hover
CSS 规则。
到目前为止的CSS。尽管您可能想使用 javascript 预缓存您的图像。
使用'sprites'的图像翻转列出一部分 - sprites CSS
在 CSS 中使用 CSS 精灵和 :hover 伪类。原因如下:
通过 JS 或 CSS 切换图像源将导致在浏览器下载新图像时第一次鼠标悬停时“闪烁”。如果您使用精灵,它只是改变位置的一张图像,所以不会眨眼。
单个图像减少了 HTTP 请求,总体上使网站加载速度更快。
如果用户禁用了 JavaScript,它就可以工作。
所有浏览器类型都支持它(桌面,无论如何,没有 :hover 状态的手机浏览器无论如何都不算在内)。
$('#div1').hover(function(){
this.style.color='white';
},function(){
this.style.color='black;
});
或者
$('#div1').onmouseover()...
$('#div1').onmouseout()...