【问题标题】:Revert to Old CSS on mouseout in JavaScript在 JavaScript 中鼠标移出时恢复为旧 CSS
【发布时间】:2020-03-09 13:37:34
【问题描述】:

我正在使用以下函数在 TAG 上设置 CSS 样式:

function setStyle (styles = {}, tag){
    let key;
    for (key in styles) {
        if (!styles.hasOwnProperty(key))
           continue;
        tag.style[key] = styles[key];
    }
    return tag;
}

我创建了另一个函数,它将在鼠标悬停时应用新的 CSS 样式并在鼠标移出时恢复为旧 CSS:

function hoverCss(styleSet = {}, tag) {
        const oldCss = tag.style;

        tag.onmouseover = () => {
            // console.info('APPLY NEW CSS');
            setStyle(styleSet, tag);
        };

        tag.onmouseleave = () => {
            // console.info('RESTORE OLD CSS');
            setStyle(oldCss, tag);
        };

        return tag;
    }

当我执行上面的代码时,新的 CSS 在鼠标悬停时应用,但旧的 CSS 在鼠标离开时没有应用回来。请提供此错误的解决方案。

编辑

调用函数的其余代码如下所示:

const tag = document.getElementById('someId');
hoverCss({color:'red'}, tag);

感谢和问候

【问题讨论】:

  • 为什么不只拥有两个不同的类并在元素上切换应用的类?这种方式似乎更复杂,效率更低。
  • 您能否提供更多详细信息,例如新 css 和旧 css 的样式对象以及何时调用此方法hoverCss
  • @JeremyHarris,我不想使用 CSS 或任何 jQuery,只使用纯 JavaScript
  • @AhmedKesha,请参阅编辑。谢谢
  • @MateusMartins,同样。打电话没有错。我可以通过 tag.onmouseover 和 tag.onmouseleave 在控制台日志上打印消息。

标签: javascript css dom-events


【解决方案1】:

认为这最好用纯 css 实现

.element {
  // Add your element styles here
}

.element:hover {
 // Add styles here to be applied when element is hovered over
}

【讨论】:

  • 我不想使用 CSS。我想通过纯 JAVAScript 来实现。不应使用 jQuery 等框架。
  • @HimanshuAgrawal 你将设置 DOM 元素的 style 属性,相当于设置 CSS 本身,为什么不直接这样做呢?
  • @AnuragSrivastava,我正在处理的代码只需要通过 DOM 进行 CSS 编辑。这是客户的要求。
【解决方案2】:

尝试使用这种语法

target.addEventListener('mouseleave', () => {
  setStyle(oldCss, tag);
});

【讨论】:

  • 不工作。打电话没有错。我可以通过 tag.onmouseover 和 tag.onmouseleave 在控制台日志上打印消息。问题出在 Style 对象的某个地方。可能是我没有正确实现旧 CSS,这就是我想弄清楚
【解决方案3】:

这种行为是因为 js 威胁每个引用的对象,所以,当你做 const oldCss = tag.style 时,oldCss 对象指向与 tag.style 相同的内存地址

因此,当您更改 tag.style 上的某些属性时,它会将 oldCss 更改为,const 声明只是说您不能更改 oldCss 值,而不是子项

您必须执行const oldCss = JSON.parse(JSON.stringify(tag.style)) 以避免引用行为

【讨论】:

    【解决方案4】:

    你必须像这样在函数 hover 之外声明你的 oldCss 对象来解决你的问题

            function setStyle(styles = {}, tag) {
            console.log(styles);
            let key;
            for (key in styles) {
                if (!styles.hasOwnProperty(key))
                    continue;
                tag.style[key] = styles[key];
            }
            return tag;
        }
    
        function hoverCss(styleSet = {}, tag) {
            elementStyle = tag.style;
            oldCss = {}
            var computedStyle = window.getComputedStyle(tag, null);
            // get the default css as object and keep it 
            for (prop in elementStyle) {
                if (elementStyle.hasOwnProperty(prop)) {
                    oldCss[prop] = elementStyle[prop];
                }
            }
            // If the newCss has something isn't in the oldcss so keep that as empty
            for (let property in styleSet) {
                if (!oldCss.hasOwnProperty(property)) {
                    oldCss[property] = '';
                }
            }
            tag.addEventListener('mouseenter', function () {
                setStyle(styleSet, this);
            });
    
            tag.addEventListener('mouseout', function () {
                setStyle(oldCss, this);
            });
    
            return tag;
        }
    
        const tag = document.getElementById('someId');
        hoverCss({ color: 'red' }, tag);
    

    我知道你这样做可能是因为你需要使用 JS 来控制你的 css

    【讨论】:

    • 是的,你是对的。我需要通过 JS 来控制 CSS。你的解决方案很好,但它是有限的。当我们知道哪个标签需要什么 CSS 时,这很好。但是我的代码完全不知道 TAG。它可以是任何标签,具有任何 CSS 样式。所以它应该写在一个通用实现中,以便它可以与任何标签一起使用。
    • @HimanshuAgrawal 我更新了我的答案,使其更通用以获取旧 css 并保持它再次返回它并跟踪 newCss 中的新属性以在鼠标移出时删除它们
    猜你喜欢
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 2010-09-15
    • 2013-06-30
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多