【问题标题】:Hover over element animate next element - How to remove inline JS将鼠标悬停在元素上动画下一个元素 - 如何删除内联 JS
【发布时间】:2014-10-18 21:41:16
【问题描述】:

我对 JavaScript 比较陌生,但我试图找到一种更有效的方法来调用翻转函数,而无需在 HTML 中使用内联事件。下面是我目前使用的方法:

HTML

        <div id="work_square">
        <img onmouseover="rolloverIn('rollover_1');" onmouseout="rolloverOut('rollover_1');" src="images/frugal_image.png" width="100%"/>
        <div onmouseover="rolloverIn('rollover_1');" onmouseout="rolloverOut('rollover_1');" id="rollover_1" class="rollovers">
            <div id="rollover_text">
                <h2>ROLLOVER 1 TITLE</h2>
                <p>This is rollover 1.</p>
            </div>
        </div>
    </div>
    <div id="work_square">
        <img onmouseover="rolloverIn('rollover_2');" onmouseout="rolloverOut('rollover_2');" src="images/exhibiton_image.jpg" width="100%"/>
        <div onmouseover="rolloverIn('rollover_2');" onmouseout="rolloverOut('rollover_2');" id="rollover_2" class="rollovers">
            <div id="rollover_text">
                <h2>ROLLOVER 2 TITLE</h2>
                <p>This is rollover 2.</p>
            </div>
        </div>
    </div>

JS

<script>
function rolloverIn(el){
    var elem = document.getElementById(el);
    elem.style.opacity = 1;
    elem.style.transform = "scale(1)";
}
function rolloverOut(el){
    var elem = document.getElementById(el);
    elem.style.opacity = 0;
    elem.style.transform = "scale(0)";
}

基本上,当鼠标悬停在图像或鼠标悬停时,我会调用一个函数来对放置在每个 work_square 上的鼠标悬停应用 CSS 变换和不透明度更改,然后在鼠标移出时删除更改。

这种方法有效,但我认为内联编码是不好的做法。有人能指出我朝着更有效方法的正确方向吗?

谢谢。

【问题讨论】:

标签: javascript html inline-code rollover-effect


【解决方案1】:

很抱歉破坏了你使用 JS 的梦想,但是
这在纯 CSS 中都是可行的

.work_square{ position:relative; }
.work_square > img{ width:100%; }

.work_square .rollovers{
  position:absolute;
  top:0;
  opacity:0;
  transform: scale(0);
  transition: 0.6s;
}
.work_square:hover .rollovers{
  transform: scale(1);
  opacity:1;
}
    <div class="work_square">
      <img src="//placehold.it/800x300/cf5" />
      <div class="rollovers">
        <div class="rollover_text">
          <h2>ROLLOVER 1 TITLE</h2>
          <p>This is rollover 1.</p>
        </div>
      </div>
    </div>
    <div class="work_square">
      <img src="//placehold.it/800x300/f5f" />
      <div class="rollovers">
        <div class="rollover_text">
          <h2>ROLLOVER 2 TITLE</h2>
          <p>This is rollover 2.</p>
        </div>
      </div>
    </div> 

请注意,我已经删除了所有不必要的 ID(嘿,您不能在 有效 HTML 文档中使用重复的 ID)。
使用您的容器类 .work_square 并在其上使用 CSS :hover 添加该侦听器,而不是简单地将所需的子元素类添加到目标:

.work_square:hover .rollovers{

【讨论】:

  • 我已在您的声明中添加了“有效”限定词。如果您觉得我引入了错误,显然将其编辑掉,但是重复的 ids 可以使用,即使它们不应该使用。
  • 非常感谢,现在清理干净了,效果很好。你可能已经粉碎了我的 JS 梦想,但至少这是朝着更好的实践迈出的一步 :)
  • 谢谢@David。它更准确。
【解决方案2】:

首先,不要对多个元素使用相同的 ID,ID 是唯一的。您需要的是类,因此您的 HTML 代码应更改为以下内容:

<div class="work_square">
    <img class="rollover" src="images/frugal_image.png" width="100%"/>
    <div class="rollover">
        <div class="rollover_text">
            <h2>ROLLOVER 1 TITLE</h2>
            <p>This is rollover 1.</p>
        </div>
    </div>
</div>
<div class="work_square">
    <img class="rollover" src="images/exhibiton_image.jpg" width="100%"/>
    <div class="rollover">
        <div class="rollover_text">
            <h2>ROLLOVER 2 TITLE</h2>
            <p>This is rollover 2.</p>
        </div>
    </div>
</div>

现在,如果您想使用纯 JavaScript,无需内联代码,您可以轻松地使用 rollover 类来选择所有元素并将 mouseovermouseout 事件绑定到您的函数。这是正确的代码:

function rolloverIn(e){
    this.style.opacity = 1;
    this.style.transform = "scale(1)";
}

function rolloverOut(e){
    this.style.opacity = 0;
    this.style.transform = "scale(0)";
}

var elements = document.getElementsByClassName('rollover');
for (var i=0; i < elements.length; i++) {
    elements[i].addEventListener('mouseover', rolloverIn);
    elements[i].addEventListener('mouseout', rolloverOut);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多