CSS 平台特定的 hack

2024-01-01

我想知道是否有一种方法可以使用 CSS 来定位平台,即不同的操作系统 - Windows 7、Windows 8、Linux 等...

我有一个样式表,带有 ul 列表和边框底部设置,当鼠标悬停在菜单元素上时会改变颜色。问题是,在 Windows 7 和 Windows8/Ubuntu 之间,在所有浏览器(Chrome、FF IE 等...)上,li 项目的显示效果并不相同。我尝试使用不同的 css 属性,例如行高、填充、边距等,但无论我做什么,win7和win8/ubuntu之间的项目布局都不一样。我在各种 PC 上进行了测试,并在相同版本的浏览器之间进行了测试(最新的 Chrome、最新的 FF、IE9...)

那么我可以使用 css hack 来定位 Windows 8 吗?或者只是 Ubuntu/Linux?


有一种方法可以根据您所使用的浏览器的性质来做到这一点,一点演绎推理和一些技巧......并不是所有的东西都能做到这一点,但有一些您可以仅使用 CSS 用于操作系统定位。当然,脚本提供了更多选择。这反映了我为确保准确性而进行的大约 6 个月的研究和工作,如下文所述。

目前我不知道有什么方法可以用 Chrome 做到这一点,而且我还没有研究过 Opera,特别是现在它使用与 Chrome 大部分相同的方法。 Chrome 直到版本 3 才发布适用于 Mac 的版本。同样对于 Mac,Google 已发布声明,Chrome 49 之后将不再支持 OS X 10.6-10.8,因此 Chrome 50 及更高版本将指示 Mac OS X 10.9 (Mavericks) 或较新。

不过,Firefox、Internet Explorer 和 Safari 有更好的选择。

Firefox 4 及更新版本可以检测到正在使用 Windows 主题,因此即使是旧版本的 Firefox 也至少会检测您是否正在使用 Windows。我不久前创建了这个,今天再次测试了这个:

@media screen and (-moz-windows-theme) {
    .windows {
        color:red;
    }
}

出于同样的原因,该方法适用于除 Windows 之外的任何操作系统,同样适用于 Firefox 4 及更高版本:

@media not screen and (-moz-windows-theme) {
    _:-moz-ui-valid, .nonwindows {
        color:red;
    }
}

-moz-os-version 已添加到 Firefox 25 媒体查询中,但根据 mozilla 文档,只有几个选项https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Media_queries https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Media_queries

操作系统:windows-xp | Windows Vista | Windows-win7 | windows-win8 | windows-win10

因此,该设置仅适用于版本 >= 25 的现代 Firefox 浏览器。在发布此更新时,Firefox 的版本为 35。

@media screen and (-moz-os-version:windows-xp) {
    .windows,.winxp {
        color:red;
    }
}

@media screen and (-moz-os-version:windows-vista) {
    .windows,.vista {
        color:red;
    }
}

@media screen and (-moz-os-version:windows-win7) {
    .windows,.win7 {
        color:red;
    }
}

@media screen and (-moz-os-version:windows-win8) {
    .windows,.win8 {
        color:red;
    }
}

@media screen and (-moz-os-version:windows-win10) {
    .windows,.win10 {
        color:red;
    }
}

Microsoft 的 Edge 浏览器(以前称为 Spartan)目前仅在 Windows 10 中可用。要检测它:

/* Microsoft Edge Browser */

@supports (-ms-ime-align:auto) {
    .windows,.win10 {
        color:red;
    }
}

注意:之前的 -ms-accelerator:true 方法在新版本中已更改,因此可以用于针对特定版本的 Edge,但不是所有版本。 -ms-ime-align:auto 在 2017 年仍然适用于所有这些。

还有一些方法可以检测 Macintosh 计算机。

Firefox >= 24 为 OS X 10.7 Lion 及更高版本引入了新的滚动条覆盖方法,可通过媒体查询检测到:

@media screen and (-moz-overlay-scrollbars) {
    .mac,.mac10_7up {
        color:red; 
    } 
}

Firefox >= 25 也有一种方法来检测 Mac OS X,因为他们在版本 25 中添加了对 OS X 字体平滑的支持:

