2017-02-13 183 views
2

我只是想知道最佳做法是切換一個類,或者只是在使用jquery的mouseenter/mouseleave狀態期間添加和刪除它。兩者似乎都很好,只是不確定哪個最適合。jQuery添加/刪除類或切換類

謝謝

$('#image1').mouseenter(function() { 
 
    $('#image1').toggleClass('transform'); 
 
    $('#image1 .images-color-overlay').toggleClass('transparent'); 
 
    $('#image1 .images-text').toggleClass('show-images-text'); 
 
    }); 
 

 
    $('#image1').mouseleave(function() { 
 
    $('#image1').toggleClass('transform show-images-text'); 
 
    $('#image1 .images-color-overlay').toggleClass('transparent'); 
 
    $('#image1 .images-text').toggleClass('show-images-text'); 
 
    });
.images-color-overlay { 
 
    position: absolute; 
 
    top: 0; 
 
    right: 0; 
 
    bottom: 0; 
 
    left: 0; 
 
    background-color: rgba(0, 0, 0, 0.4); 
 
    -webkit-transition: all 1s ease; 
 
    transition: all 1s ease; 
 
} 
 
.images { 
 
    width: 33.333%; 
 
    float: left; 
 
    overflow: hidden; 
 
    position: relative; 
 
} 
 
#image1 { 
 
    background-image: url("http://placehold.it/1000x320"); 
 
    background-size: cover; 
 
    background-repeat: no-repeat; 
 
    background-position: center; 
 
    width: 100%; 
 
    height: 100px; 
 
    -webkit-transition: all 1s ease; 
 
    transition: all 1s ease; 
 
} 
 
.images-text { 
 
    text-align: center; 
 
    width: 100%; 
 
    position: absolute; 
 
    bottom: -20px; 
 
    color: #fff; 
 
    font-size: 10px; 
 
    line-height: normal; 
 
    -webkit-transition: all 1s; 
 
    transition: all 1s; 
 
} 
 
.show-images-text { 
 
    -webkit-transition: all 1s; 
 
    transition: all 1s; 
 
    bottom: 20px; 
 
} 
 
.transform { 
 
    -webkit-transform: scale(1.25); 
 
    transform: scale(1.25); 
 
    -webkit-transition: all 1s ease; 
 
    transition: all 1s ease; 
 
} 
 
.transparent { 
 
    background-color: rgba(0, 0, 0, 0) !important; 
 
    -webkit-transition: all 1s ease; 
 
    transition: all 1s ease; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="images"> 
 
    <div id="image1"> 
 
    <div class="images-color-overlay"> 
 
     <p class="images-text">hidden-text</p> 
 
    </div> 
 
    </div> 
 
</div>

+0

Rory的答案是非常好的。但是至於使用toggleClass vs添加和刪除,它取決於你的類的初始狀態和期望的結果。無論您想要什麼,切換都會將其打開和關閉。所以你需要確保沒有其他代碼可以切換課程(並保持更改)。並確保初始狀態總是您期望的狀態。在罕見的情況下,你無法確定。它更好地使用刪除和添加。 –

回答

3

您的代碼在技術上是很好,但是你可以縮短它只是使用hover()方法,爲您提供的功能將被稱爲兩個mouseentermouseleave事件。

您也可以使用函數中的this引用來保存DOM訪問,並且還將從$(this)創建的jQuery對象緩存在一個變量中以供重用。試試這個:

$('#image1').hover(function() { 
 
    var $image = $(this).toggleClass('transform'); 
 
    $image.find('.images-color-overlay').toggleClass('transparent'); 
 
    $image.find('.images-text').toggleClass('show-images-text'); 
 
});
.images-color-overlay { 
 
    position: absolute; 
 
    top: 0; 
 
    right: 0; 
 
    bottom: 0; 
 
    left: 0; 
 
    background-color: rgba(0, 0, 0, 0.4); 
 
    -webkit-transition: all 1s ease; 
 
    transition: all 1s ease; 
 
} 
 
.images { 
 
    width: 33.333%; 
 
    float: left; 
 
    overflow: hidden; 
 
    position: relative; 
 
} 
 
#image1 { 
 
    background-image: url("http://placehold.it/1000x320"); 
 
    background-size: cover; 
 
    background-repeat: no-repeat; 
 
    background-position: center; 
 
    width: 100%; 
 
    height: 100px; 
 
    -webkit-transition: all 1s ease; 
 
    transition: all 1s ease; 
 
} 
 
