【问题标题】:Change CSS color property dynamically on click单击时动态更改 CSS 颜色属性
【发布时间】:2015-01-22 09:32:23
【问题描述】:

我有一个生成随机颜色的函数,我想将该函数与 jQuery 在点击时toggleClass 的功能结合使用。我想在单击时为table 单元格生成唯一的颜色,并在用户再次单击彩色单元格时删除生成的颜色(再次使其变为白色/无色)。

HTML 表格:

   <div id="container">
        <table id="table">
            <tr>
                <td></td>
                <td></td>
            </tr>
            <tr>
                <td></td>
                <td></td>
            </tr>

        </table>
    </div>

颜色生成函数:

    function getRandomColor() {
        var letters = '0123456789ABCDEF'.split('');
        var color = '#';
        for (var i = 0; i < 6; i++ ) {
            color += letters[Math.floor(Math.random() * 16)];
        }
        return color;
    }

为单元格分配颜色:

$( function(){
    $('td').click( function(){
            $(this).css('background-color',getRandomColor);
    });
});

【问题讨论】:

  • 那么问题来了,你的代码工作正常吗?
  • 工作一半。它会添加随机颜色,但是一旦我单击已着色的单元格,颜色就不会变为白色。
  • 请注意:接受的答案仅适用于部分浏览器。在下面添加了一个更便携的替代方案。

标签: jquery css


【解决方案1】:

注意使用'rgba(0, 0, 0, 0)' 的解决方案仅适用于某些浏览器(例如Chrome,但不适用于IE)。此版本从正文中获取颜色以供参考(但任何未设置 background-colour 的元素都可以。

您可以将代码更改为 jQuery 扩展,例如 toggleRandomColor,如下所示:

var blankColor = $('body').css('background-color');
$.fn.toggleRandomColor = function () {
    if ($(this).css('background-color') == blankColor) {
        $(this).css('background-color', getRandomColor);
    } else {
        $(this).css('background-color', '');
    }
};

然后像这样简单地使用它:

$('td').click(function () {
    $(this).toggleRandomColor();
});

JSFiddle: http://jsfiddle.net/TrueBlueAussie/nmav8d3n/4/

【讨论】:

  • 很好的答案,但如果所有元素都有颜色怎么办? (有点极端,但仍然是一种可能的情况,不是吗?)
  • @undroid:在您需要更改分页/显示策略之前,浏览器中任何内容列表的实际限制是几百个。这种方法的开销并不比元素上的唯一类多,但不需要创作。我们在生产项目中使用它没有问题。
【解决方案2】:

只需在为单元格着色时添加一个类,然后检查它:

$('td').click( function(){

    var $td = $(this);

    if($td.hasClass('is-colour')) {
        $td.css('background-color','transparent')
            .removeClass('is-colour');
    else {
        $td.css('background-color',getRandomColor())
            .addClass('is-colour');
    }

});

【讨论】:

  • 谢谢,可能没有注意到,但是没有这些括号也可以正常工作
  • @undroid 对了,我已经更新了我的答案来更好地解决你的问题
【解决方案3】:

我不能 100% 确定我是否正确理解了您,所以您想单击一个单元格并使其着色,如果它已经着色则使其变为白色?

如果是这样

$( function(){
    var default_background = 'rgba(0, 0, 0, 0)';

    $('td').click( function(){
        var $this = $(this),
            curr_background = $(this).css('background-color');

        if (curr_background === default_background){
            $this.css('background-color',getRandomColor);
        } else {
            $this.css('background-color', default_background);  
        }
    });
});

这里是小提琴http://jsfiddle.net/qL10e5xd/

【讨论】:

  • 注意:此代码在任何版本的 IE 上都不起作用。不同的浏览器为css('background-color')返回不同的默认值。
【解决方案4】:

检查默认值,然后生成新颜色,或者删除它。

function getRandomColor() {
     var letters = '0123456789ABCDEF'.split('');
     var color = '#';
     for (var i = 0; i < 6; i++ ) {
         color += letters[Math.floor(Math.random() * 16)];
     }
     return color;
 }

$( function(){
    $('td').click( function(){
        if ($(this).css('background-color') == 'rgba(0, 0, 0, 0)') {
            // if background-color isn't set, jQuery returns 'rgba(0, 0, 0, 0)'
            $(this).css('background-color',getRandomColor);
        } else {
            $(this).css('background-color','');
        }
    });
});

http://jsfiddle.net/nmav8d3n/

【讨论】:

  • 我为什么要否决这个答案?正是我想要的。谢谢,像魅力一样工作
  • @undroid:不是你,有人在没有解释的情况下投了反对票,我只想知道为什么:-)
  • 那么是的,知道为什么这会被否决会很有趣。
  • 不是我的 DV,但'rgba(0, 0, 0, 0)' 仅适用于某些浏览器。例如,它在 IE 中不起作用,因为它返回一个空白字符串。请参阅我的答案以获得解决方法(也将其转换为 jQuery 插件)。
【解决方案5】:

您可以使用此代码

$( function(){
    var clicked = flase;
    $('td').click( function(){
    if(!clicked){
            $(this).css({'background-color',getRandomColor});
            clicked = true;
    }
    else{
            $(this).css({'background-color','white'});
            clicked = false;
        }
    });
});

【讨论】:

  • @Rezoyanul Islam Reza:这不是一个的主意。这是一个非常糟糕的想法,已经被连续投票!任何引入范围变量的东西都不会支持多个元素,因此应该不鼓励。状态应该来自元素本身(class/data/attr/css等)
  • @Rezoyanul Islam Reza:想象一下当我发现你和 Kamruzzaman 在同一个城市工作时我的“惊喜”。同样惊讶地发现你自己的答案最近也被连续投票。也许发给 addiesoft 和 iqrasys 的电子邮件会减缓对 SO 的欺骗?不是很专业的行为:P
猜你喜欢
  • 2012-12-28
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 2018-06-23
  • 2020-11-14
  • 1970-01-01
相关资源
最近更新 更多