是否有更好的方法,然后使用jQuery.browser或equivalents确定css 3前缀(-moz,-webkit等),如it is disencouraged?由于css是动态的(用户可以在运行时用它做任何事情),所以不能考虑CSS黑客和风格标记黑客。动态CSS3前缀用户代理检测
回答
我没有看到使用navigator.userAgent
来确定您是否需要迎合Webkit/Gecko CSS3前缀的问题。或者更好的是,只需坚持使用CSS2,直到CSS3成为W3C推荐标准。
不鼓励使用navigator
对象的原因是因为它用于(java)脚本编写不同浏览器时的对象检测,您的情况可以使用用户代理检测,因为您的专门定位某些怪癖与不同的渲染引擎。
编辑: 拿起从那里CY不放过,你可以使用JavaScript对象检测来检测前缀是否被使用,我做了一些简单的代码可以这样做:
window.onload = function()
{
CSS3 = {
supported: false,
prefix: ""
};
if (typeof(document.body.style.borderRadius) != 'undefined') {
CSS3.supported = true;
CSS3.prefix = "";
} else if (typeof(document.body.style.MozBorderRadius) != 'undefined') {
CSS3.supported = true;
CSS3.prefix = "-moz-";
} else if (typeof(document.body.style.webkitBorderRadius) != 'undefined') {
CSS3.supported = true;
CSS3.prefix = "-webkit-";
}
if (CSS3.supported)
if (CSS3.prefix == "")
alert("CSS3 is supported in this browser with no prefix required.");
else
alert("CSS3 is supported in this browser with the prefix: '"+CSS3.prefix+"'.");
else
alert("CSS3 is NOT supported in this browser.");
};
记住观看奇怪的怪癖,例如-moz-opacity
,它只在旧版本的Firefox中受到支持,但现在已弃用opacity
,而它仍将-moz-
前缀用于其他新的CSS3样式。
投机性:是的。您可以尝试添加供应商前缀css规则(这就是他们所称的),然后测试以查看该规则是否存在。这些特定于供应商的规则将不会被添加到浏览器中的DOM中,在这些浏览器中它们不受支持在某些情况下为。
例如,如果您尝试在webkit中添加-moz规则,它将不会添加到DOM,因此jQuery将无法检测到它。
所以,
$('#blah').css('-moz-border-radius','1px');
$('#blah').css('-moz-border-radius') //null in Chrome
相反,
$('#blah').css('-webkit-border-radius','1px');
$('#blah').css('-webkit-border-radius'); //returns "" in Chrome
这种方法在WebKit浏览器的工作原理;我正在测试它是否适用于其他人。待定。
编辑:可惜的是,这不适用于Firefox或Opera,它只是返回“”,无论兼容性。想办法做到这一点跨浏览器...
最终编辑:Andrew Dunn's answer这样做的工作方式(至少在FF和Webkit,这是比我的方法更好)。
这是在另一个库中添加,但会Modernizr为你工作?它将CSS类添加到<html>
标记中,可以告诉您浏览器支持哪些内容。
它确实让代码混淆了一些,但在适当的情况下肯定会有所帮助。
不知道这是否可以帮助前缀的东西,但。猜猜我不应该做出这个答案。 =/ – 2010-09-20 04:04:49
它确实没有,是吗?如果modernizer具有Modernizer.prefix的话,那将会很棒。我在一年前遇到过它,但它确实在增长。它很好地补充了前缀,并提供了动态属性的更清晰的实现(如果不支持它,甚至不尝试设置)。 – 2010-09-20 04:27:45
Array.prototype.slice.call(
document.defaultView.getComputedStyle(document.body, "")
)
.join("")
.match(/(?:-(moz|webkit|ms|khtml)-)/);
将返回一个包含两个元素的数组。一个破折号,一个没有短划线,都是小写的,为了您的方便。
Array.prototype.slice.call(
document.defaultView.getComputedStyle(document.body, "")
);
没有浏览器检查将返回浏览器可以理解的几乎所有CSS属性的数组。由于它的计算风格,它不会显示速记版本,但否则我认为它会得到所有这些。这是一个快速跳转跳转和跳转到自动检测任何你需要的,因为只有供应商前缀的东西开始与破折号。
IE9,Chrome,Safari,FF。 Opera不会让你为CSSStyleDeclaration分片,因为你仍然可以使用相同的getComputedStyle代码并循环访问属性或测试特定的属性。歌剧院也想成为奇怪的人,而不是报道供应商前缀dasherized。谢谢歌剧。
Object.keys(CSSStyleDeclaration.prototype)
适用于IE9和FF并报告供应商属性名称的TitleCased(JavaScript)版本。在WebKit中不起作用,因为原型只报告方法。
这里有一个有趣和非常危险的功能,我只是沿着这些线路中写道:
(function(vp,np){
Object.keys(this).filter(function(p){return vp=vp||p.match(/^(Moz|ms)/)}).forEach(function(op){
this.__defineGetter__(np=op.replace(vp[0], ""), function() { return this[op] });
this.__defineSetter__(np, function(val) { this[op] = val.toString() });
}, this);
}).call(CSSStyleDeclaration.prototype);
我没有测试任何konquerer中。
我使用三元运算符只有一行。如果它不是webkit或gecko,我只会使用标准属性。如果它没有支持,谁真的在乎呢?
var prefix = ('webkitAnimation' in document.body.style) ? '-webkit-' : ('MozAnimation' in document.body.style? '-moz-' : '');
基本上我发现动画是永不改变的属性之一。只要浏览器开始支持CSS3属性的草稿/候选推荐标准,它就会在JS端放弃前缀。因此,在复制粘贴之前,您需要小心并记住这一点。
- 1. jQuery移动用户代理检测
- 2. iPad用户代理检测
- 3. 检测用户代理Firefox
- 4. DART用户代理检测
- 5. Django-Rest-Framework动态url(动态前缀)
- 6. 如何检测kindle用户代理
- 7. 检测用户是否在代理后
- 8. iPod touch用户代理检测
- 9. 葡萄:动态前缀?
- 10. 如何使用rails自动检测用户代理
- 11. 禁用WebClient自动代理检测
- 12. 基于Symfony2中登录用户的Doctrine2动态表前缀
- 13. 从用户代理字符串中检测移动设备
- 14. 检测管理员前缀是否来自模型
- 15. PSTN上的Asterisk动态用户代理
- 16. 使用功能检测代替用户代理测试测试IE6
- 17. 检测CSS3与jQuery
- 18. 请提供GraphicsMagick工具安装的前缀[自动检测]
- 19. .NET代理检测
- 20. 在代码中检测动态类型?
- 21. 具有动态前缀的Django URL
- 22. 如何实现动态@ConfigurationProperties前缀
- 23. 如何自动检测代理?
- 24. 检测用户活动
- 25. 检测用户动作
- 26. 动态代理和检查异常
- 27. 执行浏览器检测功能检测(非用户代理嗅探)
- 28. 动态应用CSS3属性
- 29. 如何使用PHP检测“Google Chrome”作为用户代理?
- 30. 检测用户是否先前投票?
这是一个更好的解决方案,只是不要忘记检查'$('#blah').css('border-radius');'。 – 2010-09-20 03:48:21
这非常有趣。需要5次检查('-webkit','-moz','-o','-ms'和空白前缀),可以在窗口设置开始处的隐藏元素上完成,稍后将移除。非常好。 – 2010-09-20 03:53:10
是的,我现在不会恭喜我。看来结果还不可靠;试图改进它。 – Yahel 2010-09-20 03:55:15