#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. Я обновил свой пост примером.