Получить градиент цвета фона элемента CSS3 с помощью JS

#jquery #css #background #find #gradient

#jquery #css #фон #Найти #градиент

Вопрос:

На данный момент я использую следующий JS (jQuery), чтобы найти цвет фона (как rgb) нескольких других divs:

 $theColor = $(this).css("background-color");
  

Он отлично работает, за исключением градиентов CSS3.

В качестве примера у меня есть следующий css, чтобы сделать фон div похожим на заметку post-it:

 background: #FFFAAD; /* old browsers */

background: -moz-linear-gradient(top, #FFFAAD 0%, #FFF47D 100%); /* firefox */

background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#FFFAAD), color-stop(100%,#FFF47D)); /* webkit */

background: gradient(linear, left top, left bottom, color-stop(0%,#FFFAAD), color-stop(100%,#FFF47D));

filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#FFFAAD', endColorstr='#FFF47D',GradientType=0 ); /* ie */
  

jQuery, похоже, ничего не улавливает.

Как я могу использовать jQuery, чтобы найти хотя бы один из цветов, используемых в градиенте css3? Я относительно новичок в JS, поэтому, пожалуйста, потерпите меня..

Спасибо.

Комментарии:

1. Градиент — это не цвет, это фоновое изображение. Проверка background-color ничего не скажет вам о фоновом изображении.

2. Нет набора фоновых изображений; это чисто css3. Я сомневаюсь, что эти градиенты хранятся как изображения (или даже возможно хранить как изображения).

3. Существует фоновое изображение, градиент является фоновым изображением. Вот почему ваш CSS говорит background: -moz-linear-gradient вместо background-color: -moz-linear-gradient

4. Вот спецификация CSS, которая охватывает градиенты , посмотрите, как она называется

Ответ №1:

Как указано, используйте для этого CSS-хуки.

Образец, соответствующий вашим потребностям, вы найдете здесь:http://www.webmuse.co.uk/articles/csshooks-in-jquery /.

Комментарии:

1. Это хорошая ссылка, но в том месте, где она может решить проблему, о которой задается вопрос, говорится следующее: 'get' not really needed as we only want to be able to override setting a style, not really getting

2. Где это сказано в OP? Их вопрос заключается в получении значения.

Ответ №2:

Вам нужно будет создать cssHook для градиента (в jQuery, например, реализован хук для непрозрачности).

Смотрите:http://api.jquery.com/jQuery.cssHooks

В соответствии с запросом пример-код для извлечения цветов:

 (function($){   

    if ( !$.cssHooks ){
        //if not, output an error message
        alert("jQuery 1.4.3 or above is required for this plugin to work");
        return;
    }
    div = document.createElement( "div" ),
    css = "background-image:gradient(linear,left top,right bottom, from(#9f9), to(white));background-image:-webkit-gradient(linear,left top,right bottom,from(#9f9),to(white));background-image:-moz-gradient(linear,left top,right bottom,from(#9f9),to(white));background-image:-o-gradient(linear,left top,right bottom,from(#9f9),to(white));background-image:-ms-gradient(linear,left top,right bottom,from(#9f9),to(white));background-image:-khtml-gradient(linear,left top,right bottom,from(#9f9),to(white));background-image:linear-gradient(left top,#9f9, white);background-image:-webkit-linear-gradient(left top,#9f9, white);background-image:-moz-linear-gradient(left top,#9f9, white);background-image:-o-linear-gradient(left top,#9f9, white);background-image:-ms-linear-gradient(left top,#9f9, white);background-image:-khtml-linear-gradient(left top,#9f9, white);";    
    div.style.cssText = css;


    $.support.linearGradient =
    div.style.backgroundImage.indexOf( "-moz-linear-gradient" )  > -1 ? '-moz-linear-gradient' :
    (div.style.backgroundImage.indexOf( "-webkit-gradient" )  > -1 ? '-webkit-gradient' :
    (div.style.backgroundImage.indexOf( "linear-gradient" )  > -1 ? 'linear-gradient' : false));
    if ( $.support.linearGradient)
    {
      $.cssHooks['linearGradientColors'] = { 
        get: function(elem){
          var currentStyle=$.css(elem, 'backgroundImage'),gradient,colors=[];
          gradient=currentStyle.match(/gradient((.*))/g);
          if(gradient.length)
          {
            gradient=gradient[0].replace(/(linear|radial|from|btob|gradient|top|left|bottom|right|d*%)/g,'');
            colors= jQuery.grep(gradient.match(/(rgb([^)] )|#[a-zd]*|[a-z]*)/g),function (s) { return jQuery.trim( s )!=''})
          }
          return colors;
        }
    };
 }
})(jQuery);
  

Как я уже сказал, это всего лишь пример работы с cssHooks, не предназначенный для производственного использования. У меня работает в ff, Chrome, IE9, safari.
Функцию set можно найти, если перейти по ссылке, опубликованной RickV.

Использование: $('selector').css('linearGradientColors')
Возвращает массив с цветами

Комментарии:

1. Разве вам все еще не нужно написать какой-нибудь JavaScript, чтобы вернуть значение в get перехватчике?

2. Да, конечно. Если вам нужно что-то, что еще не реализовано в jQuery, вам придется написать это самостоятельно, а градиент не реализован.

3. Вопрос в том, что вам нужно написать, чтобы реализовать это в jQuery.

4. Вопрос был «Как я могу использовать jQuery», и мой ответ «cssHooks», потому что именно так здесь можно использовать jQuery.

5. Вопрос в следующем: «Получить градиент цвета фона элемента CSS3 с помощью JS».

Ответ №3:

Вы можете извлечь цвета, используемые в градиенте, просмотрев background-image свойство элемента, а затем извлекая перечисленные цвета. Вот пример, в нем используется регулярное выражение CSS color matching из этого поста. Я только что привязал код к onclick событию элементов с фоном:

 $("div").bind("click", function() {
    window.alert('Background color: '   ($(this).css('background-color')));
    var re = /(#([0-9A-Fa-f]{3,6})b)|(aqua)|(black)|(blue)|(fuchsia)|(gray)|(green)|(lime)|(maroon)|(navy)|(olive)|(orange)|(purple)|(red)|(silver)|(teal)|(white)|(yellow)|(rgb(s*b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])bs*,s*b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])bs*,s*b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])bs*))|(rgb(s*(d?d%|100%) s*,s*(d?d%|100%) s*,s*(d?d%|100%) s*))/g;
    var colors = ($(this).css('background-image')).match(re);
    for (var i=0; i < colors.length; i  ) {
        window.alert('Gradient colour: '   colors[i]);
    }
});
  

Обратите внимание, что регулярное выражение предназначено для цветов CSS2, поэтому оно не будет соответствовать ни одному из rgba() или hsla() цветов, но у вас должна быть возможность расширить его при необходимости.

Комментарии:

1. Какая здесь часть jQuery (как запрошено OP)? Восстанавливаем текущий стиль? Также, если вы игнорируете это, cssHooks — это метод, с которым здесь можно работать вместо этого решения.

2. @DrMolle $(this).css('background-color') был бы соответствующим jQuery. С cssHooks не нужно ничего делать, потому что требуемая информация уже доступна в стандартном jQuery.

3. Действительно, и если кто-то попросит окно оповещения с помощью jquery, которое вы предлагаете $(window)[0].alert('an alert with jquery'); . Я почти уверен, что в конце концов ему нужно не только знать какой-то цвет. cssHooks позволяют ему расширять jquery под свои нужды, не теряя известных возможностей использования.

4. @DrMolle Извините, я должен был сказать $(this).css('background-image') в моем предыдущем комментарии, потому что проблема в том, что $(this).css('background-color') возвращает не ту информацию, которую он хочет. Как бы я использовал cssHooks в этой ситуации? Какую выгоду это дало бы по сравнению с возвратом информации с помощью $(this).css('background-image') ? Пожалуйста, обновите свой ответ кодом, если включение его в комментарий слишком ограничивает.

5. Преимущество просто, я могу использовать его как jQuery-way для получения css-значений вместо того, чтобы определять где-либо какие-либо функции, которые нарушают обычный jQuery-workflow. Я обновил свой пост примером.