2012-02-16 33 views
1

我有一个包含全部图像的div的两阶段动画,右侧是一段10个span语句。图像是绝对的,所以它们堆叠在一起,并且最初具有负边距以隐藏图像,通过溢出:隐藏。当相应的图像滑动时,将CSS类添加到span标记中

在第1阶段(页面加载时和用户悬停在某一范围之前),图像每隔5秒设置一次,以无限的方式循环显示图像。当第二个阶段发生时,这个阶段和间隔将会清除,当您将鼠标悬停在跨度标签上时,对应的图像将滑动到该标签中进行查看。

我有阶段1和阶段2编码,但我的问题是:在阶段1,我必须实现它,以便当它默认动画通过图像时,相应的span标签必须具有CSS类当你将鼠标悬停在span标记在阶段2

这里是代码,如果有人想摆弄它:

<!--begin:content--> 
       <div id="content"> 

         <div id="pics"> 
          <img src="ADD ANY IMAGE" id="defaultImg" alt="" /> 
          <img src="ADD ANY IMAGE" id="hover_1_pic" alt="" /> 
          <img src="ADD ANY IMAGE" id="hover_2_pic" alt="" /> 
          <img src="ADD ANY IMAGE" id="hover_3_pic" alt="" /> 
          <img src="ADD ANY IMAGE" id="hover_4_pic" alt="" /> 
          <img src="ADD ANY IMAGE" id="hover_5_pic" alt="" /> 
          <img src="ADD ANY IMAGE" id="hover_6_pic" alt="" /> 
          <img src="ADD ANY IMAGE" id="hover_7_pic" alt="" /> 
          <img src="ADD ANY IMAGE" id="hover_8_pic" alt="" /> 
          <img src="ADD ANY IMAGE" id="hover_9_pic" alt="" /> 
          <img src="ADD ANY IMAGE" id="hover_10_pic" alt="" /> 
         </div> 

         <!--begin: homeText - block of span tags w/text referenced in jQuery --> 
         <div class="homeText">  
          <p> 
           <span id="hover_1" >evolve water.</span> 
           <span id="hover_2">stream the party.</span> 
           <br /> 
           <span id="hover_3">let moms play.</span> 
           <span id="hover_4">play on big screens.</span> 
           <br /> 
           <span id="hover_5">turn txt into sport.</span> 
           <span id="hover_6">have 18 wheels.</span> 
           <br /> 
           <span id="hover_7">have chapters.</span> 
           <span id="hover_8">personify an issue.</span> 
           <br /> 
           <span id="hover_9">transform neighborhoods.</span> 
           <br /> 
           <span id="hover_10">become keepsakes</span> 
          </p> 
         </div> 

      </div><!--end content--> 

CSS

#pics img { 
height: 131px; 
width: 334px; 
position: absolute; 
margin-left:-325px; 
} 

/* ADDED by ben sewards */ 
#pics { 
height:179px; 
width:335px; 
position: relative; 
overflow: hidden; 
margin:0px; 
padding-top:15px; 
margin-left:49px; 
float:left; 
} 

/* ADDED by ben sewards */ 
.homeText { 
width:600px; 
height:240px; 
padding-left:15px; 
padding-top: 10px; 
overflow: hidden; 
float:left; 
} 

.homeText p { 
line-height: 115%; 
font-family: @Adobe Fangsong Std R; 
font-size: 2.6em; 
font-weight:bolder; 
color: #c0c0c0; 
margin: 0px; 
} 

.homeText span:hover { 
background-color:Lime; 
color: White; 
cursor: pointer; 
} 

.span-background-change { 
background-color:Lime; 
color: White; 
} 

JS脚本

$('document').ready(function() { 
slideIn('defaultImg'); 
timer = setInterval('slideInNext()', 5000); 
functionHover(); 
}); 

var slideSpeed = 500; 

var slideIn = function (id) { 
$('#' + id).addClass('active').animate({ 'margin-left': '0px' }, { 'duration':    slideSpeed, 'easing': 'swing', 'queue': true }); 
} 
var slideOutCurrent = function() { 
$('#pics img.active').removeClass('active').animate({ 'margin-left': '325px' }, {  'duration': slideSpeed, 'easing': 'swing', 'queue': true, 'complete': function() {   $(this).css('margin-left', '-325px'); } }); 
} 

var slideInNext = function() { 
var curImage = $('#pics img.active'); 
var nextImage = curImage.next(); 
if (nextImage.length == 0) { 
    nextImage = $('#pics img:first'); 
} 
slideOutCurrent(); 
slideIn(nextImage.attr('id')); 
} 

var queueToSlideIn = []; 
var mouseOnTimer = null; 
var mouseOffTimer = null; 

