0

我正在建立一个网站,当用户将鼠标悬停在产品上时,我想为该图像提供左上角、右上角、左下角和右下角的边框。由于 CSS 属性border-top-left-image在几年前被弃用,唯一的其他解决方案就是使用 JS。目前我的想法是我将跨度与图标类一起使用,然后在悬停时附加四个跨度,然后将它们从 DOM 中删除,这是最好的解决方案,还是在我不附加四个跨度的地方有更简单的方法和每次产品悬停时删除它们,这是我当前的代码,告诉我你的想法,任何建议都会很棒,在此先感谢!

CSS

.icon {
    background: url("../images/theme/icons.png");
    overflow: hidden;
    width: 1.6em;
    height: 1.6em;
    position: absolute; 
}


.top-left {
    top: 0; 
    left: 0;
    background-position: -11.2em 24em;
}

.top-right { 
    top: 0;
    right: 0;
    background-position: -1.6em 24em;
}

.bottom-left { 
    bottom: 0;
    left: 0;
    background-position: -8em 24em;
}

.bottom-right { 
    bottom: 0;
    right: 0;
    background-position: -4.8em 24em;
}

HTML

<div class="layout-product">
    <a href="http://www.mysite.com/product/lorem-ipsum-1">
        <div class="product-image">
             <img src="http://www.mysite.com/images/thumbnail/lorem-ipsum-1.jpg" alt="">
        </div>
    </a>
</div>

jQuery

$('.layout-product').hover(function() { 

    $(this).find('.product-image').append('<span class="icon top-left"></span>'

        + '<span class="icon top-right"></span>'
        + '<span class="icon bottom-left"></span>'
        + '<span class="icon bottom-right"></span>'
    );

}, function() {

    $('.icon').remove();
});
4

1 回答 1

1

您应该在创建/删除节点之前尝试重用它们。与 DOM 交互的 JavaScript 越少,你的动画和 UX 就会越快、越流畅。由于您没有检索任何有关悬停事件的动态信息,因此您可以将.icon元素放入初始 html 中,并带有一个display: none属性。在 CSS 中或在悬停时使用 JS 显示/隐藏。脚本也会阻止页面加载,因此在一定程度上它们会影响性能,显然取决于脚本的长度。

例如。

(添加到您现有的 CSS)

/* Default */
.layout-product .icon {
  display: none;
}

.layout-product:hover .icon {
  display: block; /* or inline-block or whatever you like that isn't none */
}

HTML

<div class="layout-product">
  <a href="http://www.mysite.com/product/lorem-ipsum-1">
    <div class="product-image">
      <img src="http://www.mysite.com/images/thumbnail/lorem-ipsum-1.jpg" alt="">
      <span class="icon top-left"></span>
      <span class="icon top-right"></span>
      <span class="icon bottom-left"></span>
      <span class="icon bottom-right"></span>
    </div>
  </a>
</div>

如果您希望动画具有更大的灵活性,您可以使用 Javascript而不是我提供的 CSS。

JavaScript

// I have used a toggle which means it applies for both .mouseenter and .mouseleave 
// which the .hover function alias. If you pass one function rather than two it will
// Use that function for both events. Customize as you like.
$('.layout-product').hover(function(e) { 

  $(this).find('.icon').fadeToggle();

});

同样不用说,如果您可以避免在 html 中使用空元素并使用您可以使用的任何 css 属性backgroundborder-image那么这将是优先的,更少的 DOM 元素是更好的性能和可维护性,以及纯粹的表现元素应尽可能避免语义(表示与内容的分离)。

浏览器兼容性显然是一个因素:

于 2013-08-30T01:30:41.600 回答