星星評分的改進

工作日志之星級評分

今天主要完成了幾件事情:

  1. 完成了博客標簽的生成與鏈接,并且通過js實現(xiàn)了標簽與文章使用同一個模板的需求,繼續(xù)加油!
  2. 接到了二手車的修改任務,雖然花了幾乎一天的時間,但是好在在7點半左右完成了,所以心情很好,因為通過自己的努力,解決了問題,對自己的學習和自信是一個很好的促進作用。

廢話不多說,開始今天的主題:星級評分
再翻看自己之前寫的代碼的時候,發(fā)現(xiàn)代碼結(jié)構(gòu)臃腫,而且多處判斷是不對的,所以在調(diào)整完css的樣式后開始重寫了星級評分;
在制作css部分今天使用了一個非常好用的工具:csssprites,非常好用,而且方便的css雪碧圖生成工具,省去了我一大把時間,接著就是關(guān)鍵的js部分了。

按照正常的星級評分來說需要做到:

  1. 鼠標劃到某顆星星,則該星星與之前的星星都會變亮,鼠標移出去恢復默認樣式;
  2. 點擊某顆星后,該星以及之前的星星會亮。

難點:

  1. 星星劃上去后,左右移動的時候,鼠標之前的星星一直亮著不會變化;
  2. 點擊星星后,鼠標移出去會觸發(fā)鼠標移出的事件與星星外div移出事件;
  3. 每次點擊后鼠標滑動離開后之前被點擊到的星星依然亮著;

先放html結(jié)構(gòu):

<div class="start-item">
   <a href="javascript:;"></a><!--
   --><a href="javascript:;"></a><!--
   --><a href="javascript:;"></a><!--
   --><a href="javascript:;"></a><!--
   --><a href="javascript:;" class="last-start"></a>
</div>

收獲及總結(jié):

  1. 設(shè)想當鼠標滑到其中一個星星的時候如果往左滑動,會出現(xiàn)星星亮-滅-亮的過程,導致很不自然的過渡,開始我是給a標簽加上了 display: inline-block;然后使用padding讓所有星星挨著的,但是后來發(fā)現(xiàn)變成inline-block后,a標簽之間的空格也會被算上距離,所有我給a標簽加上了\用來注釋掉之間的距離,從而達到了鼠標劃傷去左右滑動不會閃爍的情況,其中有一個小插曲:使用setTimeout,通過給鼠標移出的事件加上這個然后在鼠標進入的時候判斷定時器的id是否存在,來取消或者進行加減class。(ps:這種方式也可以用來給resize,scroll事件加上定時多少秒再次調(diào)用的功能;)

     var startStatus;//存儲定時器的id
     xxx.mouseenter:
         if startStatus
             clearTimeout(startStatus)
     
     xxx.mouseout:
         this.removeClass('active')
         startStatus = setTimeout(function(){
             this.prevAll().removeClass('active')
         },200)
    
  2. 當我點擊的時候我本來是要讓從點擊的星星開始到其之前所有的星星都會亮,但是當鼠標劃上去的時候又消失的,所有這個糾結(jié)了很久,試過好幾種方法,使用過通過off來解綁的,但是都失敗了,因為貌似綁定的事件對象不同,當我用on的時候是給所有的a加上了代理事件,當我click的時候,點擊的是當前的a標簽;我通過xxx.off('.removeStart',this)的方式來進行解綁,但是還是存在問題,事件要么是給所有的a標簽解綁了還是只是當前的,但是這種走不通。
    最后我通過看了網(wǎng)上的demo清楚了自己對需求理解的不到位,問題的沖突在于點擊后同時觸發(fā)了包裹層的鼠標出事件。
    使用off無法解決后,使用了布爾值,但是第二次點擊仍然有問題,最后誤打誤撞的寫下了正確的想法。

其實是這樣的,只需要給鼠標移處事件加上一個判斷;
首先如何確定是第二次點擊呢?所以我設(shè)置了三個全局變量:

var chose=false, //控制鼠標離開事件執(zhí)行的函數(shù)
    startIndex, //存儲點擊后的index
    $startP;  //存儲星星父級jquery對象

其中chose就是用來開關(guān)的,
我在點擊的時候存了startIndex和$startP兩個變量;一個當前點擊星星的序列,另一個是當前星星包裹層的jquery對象;
然后當我鼠標移出的時候,我判斷chose是否為true,如果是的話說明已經(jīng)點擊了星星,那么,鼠標移出后,之前點擊到的星星依舊會亮著,然后進而判斷startIndex是否存在,如果存著說明已經(jīng)點過了,然后亮起來星星,如果沒有,則鼠標移出后刪除所有a標簽的class;

最后有一個問題是,什么時候重置那三個屬性?

后來我在click事件里面加了一個判斷,是否是第一次點擊,條件是startIndex,如果startIndex存在的話說明已經(jīng)點過一次了,重置startIndex和$startP,如果第一次點擊的話,將chose默認為false,然后在點擊下一題那里也是通過這個來判斷的。

function holdStart(){
  $startP.children().each(function(index,elem){
    if(index < startIndex){
      $(elem).addClass('active');
    }else{
      $(elem).removeClass('active');
    }
  })
}
$dialog.on('click','.easy-test .container .step-base .start-item a',function(){ 
  if(!startIndex){
    chose = !chose;
  }
  $startP = '';
  startIndex = '';
  var $tips = $('.easy-test .container .tips');
  $tips.hide();
  flag = true;
  var _this = $(this);
  $startP = $(this).parent();
  startIndex = _this.index()+1;
  
  _this.prevAll().addClass('active');
  _this.addClass('active');

  
  console.log(chose);
});

其實通過寫這篇文章主要是想要理清一下去解決一個問題的思路:首先是需要描述清楚需要達到的效果,然后分效果進行完成,說起來自己的邏輯思維能力太差勁了,有時候轉(zhuǎn)不過彎來,做事太死板。為什么沒有想到那種解決方案呢?
最關(guān)鍵的思路是在鼠標離開的時候進行判斷。

GitHub Demo地址:
https://github.com/CodeDreamfy/CodeDemo/tree/development/start-pingfen

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • HTML標簽解釋大全 一、HTML標記 標簽:!DOCTYPE 說明:指定了 HTML 文檔遵循的文檔類型定義(D...
    米塔塔閱讀 3,533評論 1 41
  • 總結(jié): 鼠標事件 1.click與dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r閱讀 1,724評論 2 10
  • 美食與美衣全都能拯救人于沮喪之中,一個人專注于審美的過程,就是納悅自己,滋養(yǎng)身心的過程,這個過程妙不可言。 木心先...
    曌則璀璨閱讀 373評論 1 0
  • 今天傍晚,偶遇一明媚女子,看著特別舒服,記之。 辦完事回來,順路去大名(一家板栗店的名字)買板栗。大名板栗位于老市...
    行云流水joy閱讀 417評論 11 6
  • 11月7日 因為我沒有跟她打招呼而生氣,而且不相信我沒有看見她,聲稱一個星期都不再理我。最后拿全家人的性命發(fā)毒誓才...
    名再道號直行閱讀 145評論 0 0

友情鏈接更多精彩內(nèi)容