var functionHover = function() { 
$('.homeText span').hover(
//binding 2 handlers to hover event 
function() { //when hovering over a span - mousenenter 
    clearTimeout(mouseOffTimer); 
    clearInterval(timer); 
    var thisId = $(this).attr('id'); 
    mouseOnTimer = setTimeout(function() { 
     if (!$('#' + thisId + '_pic').hasClass('active')) { 
      addToQueue(thisId + '_pic'); 
     } 
    }, 300); 
}, 
function() { //when off of span - mouseleave 
    clearTimeout(mouseOnTimer); 
    mouseOffTimer = setTimeout(function() { 
     if (!$('#defaultImg').hasClass('active')) { 
      addToQueue('defaultImg'); 
     } 
    }, 500); 
} 
); 
$('.homeText span').click(function() { 
    //set current span on click 
    $span = $(this).attr('id'); 
    //navigate to corresponding case study 
    var href = $('#' + $span + '_pic').attr('alt'); 
    window.location.href = href; 
}); 
} 

var addToQueue = function (id) { 
queueToSlideIn.push(id); 
$('#pics').queue(function() { animateNext(); $(this).dequeue(); }).delay(slideSpeed); 
} 

var animateNext = function() { 
if (queueToSlideIn.length > 0) { 
    var id = queueToSlideIn.shift(); 
    slideOutCurrent(); 
    slideIn(id); 
} 
}; 

对不起,如果缩进是凌乱。

回答

0

添加此snippe对于所需结果的代码到我slideInNext函数T:

if (nextImage.attr('id') != "defaultImg") { 
    //add class to corresponding span tag of current image 
    var spanId = nextImage.attr('id'); 
    //corresponing span of next image 
    spanId = spanId.substring(0, spanId.length - 4); 
    $('#' + spanId).addClass('span-background-change'); 
} 

我刚使用过的子方法中JavaScript来拉开图像属性ID,并将其放置在一个局部变量来表示跨度ID。

1

我加了重新类,这是你的悬停类的重复:

.homeText-hover { 
background-color:Lime; 
color: White; 
cursor: pointer; 
} 

然后我说每两个行你的slideIn和slideOutCurrent功能:

var slideIn = function (id) { 
var slId = id.split('_pic'); 
$('#' + slId[0]).addClass('homeText-hover'); 
$('#' + id).addClass('active').animate({ 'margin-left': '0px' }, { 'duration':    slideSpeed, 'easing': 'swing', 'queue': true }); 
} 
var slideOutCurrent = function() { 
var slId = $('#pics img.active').attr('id').split('_pic'); 
$('#' + slId[0]).removeClass('homeText-hover'); 
$('#pics img.active').removeClass('active').animate({ 'margin-left': '325px' }, {  'duration': slideSpeed, 'easing': 'swing', 'queue': true, 'complete': function() {   $(this).css('margin-left', '-325px'); } }); 
} 

你autoslide在FF中没有解决...

+0

我喜欢你的想法,但在其他辅助方法中使用slideIn时会变得复杂。我保持简单,并将相应的代码添加到slideInNext函数中,尽管我的代码与您的代码很相似。再次感谢! – 2012-02-16 16:55:45

+0

我会在5个小时内发布我的答案。 – 2012-02-16 16:58:21

+0

基本上你需要找到一个连贯的关系来连接你的对象。 – 2012-02-16 17:04:21

1

我喜欢你的解决方案,本。使用选择标识属性的相同原则的另一种解决方案是向每个元素添加一个对每个img-span对唯一的类,以便每个元素与其相应的元素共享一个特定的类。

下面是使用类的标志,这是我最初发布在解决不同的问题的说明,此后已关闭:


类为标志

向一个元素添加一个类并不总是意味着你要给它一些新的CSS样式。 CSS是一种使用CLASSES的语言,以便帮助识别元素以设计特定的方式;类不是为了将CSS应用到元素的唯一目的。如果不是这种情况,CSS只能通过类的使用来设置元素的样式,而不能通过使用其他选择器(ID,父母,子女,后代等)来设置元素的样式。

开发人员经常使用类作为“标志”。标志是一种表示某个特定元素的方式,而不必将该信息存储在变量中。例如,假设您有一个元素列表,并且所有元素的样式完全相同,都通过一个CSS类。如果开发人员想以特定的方式标记每个其他元素(以备以后使用),而不改变元素的样式,他可以选择在元素中添加第二个名为“alternate”的类。

您可以根据需要添加任意数量的类到一个元素,并且它是完全可接受的编码风格,用于添加多个没有任何关联样式的类(假设这些类用于某些其他用途 - 脚本等) 。