动态检测浏览器是否支持position:sticky
Dynamically detect if position:sticky is supported by the browser
有没有办法使用Javascript或jQuery检测浏览器是否支持position:sticky
?
我知道大多数现代浏览器都支持它,但一些较旧的浏览器和一些移动浏览器不支持。
我对 polyfill 不感兴趣。我只想在 position:sticky
有效时采取某些行动,否则就保持原样。
来自 modernizr:
/*!
{
"name": "CSS position: sticky",
"property": "csspositionsticky",
"tags": ["css"],
"builderAliases": ["css_positionsticky"],
"notes": [{
"name": "Chrome bug report",
"href":"https://bugs.chromium.org/p/chromium/issues/detail?id=322972"
}],
"warnings": ["using position:sticky on anything but top aligned elements is buggy in Chrome < 37 and iOS <=7+"]
}
!*/
define(['Modernizr', 'createElement', 'prefixes'], function(Modernizr, createElement, prefixes) {
// Sticky positioning - constrains an element to be positioned inside the
// intersection of its container box, and the viewport.
Modernizr.addTest('csspositionsticky', function() {
var prop = 'position:';
var value = 'sticky';
var el = createElement('a');
var mStyle = el.style;
mStyle.cssText = prop + prefixes.join(value + ';' + prop).slice(0, -prop.length);
return mStyle.position.indexOf(value) !== -1;
});
});
来源:https://github.com/Modernizr/Modernizr/blob/master/feature-detects/css/positionsticky.js
与:
prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');
来源:https://github.com/Modernizr/Modernizr/blob/master/src/prefixes.js
工作示例(w/o Modernizr 依赖项):
function browserSupportsPositionSticky() {
var prop = 'position:';
var value = 'sticky';
var prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');
var el = document.createElement('a');
var mStyle = el.style;
mStyle.cssText = prop + prefixes.join(value + ';' + prop).slice(0, - prop.length);
return mStyle.position.indexOf(value) !== -1;
};
console.log(browserSupportsPositionSticky());
检查 CSS 功能是否可用的一种强大而强大的方法是使用 CSS.supports
JavaScript 函数:
if (CSS && CSS.supports && CSS.supports("position", "sticky")) {
// awesome: position:sticky is supported on this browser!
} else {
// fallback: I cannot rely on position:sticky!
}
我希望这能回答你的问题,但我认为值得一提的是,如果你想使用 CSS.supports()
,你至少应该考虑仅使用 CSS 来应对缺乏功能的问题.虽然 JavaScript 是对页面进行动态更改的好方法,但您通常不需要它来让您的页面响应缺少的功能。这尤其适用于 CSS 功能,例如粘性。
例如
/*
...
Basic styles for old browsers that don't support sticky go here.
...
*/
@supports (position:sticky) {
/* Overrides to the above styles for modern "sticky" browsers go here */
}
即便如此,您通常甚至不需要这么花哨。例如,假设您有一个导航栏,如果可能,您希望它是 position:sticky
,否则只是 position:absolute
。即使有些浏览器不理解sticky
,你也可以说:
.my-nav-bar {
/* The fallback goes first */
position: absolute;
/* This 'enhancement' is ignored if not understood, */
/* but overrides the previous value if the browser supports it. */
position: sticky;
top: 50px;
/* ... etc ... */
}
有没有办法使用Javascript或jQuery检测浏览器是否支持position:sticky
?
我知道大多数现代浏览器都支持它,但一些较旧的浏览器和一些移动浏览器不支持。
我对 polyfill 不感兴趣。我只想在 position:sticky
有效时采取某些行动,否则就保持原样。
来自 modernizr:
/*!
{
"name": "CSS position: sticky",
"property": "csspositionsticky",
"tags": ["css"],
"builderAliases": ["css_positionsticky"],
"notes": [{
"name": "Chrome bug report",
"href":"https://bugs.chromium.org/p/chromium/issues/detail?id=322972"
}],
"warnings": ["using position:sticky on anything but top aligned elements is buggy in Chrome < 37 and iOS <=7+"]
}
!*/
define(['Modernizr', 'createElement', 'prefixes'], function(Modernizr, createElement, prefixes) {
// Sticky positioning - constrains an element to be positioned inside the
// intersection of its container box, and the viewport.
Modernizr.addTest('csspositionsticky', function() {
var prop = 'position:';
var value = 'sticky';
var el = createElement('a');
var mStyle = el.style;
mStyle.cssText = prop + prefixes.join(value + ';' + prop).slice(0, -prop.length);
return mStyle.position.indexOf(value) !== -1;
});
});
来源:https://github.com/Modernizr/Modernizr/blob/master/feature-detects/css/positionsticky.js
与:
prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');
来源:https://github.com/Modernizr/Modernizr/blob/master/src/prefixes.js
工作示例(w/o Modernizr 依赖项):
function browserSupportsPositionSticky() {
var prop = 'position:';
var value = 'sticky';
var prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');
var el = document.createElement('a');
var mStyle = el.style;
mStyle.cssText = prop + prefixes.join(value + ';' + prop).slice(0, - prop.length);
return mStyle.position.indexOf(value) !== -1;
};
console.log(browserSupportsPositionSticky());
检查 CSS 功能是否可用的一种强大而强大的方法是使用 CSS.supports
JavaScript 函数:
if (CSS && CSS.supports && CSS.supports("position", "sticky")) {
// awesome: position:sticky is supported on this browser!
} else {
// fallback: I cannot rely on position:sticky!
}
我希望这能回答你的问题,但我认为值得一提的是,如果你想使用 CSS.supports()
,你至少应该考虑仅使用 CSS 来应对缺乏功能的问题.虽然 JavaScript 是对页面进行动态更改的好方法,但您通常不需要它来让您的页面响应缺少的功能。这尤其适用于 CSS 功能,例如粘性。
例如
/*
...
Basic styles for old browsers that don't support sticky go here.
...
*/
@supports (position:sticky) {
/* Overrides to the above styles for modern "sticky" browsers go here */
}
即便如此,您通常甚至不需要这么花哨。例如,假设您有一个导航栏,如果可能,您希望它是 position:sticky
,否则只是 position:absolute
。即使有些浏览器不理解sticky
,你也可以说:
.my-nav-bar {
/* The fallback goes first */
position: absolute;
/* This 'enhancement' is ignored if not understood, */
/* but overrides the previous value if the browser supports it. */
position: sticky;
top: 50px;
/* ... etc ... */
}