【问题标题】:How can I change a CSS gradient via JavaScript?如何通过 JavaScript 更改 CSS 渐变?
【发布时间】:2023-04-07 06:19:01
【问题描述】:

我有一个应用了以下渐变的 div:

/* Mozilla Firefox */ 
background-image: -moz-linear-gradient(top, #2E2E28 0%, #4D4C48 100%);
/* Opera */ 
background-image: -o-linear-gradient(top, #2E2E28 0%, #4D4C48 100%);
/* Webkit (Safari/Chrome 10) */ 
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #2E2E28), color-stop(1, #4D4C48));
/* Webkit (Chrome 11+) */ 
background-image: -webkit-linear-gradient(top, #2E2E28 0%, #4D4C48 100%);
/* IE10+ */
background: -ms-linear-gradient(top,  #2E2E28 0%,#4D4C48 100%);
/* W3C */
background: linear-gradient(top,  #2E2E28 0%,#4D4C48 100%);

如何将“#2E2E28”更改为另一个数字,但仍能避免跨浏览器的噩梦?

【问题讨论】:

  • 这对你不起作用吗?stackoverflow.com/questions/11943322/…
  • 如果您对使用 jQuery 感到满意,它会规范化样式,因此您不需要包含所有前缀。
  • @Piyuesh 该示例中没有任何内容保留跨浏览器功能
  • @Spudley Jquery 很好。你能举个例子吗?
  • @The_asMan one answer 来自那个问题,但是 jQuery 自编写以来已经发展,因此不再需要供应商前缀属性并且它可以透明地处理它。这已针对 jQuery 1.8 进行了更改 - 请参阅 #10679

标签: javascript html css styles


【解决方案1】:

以下函数将采用两种颜色作为参数并返回您指定的样式字符串,并将适当的子字符串替换为给定的颜色。

你可以在here看到这个。

var makeGradientStyle = function(){
    var gradientString = '\
        /* Mozilla Firefox */ \
background-image: -moz-linear-gradient(top, {colour1} 0%, {colour2} 100%);\
        /* Opera */ \
        background-image: -o-linear-gradient(top, {colour1} 0%, {colour2} 100%);\
        /* Webkit (Safari/Chrome 10) */ \
        background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, {colour1}), color-stop(1, {colour2}));\
        /* Webkit (Chrome 11+) */ \
        background-image: -webkit-linear-gradient(top, {colour1} 0%, {colour2} 100%);\
        /* IE10+ */\
        background: -ms-linear-gradient(top,  {colour1} 0%,{colour2} 100%);\
        /* W3C */\
        background: linear-gradient(top,  {colour1} 0%,{colour2} 100%);\
    ';

    return function(colour1, colour2){
        return gradientString.replace(/\{colour1\}/g, colour1).replace(/\{colour2\}/g, colour2)
    }
}();

然后您可以按以下方式申请。缺点在于您要替换整个样式字符串,但您可以使用

var p = document.getElementById('p');

p.setAttribute('style', p.getAttribute('style') + '; ' + makeGradientStyle('#ff0000', '#0000ff'));

【讨论】:

  • 将样式作为一个整体属性分配是一个有趣的想法。
  • 需要根据实现指定不同的样式属性。我想你已经使用内置逻辑来处理不同的变化,所以 JS 可以坚持它擅长的东西:动态修改和 DOM 操作。此方法的另一个优点是您可以通过filter 或类似的方式轻松修改 CSS 字符串以适应旧 IE。
  • 关键是您不必实现替代逻辑来确定适当的实现方法:CSS 会自己处理。
  • @Barney 这是一个很好的答案。外箱思考。我已经把它打包成一个轻量级的 jQuery 插件,在下面...
【解决方案2】:

使用 jQuery 会是:

$('.gradient').css({'background-image': 'linear-gradient(to top,  #2E2E28 0%, #4D4C48 100%)'});

对于野生动物园:

$('.gradient').css({'background-image': '-webkit-linear-gradient(top,  #2E2E28 0%, #4D4C48 100%)'});

here for a live example

似乎可以跨浏览器工作。

编辑

我做了一个小插件,可以帮助你处理不同的颜色:

;(function($) {
    var isSafari = /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);

    var methods = {
        init: function (settings) {

            settings = $.extend( {
              'colors'         : ['red', 'blue'],
              'direction'      : 'top'
            }, settings);

            return this.each(function(){
                if($.isArray(settings.colors) && settings.colors.length >= 2) {
                    $(this).css({ 
                        'background':
                        methods.gradientToString(settings.colors, settings.direction)
                    });
                } else {
                    $.error('Please pass an array');
                }

            });

        },
        gradientToString: function (colors, direction) {

            var nbColors = colors.length;

            //If no percent, we need to calculate them
            if(colors[0].percent === undefined) {

                //Passed only colors as an array we make it an object
                if(colors[0].color === undefined) {
                    var tmp = [];
                    for(i=0; i < nbColors; i++)
                        tmp.push({'color':colors[i]});

                    colors = tmp;
                }

                var p = 0,
                    percent = 100 / (nbColors - 1);

                //calculate percent
                for(i=0; i< nbColors; i++) {
                    p = i === 0 ? p : (i == nbColors-1 ? 100 : p + percent);
                    colors[i].percent = p;
                }
            }

            var to = isSafari ? '' : 'to';

            //build the string
            var gradientString = isSafari ? '-webkit-linear-gradient(' : 'linear-gradient(';

           gradientString += to +' '+ direction;

            for(i=0; i < nbColors; i++)
               gradientString += ', '+ colors[i].color + ' ' + colors[i].percent + '%';

            gradientString += ')';
            return gradientString;

        }

    };

    $.fn.gradientGenerator = function () {
        return methods.init.apply( this, arguments );
    };
})(jQuery);

例如这样使用它:

$('.gradient').gradientGenerator({
    colors : ['#2E2E28', '#4D4C48']
});

$('.change-color').on('click', function(e) {

    e.preventDefault();
    $('.gradient').gradientGenerator({
        colors : [{color:'#4D4C48',percent:0}, {color:'#282827', percent:30}, {color:'#2E2E28', percent: 100}],
        direction : 'left'
    });

});

看到它working here

【讨论】:

  • 刚刚再次测试 jsfiddle.net/soyuka/vnQke 在 ipad 上的 safari 或 windows 7 pc 上的 safari 中不起作用
  • 你说得对,它适用于 opera、ff、chrome 但不适用于 safari,我正在寻找原因。
  • @The_asMan 现在它在 safari 上运行,你可以在 iPad 上测试吗?不过我没有在 IE 上试过。
  • 在 chrome 和 IE9 中损坏,不确定是否需要它在 ie9 上工作,但无法测试 10 atm
  • 请测试一下 IE10,IE9 不能用,我今天早上在做,但对我来说似乎有点没用。对于 IE9,它需要 filter attr,只有 2 种颜色兼容,而且我在 OS X 上,所以很难调试。也许你可以自己实现它:)。
【解决方案3】:

基于 Barney 的出色回答,这里有一个小的 jQuery 插件:

(function($) { 

  $.fn.cssGradient = function(options) {

    // support multiple elements

    if(this.length > 1){
      this.each(function(){
        $(this).cssGradient(options);
      });
      return this;
    }

    // private variables

    var that = this;

    var metaData = {};
    metaData['version'] = "1.0.0";

    // settings

    // Extend our default options with those provided.
    // Note that the first argument to extend is an empty
    // object – this is to keep from overriding our "defaults" object.

    var defaultOptions = {
          background:'',
          color1:'',
          color2:''
        }

    var settings = $.extend({},defaultOptions,options);

    // private methods

    var init = function() {
      start();
      return that;
    }

    var start = function(){
      var element = jQuery(that);
      var attr = element.attr('style');
      var style = "";
      if (typeof attr !== typeof undefined && attr !== false) {
        style = element.attr('style') + makeGradientStyle(settings.background,settings.color1,settings.color2);
      }
      else{
        style = makeGradientStyle(settings.background,settings.color1,settings.color2);
      }
      element.attr('style',style);
    }

    var makeGradientStyle = function(background,color1,color2){
      var gradientString = 'background:{background};background-image:-moz-linear-gradient(top,{color1} 0%,{color2} 100%);background-image:-o-linear-gradient(top,{color1} 0%,{color2} 100%);background-image:-webkit-linear-gradient(top,{color1} 0%,{color2} 100%);background-image:-ms-linear-gradient(top,{color1} 0%,{color2} 100%);background-image:linear-gradient(to bottom,{color1} 0%,{color2} 100%);';
      return gradientString.replace(/\{background\}/g,background).replace(/\{color1\}/g,color1).replace(/\{color2\}/g,color2);
    }

    // public methods

    this.version = function() {
      console.log('cssGradient plugin version: ',metaData['version']);
    };

    return init();

  }

})(jQuery);

并实施:

var cssGradient = jQuery('.foo').cssGradient({background:'#fff',color1:'#fff',color2:'#ff0000'});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    相关资源
    最近更新 更多