2013-04-25 58 views
3

我有適用於它下面的梯度一個div:如何通過JavaScript更改CSS漸變?

/* 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」到另一個號碼,但還是避免了跨瀏覽器的噩夢?

+0

不這項工作對你的http://stackoverflow.com/questions/11943322/setting-a-css-gradient-in-javascript – Piyuesh 2013-04-25 15:39:55

+0

如果你很高興使用jQuery,它會使樣式標準化,所以你不需要包含所有的前綴。 – Spudley 2013-04-25 15:40:24

+1

@Piyuesh在這個例子中沒有任何東西保留了跨瀏覽器的功能 – 2013-04-25 15:46:51

回答

5

使用jQuery這將是:

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

Safari瀏覽器:

$('.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

+0

你的第一個例子http:// jsfiddle。net/soyuka/vnQke /不適用於ipad。 – 2013-04-25 18:46:13

+0

有趣的是,我只是更新了插件,你可以測試嗎? – soyuka 2013-04-25 18:48:49

+0

只是再次測試jsfiddle.net/soyuka/vnQke不適用於ipad或safari上的safari上的Windows 7電腦 – 2013-04-25 19:02:59

4

以下函數將採用兩種顏色作爲參數,並按照您指定的方式返回樣式字符串,並將相應的子字符串替換爲給定的顏色。

你可以看到這在行動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')); 
+0

作爲一個整體屬性指定風格是一個有趣的想法。 – 2013-04-25 18:31:13

+0

您需要根據實現指定不同的樣式屬性。我想你已經有了使用內置邏輯來處理不同變化的CSS,所以JS可以堅持它擅長的東西:動態修改和DOM操作。這種方法的另一個好處是你可以很容易地通過'filter'或其他方式修改CSS字符串來迎合舊的IE。 – Barney 2013-04-26 07:24:35

+0

關鍵是您不必實現替代邏輯來確定適當的實現方法:CSS自己處理它。 – Barney 2013-04-26 07:27:01

0

大廈,這裏是一個小的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'});