2010-05-22 4 views
2

У меня возникла проблема, когда я пытаюсь обновить фоновый градиент элемента с помощью JavaScript на основе значений, которые я указываю.Тест для синтаксиса синтаксиса радиального градиента CSS3

Я попробовал этот маршрут:

elem.style.backgroundImage = '-webkit-gradient(radial, '+x+' '+y+', 0, '+x+' '+y+', 800, from(#ccc), to(#333)), -moz-radial-gradient('+x+'px '+y+'px, circle cover, #ccc 0, #333 100%)'; 

С Webkit и Gecko имеют два различных синтаксиса для CSS3 градиентов, мне нужно указать оба. Однако приведенный выше код не работает. Он работает, если у меня есть только синтаксис Gecko или просто синтаксис Webkit, а не оба.

Я думаю, вы можете проверить поддержку градиента CSS, но мой вопрос в том, есть ли способ проверить, какой синтаксис нужно использовать без браунинга? Имейте в виду, что мне нужно настроить мои градиенты таким образом, так как динамические изменения градиента x и y динамически изменяются.

Надеюсь, что это имеет смысл, спасибо.

ответ

1

Редактировать Ниже приведено полезное по другим причинам, но на самом деле, я не думаю, что это помогает с проблемой OP, чтобы знать, использовать ли WebKit или symatax Firefox! (Doh) Это помогает узнать, можно ли вообще использовать градиенты.

Редактировать снова Но! Глядя на источник Modernizr, мы показываем, как это сделать с помощью тестового теста (они умны, эти люди). Вы, наверное, можете понять это, глядя на источник себя, но вот быстро взломана-вместе пример:

function testGradientSyntax() { 
    var element; 

    element = document.createElement("testsyntax"); 
    element.style.cssText = 
     "background: -webkit-gradient(radial, 45 45, 10, 52 50, 30, from(#A7D30C), to(rgba(1,159,98,0)), color-stop(90%, #019F62))"; 
    if (element.style.background.indexOf("-webkit") >= 0) { 
     // It's WebKit syntax 
     log("This supports WebKit syntax"); 
    } 
    else { 
     // It's not WebKit syntax 
     log("This doesn't support WebKit syntax"); 
    } 
} 

Вы можете использовать Modernizr для этого. Он обнаруживает relevant syntax и предоставляет вам возможность использовать один файл CSS с обоими синтаксисами.

Пример кода градиент от Docs:

button.glossy { 
    background: #ccc url(gloss.png) 50% 50% repeat-x; 
} 
.cssgradients button.glossy { 
    background: #ccc -webkit-gradient(linear, left top, left bottom, 
     from(rgba(255,255,255, .4)), 
     color-stop(0.5, rgba(255,255,255, .7)), 
     color-stop(0.5, rgba(0,0,0, .2)), 
     to(rgba(0,0,0, .1))); 
} 
.cssgradients button.glossy:hover { 
    background-color: #fff; 
} 

(Edit В приведенном выше, я удалил линию от конца правления .cssgradients button.glossy, что казалось мне, как ошибки в документации.)

Посмотрите, что .cssgradients класс? Когда вы запускаете Modernizr, он определяет, является ли это соответствующим синтаксисом, и если это добавляет класс в ваш элемент html, который включает селектор потомков .cssgradients button.glossy, чтобы применить правило.

Это, к сожалению, зависит от браузера с включенным Javascript.

+0

Спасибо T.J., Модернизатор был билет. Он не делал точно то, что мне нужно было выполнить, но это подтолкнуло меня в правильном направлении, чтобы получить то, что мне было нужно. –

+0

@Scott Christopherson: Хорошо, рад, что помог.Я думаю, вы, должно быть, смотрели на Modernizr, в то время как я просматривал источник, чтобы узнать, как они прошли тест, поэтому мое обновление может быть слишком запоздалым, но я добавил обновление, показывающее функциональный тест для синтаксиса WebKit. Та же концепция может быть применена к '-moz' и т. Д. –

+0

Ха-ха, да, вскоре после того, как вы разместили Модернизатор, я пошел и прополз через его источник, чтобы найти раздел градиента. –

1

Если кому-то интересно, вот что я придумал. Я уверен, что он может использовать много улучшений, но он работает до сих пор.

var syntax; 
var syntaxCheck = document.createElement('syntax'); 
var syntaxFound = false; 
while(!syntaxFound) { 

    syntaxCheck.style.backgroundImage = '-webkit-gradient(linear,left top,right bottom,from(#9f9),to(white))'; 
    if(syntaxCheck.style.backgroundImage.indexOf('webkit') !== -1) { 
      syntax = 'webkit'; 
      syntaxFound = true; 
      break; 
    } 

    syntaxCheck.style.backgroundImage = '-moz-linear-gradient(left top,#9f9, white)'; 
    if(syntaxCheck.style.backgroundImage.indexOf('moz') !== -1) { 
      syntax = 'moz'; 
      syntaxFound = true; 
      break; 
    } 
} 

if(syntax == 'webkit') // use -webkit syntax 
else if(syntax == 'moz') // use -moz syntax 
+0

LOL! Великие умы, я думаю, мы оба делали это одновременно. :-) –

+0

Hahaha nice !! Спасибо за помощь T.J. –

7

Вам вообще не нужно вообще обнаруживать. Просто установите element.style.backgroundImage дважды подряд, а те, которые не анализируются, будут проигнорированы.

+0

А, это правда. Я думал, что это может вызвать проблемы, но я просто попробовал, и он все еще работает. Ну, моя текущая ситуация больше не нуждается в обнаружении правильного синтаксиса, но если кто-нибудь когда-нибудь сделает это в будущем, они могут посмотреть здесь. –

+0

Спасибо, не понял этого. –

Смежные вопросы