动态检测浏览器是否支持 position:sticky

cla*_*219 3 javascript jquery css-position sticky

有没有办法使用 Javascript 或 jQuery 来检测浏览器是否支持position:sticky

我知道大多数现代浏览器都支持它,但一些旧浏览器和一些移动浏览器不支持。

我对 polyfill 不感兴趣。我只想在有效时才采取某些行动position:sticky,否则就保持原样。

aaa*_*dan 8

检查 CSS 功能是否可用的一种强大而强大的方法是使用CSS.supportsJavaScript 函数:

if (CSS && CSS.supports && CSS.supports("position", "sticky")) {
  // awesome: position:sticky is supported on this browser!
} else {
  // fallback: I cannot rely on position:sticky!
}
Run Code Online (Sandbox Code Playgroud)

我希望这能回答您的问题,但我认为值得一提的是,如果您想使用,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 */
}
Run Code Online (Sandbox Code Playgroud)

即便如此,您通常甚至不需要这么花哨。例如,假设您有一个导航栏,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 ... */
}
Run Code Online (Sandbox Code Playgroud)

  • 如果 CSS 和 CSS.supports 不受支持,但position:sticky 受支持怎么办? (2认同)

And*_*eas 2

来自现代化:

/*!
{
  "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;
  });
});
Run Code Online (Sandbox Code Playgroud)

来源:https://github.com/Modernizr/Modernizr/blob/master/feature-detects/css/positionsticky.js

和:

prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');
Run Code Online (Sandbox Code Playgroud)

来源:https://github.com/Modernizr/Modernizr/blob/master/src/prefixes.js

工作示例(没有 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());
Run Code Online (Sandbox Code Playgroud)