好吧,既然你说你想学,我就给你一个代码来帮助你,但是你必须自己解决,我没有测试它,我只是盲目地写它,所以它可能不会工作,但可能会让您对必须做什么有一个很好的了解。
HTML:
<div class="container">
<div id="coolDiv" class="scatterContainer">Hello World</div>
</div>
CSS:
*{margin:0;}
span:hover{
color:#0CF;
}
.scatterContainer{
display: inline;
}
.container {
margin: 30px auto;
}
Javascript
LetterScatterer = (function() {
function LetterScatterer(id) {
this.id = id
this.$el = $('#' + this.id);
this.rangeOfaction = 3; // Number of characters to affect
this.maxVerticalMovement = 10; // Value in px
this.minVerticalMovement = 2
this.duration = 100; // In miliseconds
// Event Listeners
this.$el.on(mousemove((function(_this){
return function(e){
var x = e.pageX;
var y = e.pageY;
return _this.scatter(x, y);
}
})(this));
}
LetterScatterer.prototype.splitCharacters = function() {
var nodes = [];
var nodesQ = 0;
var _this = this;
this.chars = $el.text().split('');
$el.empty();
for(var i = 0; i < chars.length; i++){
var markup = "<span class='letter'>"+chars[i]+"</span>";
nodes.push(markup);
}
this.$nodes = $(nodes);
this.nodesWidth = [];
this.$nodes.each(function(){
var width = $(this).outerWidth();
_this.nodesWidth.push(width);
});
$el.append(this.$nodes);
}
LetterScatterer.prototype.scatter = function(x, y) {
var epicenter;
var offset = 0;
var midPoint, farestLeft;
for(var i = 0, len = this.nodesWidth.length; i < len; i++){
offset += this.nodesWidth[i];
if(x <= offset){
epicenter = i;
break;
}
}
leftRange = (this.rangeOfaction - 1) / 2; // We remove one, this is our epicenter, then we get left and right halves
farestLeft = epicenter - leftRange;
for(var i = farestLeft; i < this.rangeOfaction; i++){
this.animateY($node[i]);
}
}
LetterScatterer.prototype.animateY = function(node, verticalDisplacement) {
var $node = $(node);
$node.animate({margin-top: verticalDisplacement + 'px'}, this.duration);
}
return LetterScatterer;
})();
letterScatterer = new LetterScatterer('coolDiv');
您在代码中看到的是一个类类函数,首先您将包含要分散的文本的元素的 id 传递给它。有一些配置变量,动作范围可以说,如果您将鼠标悬停在一个字符上,左右多少个字符(也包括当前悬停的元素)应该被动画化,最大和最小垂直移动,确定如何much 应该移动悬停的那个(最大),距离较远的将使用 min,介于两者之间的应该插值,但我没有编码那么远。
然后我们得到了一个mousemove监听器,它调用方法scatter,这个方法通过添加每个字符宽度来找到当前悬停的项目,但是现在我想,在span中添加一个监听器应该更容易,并使用 jQuery 方法 index() 获取该元素的当前索引,然后根据该索引为该元素和范围内的元素设置动画。如果需要,您必须创建计算旋转和 x 运动的代码,但我想我给了你很多开始,我花了一段时间来编写它,所以我希望它有所帮助,这个答案满足你的问题。 :)