RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 710801
Accepted
Yuri
Yuri
Asked:2020-08-26 17:55:55 +0000 UTC2020-08-26 17:55:55 +0000 UTC 2020-08-26 17:55:55 +0000 UTC

如何了解浏览器对 CSS 属性的支持?

  • 772

我想制作一个在大多数浏览器中看起来都正确的网站。但是在创作的路上,遇到了跨浏览器兼容的问题。也就是说,一个浏览器支持这个 CSS,而另一个不支持。

我如何知道给定的浏览器是否支持指定的 CSS 属性?是否有可能在一个 CSS 中知道这一点?

javascript
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Yuri
    2020-08-26T17:55:55Z2020-08-26T17:55:55Z

    使用单个 CSS

    您可以使用名为@supports的 CSS 指令了解给定浏览器是否支持指定的 CSS 属性。

    该指令的工作方式与@media 相同。

    /* Узнаём, поддерживает ли браузер display: flex; */
    @supports (display: flex) {
       /* Стили */
    }
    

    如果浏览器不支持指定的 CSS 属性,也可以设置属性

    /* Узнаём, поддерживает ли браузер display: flex; */
    @supports not (display: flex) {
       /* Стили */
    }
    

    您还可以使用运算符一次检查多个属性and

    /* Узнаём, поддерживает ли браузер display: flex; и flex-wrap: wrap; */
    @supports (display: flex) and (flex-wrap: wrap) {
       /* Стили */
    }
    

    如果我们需要至少一个工作属性,我们可以使用操作符or

    /* Узнаём, поддерживает ли браузер display: flex; */
    @supports (display: flex) or (display: -webkit-flex) {
       /* Стили */
    }
    

    但请记住,该指令是新指令,在 IE 中根本不起作用。

    此外,为确保不存在跨浏览器兼容性,您可以使用供应商前缀。


    用JS

    这个任务,用JS,我知道有两种解决方法:

    1. 仅在 JS 上使用 CSS @Supports 的类似物 - 功能CSS.supports()

      // Узнаём, поддерживает ли браузер display: flex;
      CSS.supports("display", "flex"); // true/false
      

      就像在 CSS 中一样,您可以指定多个属性。

      // Узнаём, поддерживает ли браузер display: flex; и flex-wrap: wrap;
      CSS.supports("( display: flex ) and ( flex-wrap: wrap )"); // true/false
      

      但就像在 CSS 中一样,这种方法是新的,在 IE 中根本不起作用。

    2. 通过 JS 应用样式进行验证。

      这种方法的本质是浏览器不能将元素的属性设置为它不支持的值。因此,如果在通过 JavaScript 将新值应用于属性后,它没有改变,则浏览器不支持该值。

      因此,我们有以下功能:

      var SupportsCSS = function (property, value) {
         try {
            // Создаём новый элемент
            var element = document.createElement('span');
            // Проверяем, есть ли такое свойство в браузере
            if (element.style[property] !== undefined) 
               element.style[property] = value; // Если есть, то присваиваем
            else 
               return false; // Если нет, то false
      
            // Если браузер поддерживает данное значение для указанного свойства, то значения будут равны
            return element.style[property] === value;
         } catch (e) {
            // В случае со старым IE, при присваивании значения, которое не поддерживается, вылетает ошибка
            return false;
         }
      };
      

      这就是它的工作原理:

      var SupportsCSS = function (property, value) {
          try {
              var element = document.createElement('span');
              if (element.style[property] !== undefined) 
                  element.style[property] = value;
              else 
                  return false;
      
              return element.style[property] === value;
          } catch (e) {
              return false;
          }
      };
      
      // Проверяем
      console.log( SupportsCSS('display', 'flex') );
      console.log( SupportsCSS('display', '-webkit-box') );
      console.log( SupportsCSS('display', 'Lol :)') );
      console.log( SupportsCSS('flex-wrap', 'wrap') );
      console.log( SupportsCSS('-webkit-flex-wrap', 'nowrap') );
         

      注意:如果您通过现代浏览器模拟器检查旧浏览器中的属性支持,那么此方法将在不支持的值上显示true 。

      这种方法的优点是它适用于所有浏览器。

      在 Safari 5.17 中运行脚本的示例:

      在此处输入图像描述

    特殊服务

    为了不打扰,可以在特殊网站上查看支持。例如,最受欢迎的网站之一是http://caniuse.com/


    你可以在这里阅读更多:https ://habrahabr.ru/post/336466/

    • 18
  2. MedvedevDev
    2020-08-26T19:39:24Z2020-08-26T19:39:24Z

    现代化

    Modernizr是一个 JavaScript 库,它了解用户的浏览器可以在 HTML5 和 CSS3 中执行的操作。

    简而言之,该库将类添加到您的类<html>中,您可以根据这些类选择元素将使用的属性:

    .block { display: flex; }
    html:not(.flexbox) .block { display: block; }
    

    js的方法:

    if(Modernizr.touchevents) {
      // do something ...
    }
    

    还测试某些浏览器功能,例如,选择“是否启用 polyfills”:

    Modernizr.load({
      test: Modernizr.geolocation,
      yep : 'geo.js',
      nope: 'geo-polyfill.js'
    });
    

    更多细节可以在关于 Habré - Modernizr:实际应用的文章中找到

    • 6

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5