@supports (-moz-osx-font-smoothing:auto) {
    .mac,.mac10_6up {
        color:red; 
    } 
}

由于 @media 查询和 @supports 过滤器可以相互嵌套,因此现在可以进行以下操作 - 为了将 Firefox 24 及更高版本定位到 JUST OS X 10.6 Snow Leopard:

@supports (-moz-osx-font-smoothing:auto) {
  @media not all and (-moz-overlay-scrollbars) {
    .mac,.mac10_6 {
        color:red;
    } 
  }
}

Firefox 17 及更高版本仅支持 Mac OS X 10.6+(Snow Leopard 及更高版本),因此如果您有上述任何 OS X CSS 规则的结果,则您使用的不是 OS X 10.5 或更早版本。 (https://en.wikipedia.org/wiki/History_of_Firefox#Version_17_.28ESR.29 https://en.wikipedia.org/wiki/History_of_Firefox#Version_17_.28ESR.29)

相反,在 Firefox 25+ 中,可以再次否定 OS X(10.6 及更高版本)——由于 10.5 及更早版本不支持此版本的 Firefox,这意味着这根本不是 Mac:

@supports (-moz-appearance:none) and (background-attachment:local)
  and (not (-moz-osx-font-smoothing:auto)) {
    .nonmac {
        color:red; 
    } 
}

从 Firefox 49 开始,Firefox 不再支持 10.9 版本之前的 Mac OS X,因此,如果您使用的是 48 或更低版本,则必须是 OS X 10.8 或更早版本,或者如果您使用的是 17-48 之间的版本,则必须是 OS X 10.6-10.8出于同样的原因。

当我写这篇文章时,iOS(iPad 和 iPhone)还没有 Firefox 版本,因此具有 OS X 字体平滑功能的 Firefox 目前仅适用于 Mac 电脑,不适用于 Apple 移动设备。与 iOS 版 Chrome 一样,iOS 版 Firefox 使用 Safari 引擎,因此在 iPad 和 iPhone 上使用 Safari hacks。因此,它们都可以作为 Safari 的目标,但实际上并不是他们所说的那样。

通过同时否定两者,我们有一种方法来瞄准剩下的东西:Android/Linux,同样是 Firefox 25 及更新版本:

@supports (-moz-appearance:none) and (background-attachment:local)
  and (not (-moz-osx-font-smoothing:auto)) {
    @media not screen and (-moz-os-version) { 
        .lindroid {
           color:red; 
        }
    } 
}

如果您使用的是 Internet Explorer 版本 6 或更高版本(Windows XP 和更高版本),那么无论如何您显然都在使用 Windows。这也可以通过不止一种方式来确定。

条件注释在 Internet Explorer 9 之前一直存在于 Windows 中,因此可以使用它们来收集更多信息:

这只能检测到你有windows,但不一定是版本,因为Internet Explorer 6-9只存在于windows平台上。目前,Internet Explorer 11 是当前版本,因此不会检测 10 和 11,而是检测 9 及之前的版本:

<!--[if (gte IE 6)&(lte IE 9)]><style type="text/css">

    .windows {
        color:red;
    }

</style><![endif]-->

Internet Explorer 6 仅存在于 Windows XP 中,或者现在已不再使用的旧版 Windows 版本中,因此这适用于该版本:

<!--[if (IE 6)]><style type="text/css">

    .windows,.winxp {
        color:red;
    }

</style><![endif]-->

Internet Explorer 7 存在于 Windows XP Vista 中,但是当您单击 Internet Explorer 8 或更高版本中的兼容模式选项时,通常也会模拟 Internet Explorer 7。

如果您使用的是 Internet Explorer 10 或更高版本(因此您使用的是 Windows 7 或 8),则此方法适用。

@media screen and (-ms-high-contrast:active), (-ms-high-contrast:none) { 
    .windows {
        color:red;
    }
}

我亲自制作的作品之一可以检测 Internet Explorer 11 或更高版本,它适用于 Windows 7 和更高版本(最高可达 8.1)。

_:-ms-fullscreen, :root .windows { 
    color:red; 
}

如果您不想使用 Internet Explorer 条件注释而是希望使用媒体查询,那么这些确实存在:

要检测 Internet Explorer 6-7(因此 Windows XP 及更早版本直至 Windows 7),此方法有效:

@media screen\9 
{
    .windows {
        color:red;
    }
}

这是我为 Internet Explorer 9 创建的,因为不存在。 (所以赢得 7 或赢得 Vista)

@media screen and (min-width:0\0) and (min-resolution:.001dpcm) 
{
    .windows {
        color:red;
    }
}

这会检测 Internet Explorer 8(因此是 windows XP-windows 7)

@media \0screen
{
    .windows {
        color:red;
    }
}

去年,我从其他各个部分制作了这个媒体查询,它可以处理 Safari 6.1 及更高版本。在本文发布时,Safari 是版本 7。 Mac 和移动设备(例如基本 Android 浏览器)将以这种方式进行检测:

@media screen and (-webkit-min-device-pixel-ratio:0) and (min-color-index:0)
{
    .mac_or_mobile {(;
        color:red;
    );} 
}

这是检测大多数较新 Mac 的更好方法,不包括 iPad(或 Android)等移动设备 - 同样,它适用于 Safari 6.1 及更高版本,因此它是 Mac...:

@media screen and (-webkit-max-device-pixel-ratio:1) and (min-color-index:0)
{
    .mac_osx {(;
        color:red;
    );} 
}

如果您想要手机,这适用于最近的高清手机:

@media screen and (-webkit-min-device-pixel-ratio:1.1) and (min-color-index:0)
{
    .retina {(;
        color:red;
    );} 
}

我在这里有更多关于手机和平板电脑的信息: https://jeffclayton.wordpress.com/2014/07/22/css-for-hi-def-mobile-retina-devices/https://jeffclayton.wordpress.com/2014/07/22/css-for-hi-def-mobile-retina-devices/ https://jeffclayton.wordpress.com/2014/07/22/css-for-hi-def-mobile-retina-devices/和这里: https://jeffclayton.wordpress.com/2014/07/28/css-hack-anything-but-ios/https://jeffclayton.wordpress.com/2014/07/28/css-hack-anything-but-ios/ https://jeffclayton.wordpress.com/2014/07/28/css-hack-anything-but-ios/

Mac 确实有一段时间有 Internet Explorer,但在 5.5 版之后就没有再制作新版本。

Windows 也有一段时间也有 Safari,但在第 5 版之后就没有再制作更新的版本。大多数 Windows 用户从不使用 Safari,因此当检测到 Safari 时,您通常可以排除 Windows。

如果将上述所有样式包含到文档中,下面的 div 将反映上面样式的结果:

Per Firefox and Internet Explorer/Edge:

<div class="windows"> If this is Windows this is red </div>

<div class="winxp"> If this is Windows XP or older this is red </div>

<div class="win10"> If this is Windows 10 this is red </div>

Per Firefox:

<div class="vista"> If this is Windows Vista this is red </div>
<div class="win7"> If this is Windows 7 this is red </div>
<div class="win8"> If this is Windows 8 this is red </div>

<div class="nonwindows"> If this is NOT Windows this is red </div>

<div class="nonmac"> If this is NOT Mac OS X this is red </div>

<div class="mac"> If this is Mac OS X this is red </div>

<div class="mac10_7up"> If this is Mac OS X 10.7 or newer this is red </div>
<div class="mac10_6up"> If this is Mac OS X 10.6 or newer this is red </div>
<div class="mac10_6"> If this is Mac OS X 10.6 only this is red </div>

<div class="lindroid"> If this is Linux or Android this is red </div>

Per Safari:

<div class="mac_osx"> If this is a Mac using Safari
(desktop or laptop computer) this is red (includes old mobile devices but not before iOS 6) </div>

<div class="mac_or_mobile"> If this is a Mac or a mobile device using Safari
(Android or iPad/iPhone) this is red </div>

<div class="retina"> If this is a hi-def mobile device using Safari
(Android or iPad/iPhone) this is red </div>

关于检测的附加说明...

基于 Internet Explorer/Edge 的 Windows 版本(为了便于参考):

As stated above if you detect Internet Explorer 6, you are using XP (or older Win)
If you detect Internet Explorer 7-8, you are using Windows XP, Vista, or Windows 7
If you detect Internet Explorer 9 you are using Windows Vista or Windows 7
If you detect Internet Explorer 10 you are using Windows 7 or Windows 8.0
If you detect Internet Explorer 11 you are using Windows 7 or Windows 8.0/8.1 or Windows 10
If you detect Microsoft Edge you are using Windows 10

Windows 10 是本文发布时的当前 Windows 版本。

出于历史兴趣,如果您确实愿意,您实际上可以使用我发现的旧技巧来确定 Mac 上的 Internet Explorer 5 或更低版本:

/*\*//*/ .mac_internet_explorer { color:red; } /**/

Mac 版本的 Internet Explorer 仅适用于旧的 PowerPC Mac,而不适用于 Intel 型号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CSS 平台特定的 hack 的相关文章

  • jQuery / CSS3 动画阴影效果

    所以这个问题可能会被否决 但我认为有人可能会提供帮助 我正在寻找的效果是蓝色块像气球一样上下盘旋 当块上 下移动时 阴影在其下方不断增大和缩小 关于如何编程的任何想法 或者有人知道可以完成的教程 插件吗 你可以使用 jQuery 来完成 或
  • 带有图像垂直对齐的内联框:与父框居中

    请运行演示 margin 0 padding 0 body font family Microsoft Yahei font size 16px background color lightblue height 200px width 2
  • 禁用 Bootstrap 中的链接

    第一个例子没有成功 我需要始终有一个列表来禁用链接 或者我的第一个演示有什么问题 a class disabled href Disabled link a ul class nav nav pills li class disabled
  • CSS:如何在“div”内垂直对齐“标签”和“输入”?

    考虑以下代码 http jsfiddle net s2qBw 3 HTML div div
  • 使用日期类型将输入字段中的日期居中

    我想将日期居中input not input inside div 如果我进行居中 它将把日期居中于input因为有一个右侧面板用于根据日历选择日期 该面板根据输入宽度调整大小 用于演示的小代码片段 center text align ce
  • 在这个页面中,悬停不起作用,我不知道为什么,而且页脚也没有占用 100% 宽度,即使我已经给了它

    我的编码是否不正确 或者悬停和页脚有什么问题 我需要知道 php 邮件程序是正确的还是我有错误 我无法找到错误 因为邮件功能在本地服务器上不起作用
  • 允许指针(单击)事件穿过元素,同时保持滚动功能

    我的目标是拥有一个允许 下面要点击 交互的元素 滚动 众所周知 1 的解是pointer events none 这正如中所描述的单击 DIV 到底层元素 https stackoverflow com questions 3680429
  • 滚动时静态标题

    我编写了一个主页 现在我正在尝试构建一个标题 该标题是静态的 就像在滚动内容时不滚动一样 当内容位于其下方时 它应该保持在顶部 我找到了这个解决方案here https stackoverflow com questions 9677894
  • NodeJS 无法加载 css 文件

    所以我正在尝试制作一个 NodeJS 服务器 并且我尝试保留尽可能少的附加组件 但是 我遇到了一个问题 我似乎无法加载任何内容CSS我调用的文件HTML文件 该调用似乎确实由服务器处理 但它不会显示在浏览器中 My 网络服务器 js fil
  • Django 1.6 的静态文件

    我花了一整天但没有任何作用 我在这里看到了至少 20 篇关于同一主题的帖子 它们各不相同 有不同的建议 但没有一个对我有用 使用 Python 2 7 运行 Django 1 6 我正在尝试从 django 教程加载民意调查应用程序的 cs
  • 禁用任何类型的浏览器窗口滚动?

    有没有办法禁用滚动 不仅仅是滚动条 还有浏览器窗口的全部功能 根据您对 Keit 的回答 您不想在打开灯箱时滚动处于活动状态 如果是这种情况 您可以使用以下 css 在打开灯箱的同时向正文添加一个类 这个解决方案的好处是它保留了滚动 空间
  • 在 Linux 服务器上创建和编辑 MS-Word 文档?

    希望开发处理文档的服务器端应用程序 源文档大多是MS Word 2003 2007 即MS版本的Docx 希望服务器应用程序能够在linux或windows上运行 想知道在linux下读写MS Word文件最好的工具或库是什么 兼容性是最重
  • 如何仅在第一次访问时弹出模态窗口

    我有一个模式窗口 当您访问某个页面时会弹出 访客必须选择我同意或我不同意 我需要一个漂亮的小 jquery 脚本 它会记住谁之前访问过该页面并同意 这样他们每次访问该页面时就不会弹出模式 有人可以推荐一个好的脚本来使用吗 这是代码 div
  • 使用百分比 (%) 时如何计算填充?

    为什么本例中的内边距不等于 300 像素 Test width 600px padding right 50 box sizing border box background ddd div TEXT ETISI DHOASIHD I SA
  • 选择接下来的第n个同级

    我想知道是否有比我发现的更好的解决方案而不改变 html 结构 HTML 结构如下所示 div class wrap div class divider div div class block div div class block div
  • 如何使用 HTML CSS JS 创建滑块/切换来更改屏幕上的字体大小 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 is there any way I can make this gt 所以我想制作一个滑块 切换器 用户可以拖动 滑动它来改变不同的
  • CSS 计数器输出不匹配

    有人可以解释一下为什么吗section计数器值总共打印 0h2 tags 这是源代码
  • 调整离子卡中的图像大小

    我想显示一组图像 并在下面说明 我选择使用 Ionic 卡 我得到这个结果 第一张图片 虽然我想保留现在的相同布局 并添加描述 这是我的代码
  • 如何反转媒体查询中元素的顺序?

    我有两个 div 左和右 但是当屏幕小于 500px 时 左 div 成为底部 div 右 div 成为顶部 div DOM 中的第一个 div 应该显示为第二个 第二个 div 为第一个 I use display flex 然后 div
  • iframe 位置居中

    所以我找到了这段用于将内容放在中心的代码 但我的问题是它是为容器制作的 你知道如何为 iframe 制作它吗 或者你知道另一个代码吗 代码 center margin auto width 60 border 3px solid 73AD2

随机推荐

  • Vim - 在重音字母或 ñ 之后插入额外空格

    我有一个关于 Vim 的问题 我在 Mac OS X Snow Leopard 上并编译了 vim 以开始使用编辑器 有时我会用其他语言打字 我发现在输入带重音的字母时 每个字母后都会添加一个额外的空格 我还使用 Mac 西班牙语键盘进行打
  • 我尝试使用动画来使线性布局进行翻译,像这样向左<->向右。但我遇到了一些错误

    这是我的第一个应用程序 我尝试从右到左或从左到右翻译 这是代码 资源 gt 动画 gt 向左翻译
  • Node.js 和 java 之间的 mqtt 通信

    目标是使用 mqtt 协议发送数据 Java 项目 tempSensor 使用 mqtt 协议和使用 mqtt 订阅 tempvalue 的 Node js 生成 tempvalue Node js 和 java 项目都使用相同的密钥进行发
  • 如何在 iOS 中使用 MpMoviePlayerController 在 UISlider 上显示缓冲数据?

    我在用MPMoviePlayerController播放音频 我想在滑块上显示缓冲数据 如下所示 我想显示缓冲区数据 如滑块中的红色部分 我尝试用谷歌搜索它 但我没有得到任何解决方案 以及如何自定义滑块 提前致谢 是的 我们可以使用显示流数
  • 继承树上的反序列化顺序

    我有一个标记的基类Serializable 以及标记的派生类Serializable也 我想在反序列化期间在基类中做一些事情 因此声明了一个标记为OnDeserializing 但重要的是该方法将在任何派生类的之前执行OnDeseriali
  • 调整位图大小是在视图中裁剪而不是缩放

    我不知道如何调整位图的大小 根据这里的帖子 Bitmap createScaledBitmap 是执行此操作的方法 但它对我来说不起作用 由于视图的性质 我在 onDraw 中完成所有操作 因此我认为我不能使用布局或 ImageView 这
  • Three.js 具有恒定大小的对象

    我正在开发一个绘图程序 我需要的是一个具有恒定大小的 THREE Object3D 元素 就像线条始终为 1px 一样 换句话说 我试图在舞台上放置一个对于观看者来说尺寸始终相同的对象 所以如果你靠近它 它的大小不会改变 类似的机制是三线
  • 以下 Fortran“并发”循环有效吗?

    我不认为下面的do concurrentFortran 循环有效 如下所示acc在每次迭代中都会被修改 但是 gfortran 没有给我任何类型的警告 并且结果值acc正确的是 55 它是否有效 integer acc i acc 0 do
  • 使用 JavaScript 提取 EXIF 数据

    我正在评估使用 Canvas 的移动网络应用程序的图像上传技术 症结在于客户端读取 EXIF 数据 本网站的其他讨论 https stackoverflow com questions 7584794 accessing jpeg exif
  • InnoDB SELECT ... FOR UPDATE 语句锁定表中的所有行

    MySQL 服务器版本 5 1 41 启用了 InnoDB 插件 我有以下三个发票表 invoices invoice components 和invoice expenses 表发票有invoice id 主键 发票 组件和发票 费用都链
  • phonegap android ajax请求适用于GET但不适用于POST

    在我的phonegapp ed android应用程序中发送以下请求适用于GET 但不适用于POST 有了 GET 一切就正常了 使用 POST 请求会通过 但 POST 变量 服务器端未通过 服务器返回 json 响应显示 未提供参数 P
  • 我可以将 HashSet 作为 HashMap 中的键吗?如果没有,请提出替代方案

    编辑 现在正确解释了问题 我有一个哈希图 我想在其中存储一起看到的单词集 键 以及它们一起看到的行 值 这是我想出的结构 HashMap
  • PHPUnit 和 MySQL 截断错误

    我对 PHPUnit 始终运行的行为感到头疼TRUNCATE在插入夹具之前without首先设置外键检查 Syntax error or access violation 1701 Cannot truncate a table refer
  • 为 CI 预装依赖项的 Docker 镜像

    常见建议 example https blog sparksuite com 7 ways to speed up gitlab ci cd times 29f60aab69f9 执行 CI 的方法是使用预装依赖项的镜像 不幸的是 对于像我
  • 从可变产品的 WooCommerce 变体中获取权重值

    我正在开发一个自动调整产品价格的插件 我所有的产品都是可变产品 这使得这个问题比我能解决的更困难 if product gt is type variable foreach product gt get available variati
  • SQL Server Management Studio 显示数据库图表 (ER) 权限

    我想知道是否有人确切地知道 SQL Server 2005 中的数据库需要哪些权限 以便当人们使用 SQL Server Management Studio 时 他们至少能够看到数据库图表 我尝试为该人提供 db datareader db
  • 为什么我的异常被捕获后仍然抛出?

    我有以下代码 其中使用函数调用的结果初始化变量 这个函数抛出异常 所以我设置了一个 try catch 来捕获异常 由于某种原因 即使 catch 子句运行后 异常仍然显示在屏幕上 include
  • 如何在Java Servlet中使用Session?

    我的 java 代码中的会话有问题 通过 post 提交表单后 java servlet 将确定验证码是否正确 我可以知道应该添加什么才能在 java servlet 中使用会话吗 我需要导入什么东西才能使用会话吗 protected vo
  • 在浏览器中编译sass文件

    我正在尝试为我的用户创建一个系统 他们可以在其中选择他们想要包含在项目中的特定 SCSS 文件 他们通过浏览器来完成此操作 一旦他们检查了所有相关的 SCSS 文件 他们就会想要点击基于浏览器的 编译 按钮来生成最终的 CSS 这可能吗 我
  • CSS 平台特定的 hack

    我想知道是否有一种方法可以使用 CSS 来定位平台 即不同的操作系统 Windows 7 Windows 8 Linux 等 我有一个样式表 带有 ul 列表和边框底部设置 当鼠标悬停在菜单元素上时会改变颜色 问题是 在 Windows 7