我有一个spritesheet驱动一组按钮的外观,这些按钮会根据各种鼠标操作而改变。但是,我在精灵之间切换时会看到一个闪烁,并且在chrome或firebug中查看网络面板确认每次更改精灵时都会重新加载spritesheet,这会破坏使用spritesheet的程度。
处理sprite的交换的jquery代码是这样的:
$(".btn").mouseover(function () {
var imgId = $(this).prop("id");
if (imgList[imgId]) {
if (!$(this).hasClass(imgList[imgId]["inactive"])) {
$(this).removeClass(imgList[imgId]["all"]).addClass(imgList[imgId]["mouseOver"]);
}
}
});
$(".btn").mousedown(function () {
var imgId = $(this).prop("id");
if (imgList[imgId]) {
if (!$(this).hasClass(imgList[imgId]["inactive"])) {
$(this).removeClass(imgList[imgId]["all"]).addClass(imgList[imgId]["mouseDown"]);
}
}
});
$(".btn").mouseout(function () {
var imgId = $(this).prop("id");
if (imgList[imgId]) {
if (!$(this).hasClass(imgList[imgId]["inactive"])) {
$(this).removeClass(imgList[imgId]["all"]).addClass(imgList[imgId]["default"]);
}
}
});
其中imgList是用于应用精灵的类名列表,其中all是完整的类列表。这是一个示例:
imgList["navToggleNavigation"] = [];
imgList["navToggleNavigation"]["default"] = "NavShowHide-Button-normal";
imgList["navToggleNavigation"]["mouseOver"] = "NavShowHide-Button-mouseOver";
imgList["navToggleNavigation"]["mouseDown"] = "NavShowHide-Button-mouseDown";
imgList["navToggleNavigation"]["inactive"] = "NavShowHide-Button-inactive";
imgList["navToggleNavigation"]["select"] = "NavShowHide-Button-select";
imgList["navToggleNavigation"]["all"] = "NavShowHide-Button-normal NavShowHide-Button-mouseOver NavShowHide-Button-mouseDown NavShowHide-Button-inactive NavShowHide-Button-select";
每个类的CSS代码都引用工作表中的图像:
.NavShowHide-Button-inactive{background-image:url('../Images/navigation-spritesheet.png') ; background-position:-704px 0px ; height: 44px; width: 44px; display: inline-block;}
.NavShowHide-Button-mouseDown{background-image:url('../Images/navigation-spritesheet.png') ; background-position:-748px 0px ; height: 44px; width: 44px; display: inline-block;}
.NavShowHide-Button-mouseOver{background-image:url('../Images/navigation-spritesheet.png') ; background-position:-792px 0px ; height: 44px; width: 44px; display: inline-block;}
.NavShowHide-Button-normal{background-image:url('../Images/navigation-spritesheet.png') ; background-position:-836px 0px ; height: 44px; width: 44px; display: inline-block;}
.NavShowHide-normal{background-image:url('../Images/navigation-spritesheet.png') ; background-position:-880px 0px ; height: 44px; width: 44px; display: inline-block;}
此代码中是否有任何内容会导致spritesheet在运行时重新加载?有更好的方法吗?
答案 0 :(得分:2)
不是在每个类上声明background-image
,而是应该有一个具有.NavShowHide
的类名(如background-image
),然后使用更具体的类来定义{{仅限1}}:
background-position
然后给元素一个两个类的组合,即:
.NavShowHide {
background-image:url('../Images/navigation-spritesheet.png');
height: 44px;
width: 44px;
display: inline-block;
}
.NavShowHide-Button-inactive{background-position:-704px 0px;}
.NavShowHide-Button-mouseDown{background-position:-748px 0px;}
.NavShowHide-Button-mouseOver{background-position:-792px 0px;}
.NavShowHide-Button-normal{background-position:-836px 0px;}
.NavShowHide-normal{background-position:-880px 0px;}