.images-text { 
 
    text-align: center; 
 
    width: 100%; 
 
    position: absolute; 
 
    bottom: -20px; 
 
    color: #fff; 
 
    font-size: 10px; 
 
    line-height: normal; 
 
    -webkit-transition: all 1s; 
 
    transition: all 1s; 
 
} 
 
.show-images-text { 
 
    -webkit-transition: all 1s; 
 
    transition: all 1s; 
 
    bottom: 20px; 
 
} 
 
.transform { 
 
    -webkit-transform: scale(1.25); 
 
    transform: scale(1.25); 
 
    -webkit-transition: all 1s ease; 
 
    transition: all 1s ease; 
 
} 
 
.transparent { 
 
    background-color: rgba(0, 0, 0, 0) !important; 
 
    -webkit-transition: all 1s ease; 
 
    transition: all 1s ease; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="images"> 
 
    <div id="image1"> 
 
    <div class="images-color-overlay"> 
 
     <p class="images-text">hidden-text</p> 
 
    </div> 
 
    </div> 
 
</div>

+0

非常感謝,非常豐富和有益的。將使用懸停功能,而不是鼠標輸入/離開,該變量是一個很好的主意,這將有助於縮短代碼。再次感謝 – rufus

0

toggleClass是你的情況韌皮實踐。

在內部它也做同樣的事情,如果類存在然後刪除它,如果沒有,然後添加它。自己看,轉到github link並搜索toggleClass

// Check each className given, space separated list 
if (self.hasClass(className)) { 
    self.removeClass(className); 
} else { 
    self.addClass(className); 
} 
+0

非常感謝您的意見非常感謝 – rufus

3

那麼很多這種風格的問題在這裏被擊落,因爲它似乎歸結爲偏好。但是,HERE是一種不使用JavaScript,只使用CSS的方法,有些人可能會認爲它更高效。

.images-color-overlay { 
 
    position: absolute; 
 
    top: 0; 
 
    right: 0; 
 
    bottom: 0; 
 
    left: 0; 
 
    background-color: rgba(0, 0, 0, 0.4); 
 
    -webkit-transition: all 1s ease; 
 
    transition: all 1s ease; 
 
} 
 
.images { 
 
    width: 33.333%; 
 
    float: left; 
 
    overflow: hidden; 
 
    position: relative; 
 
} 
 
#image1 { 
 
    background-image: url("http://placehold.it/1000x320"); 
 
    background-size: cover; 
 
    background-repeat: no-repeat; 
 
    background-position: center; 
 
    width: 100%; 
 
    height: 100px; 
 
    -webkit-transition: all 1s ease; 
 
    transition: all 1s ease; 
 
} 
 
.images-text { 
 
    text-align: center; 
 
    width: 100%; 
 
    position: absolute; 
 
    bottom: -20px; 
 
    color: #fff; 
 
    font-size: 10px; 
 
    line-height: normal; 
 
    -webkit-transition: all 1s; 
 
    transition: all 1s; 
 
} 
 

 
#image1:hover { 
 
    -webkit-transform: scale(1.25); 
 
    transform: scale(1.25); 
 
    -webkit-transition: all 1s ease; 
 
    transition: all 1s ease; 
 
} 
 

 
#image1:hover .images-text { 
 
    -webkit-transition: all 1s; 
 
    transition: all 1s; 
 
    bottom: 20px; 
 
} 
 

 
.images-color-overlay:hover { 
 
    background-color: rgba(0, 0, 0, 0) !important; 
 
    -webkit-transition: all 1s ease; 
 
    transition: all 1s ease; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="images"> 
 
    <div id="image1"> 
 
    <div class="images-color-overlay"> 
 
     <p class="images-text">hidden-text</p> 
 
    </div> 
 
    </div> 
 
</div>

+0

非常感謝這一點,唯一的原因,我不想走下完整的CSS路線(我會盡可能爲大多數事情)是因爲我將使用jQuery 'if'語句將懸停狀態轉換爲移動設備上的點擊狀態。我總是在通過css使用懸停狀態和在不同屏幕尺寸之間使用jquery在同一元素上單擊狀態時擔心衝突。感謝這一點,雖然是一種享受。 – rufus

+1

我不會說這種問題被擊落。對於這類問題,CSS始終是最好的解決方案,但它不符合OP的要求。 +1 –