是否有针对Safari的CSS hack(仅适用于Chrome)?


182

我试图找到仅适用于Safari而不是chrome的css hack,我知道这两个都是webkit浏览器,但是我在chrome和safari中的div对齐方面存在问题,每种显示方式都不同。

我一直在尝试使用它,但是它也会影响铬

@media screen and (-webkit-min-device-pixel-ratio:0) { 
  #safari { display: block; } 
} 

有谁知道另一种仅适用于野生动物园的东西吗?



我对实际问题比对脆弱和棘手的解决方案更感兴趣。(仍然)在某处可用吗?
Matijs '18

对于发布“行不通”的人-请意识到您需要知道要测试的Safari版本。没有针对每个版本的“万能” Safari解决方案。您需要在发布时提供这些信息,否则没有人可以帮助您找到解决方案。
Jeff Clayton

不同版本的Safari有不同的需求-请在此处查看实时示例:browserstrangeness.bitbucket.io/css_hacks.html#safari [或镜报] browserstrangeness.github.io/css_hacks.html#safari
Jeff Clayton

Answers:


356
  • 针对CATALINA和SAFARI 13的更新(2020年初更新)*

注意:过滤器和编译器(例如SASS引擎)期望使用标准的“跨浏览器”代码-而不是像此类的CSS hack,这意味着它们将重写,销毁或删除这些hack,因为这不是hack所做的。其中大部分是非标准代码,这些代码经过精心设计,仅针对单个浏览器版本,如果更改了它们,将无法正常工作。如果您希望将它们与之配合使用,则必须在任何过滤器或编译器之后加载所选的CSS hack。这似乎是一个定理,但人们之间有很多困惑,他们没有意识到他们是通过不是为此目的而设计的软件来运行黑客来消除黑客的。

许多人已经注意到,自6.1版以来,Safari发生了变化。

请注意:如果您在iOS上使用Chrome [以及现在也在使用Firefox](至少在iOS 6.1和更高版本中),并且您想知道为什么没有一个黑客似乎将Chrome与Safari分开,这是因为iOS的Chrome版本正在使用Safari引擎。它使用的是Safari hack,而不是Chrome hack。有关此内容的更多信息,请访问:https : //allthingsd.com/20120628/googles-chrome-for-ios-is-more-like-a-chrome-plated-apple/ iOS版Firefox于2015年秋季发布。它也响应Safari Hacks,但没有Firefox Hacks,与iOS Chrome相同。

还:如果您尝试了一个或多个hack,但无法使其正常工作,请发布示例代码(更好的是一个测试页)-您正在尝试的hack,以及您使用的浏览器(确切的版本!)正在使用的设备以及正在使用的设备。没有这些附加信息,我或这里的任何其他人都将无法为您提供帮助。

通常,这是一个简单的解决方法或缺少分号。使用CSS通常是样式表中列出的代码或代码顺序的问题,而不仅仅是CSS错误。请在测试站点的此处进行测试。如果能够在此处正常运行,则说明该hack确实适用于您的设置,但这是需要解决的其他问题。这里的人确实很乐于帮助您,或者至少可以为您指明正确的方向。

测试地点:

https://browserstrangeness.bitbucket.io/css_hacks.html#safari

和镜子!

https://browserstrangeness.github.io/css_hacks.html#safari

在这里,您可以使用一些hacks来使用最新版本的Safari。

您应该先尝试一下,因为它涵盖了当前的Safari版本,并且仅适用于纯Safari:

此版本仍可与Safari 13(2020年初)一起正常使用:

/* Safari 7.1+ */

_::-webkit-full-page-media, _:future, :root .safari_only {

  color:#0000FF; 
  background-color:#CCCCCC; 

}

要涵盖6.1及更高版本,此时,您必须使用下一对CSS hack。一个用于6.1-10.0的程序,另一个用于处理10.1及更高版本的程序。

所以-这是我为Safari 10.1+设计的:

双重媒体查询在这里很重要,请不要删除它。

/* Safari 10.1+ */

@media not all and (min-resolution:.001dpcm) { @media {

    .safari_only { 

        color:#0000FF; 
        background-color:#CCCCCC; 

    }
}}

如果SCSS或其他工具集在嵌套媒体查询中遇到问题,请尝试以下方法:

/* Safari 10.1+ (alternate method) */

@media not all and (min-resolution:.001dpcm)
{ @supports (-webkit-appearance:none) {

    .safari_only { 

        color:#0000FF; 
        background-color:#CCCCCC; 

    }
}}

下一个适用于6.1-10.0但不适用于10.1(2017年3月下旬更新)

我通过结合其他多种黑客,经过数月的测试和实验,创建了这种黑客。

注意:像上面一样,双重媒体查询也不是偶然的-它排除了许多无法处理媒体查询嵌套的较旧的浏览器。-“ and”后的空格也很重要。毕竟,这是一种黑客行为,并且是目前唯一适用于6.1和所有较新Safari版本的黑客行为。另外请注意,如以下注释中所列,该hack是非标准的css,必须在过滤器之后应用。诸如SASS引擎之类的过滤器将完全重写/撤消或完全将其删除。

如上所述,请检查我的测试页以确保它按原样运行(未经修改!)

这是代码:

/* Safari 6.1-10.0 (not 10.1) */

@media screen and (min-color-index:0) and(-webkit-min-device-pixel-ratio:0) 
{ @media {
    .safari_only { 

        color:#0000FF; 
        background-color:#CCCCCC; 

    }
}}

有关“版本特定的” Safari CSS的更多信息,请继续阅读以下内容。

/* Safari 11+ */

@media not all and (min-resolution:.001dpcm)
{ @supports (-webkit-appearance:none) and (stroke-color:transparent) {

    .safari_only { 

        color:#0000FF; 
        background-color:#CCCCCC; 

    }
}}

一个适用于Safari 11.0的版本:

/* Safari 11.0 (not 11.1) */

html >> * .safari_only {

  color:#0000FF; 
  background-color:#CCCCCC; 

}

一个适用于Safari 10.0的版本:

/* Safari 10.0 (not 10.1) */

_::-webkit-:host:not(:root:root), .safari_only {

  color:#0000FF; 
  background-color:#CCCCCC; 

}

略作修改的版本适用于10.1(仅):

/* Safari 10.1 */

@media not all and (min-resolution:.001dpcm)
{ @supports (-webkit-appearance:none) and (not (stroke-color:transparent)) {

    .safari_only { 

        color:#0000FF; 
        background-color:#CCCCCC; 

    }
}}

Safari 10.0(非iOS设备):

/* Safari 10.0 (not 10.1) but not on iOS */

_::-webkit-:-webkit-full-screen:host:not(:root:root), .safari_only {

  color:#0000FF; 
  background-color:#CCCCCC; 

}

Safari 9 CSS hacks:

一个简单的支持Safari 9.0及更高版本的功能查询黑客:

@supports (-webkit-hyphens:none)
{

  .safari_only {
    color:#0000FF; 
    background-color:#CCCCCC; 
  }

}

适用于Safari 9.0及更高版本的简单下划线黑客:

_:not(a,b), .safari_only {

  color:#0000FF; 
  background-color:#CCCCCC; 

}

Safari 9.0及更高版本的另一个:

/* Safari 9+ */

_:default:not(:root:root), .safari_only {

  color:#0000FF; 
  background-color:#CCCCCC; 

}

还有另一个支持功能查询:

/* Safari 9+ */

@supports (-webkit-marquee-repetition:infinite) and (object-fit:fill) {

    .safari_only { 

        color:#0000FF; 
        background-color:#CCCCCC; 

    }
}

一个适用于Safari 9.0-10.0的版本:

/* Safari 9.0-10.0 (not 10.1) */

_::-webkit-:not(:root:root), .safari_only {

  color:#0000FF; 
  background-color:#CCCCCC; 

}

Safari 9现在包括功能检测,因此我们现在可以使用它...

/* Safari 9 */

@supports (overflow:-webkit-marquee) and (justify-content:inherit) 
{

  .safari_only {
    color:#0000FF; 
    background-color:#CCCCCC; 
  }

}

现在仅定位到iOS设备。如上所述,由于iOS上的Chrome根植于Safari,因此它当然也很受好评。

/* Safari 9.0 (iOS Only) */

@supports (-webkit-text-size-adjust:none) and (not (-ms-ime-align:auto))
and (not (-moz-appearance:none))
{

  .safari_only {
    color:#0000FF; 
    background-color:#CCCCCC; 
  }

}

一个适用于Safari 9.0+,但不适用于iOS设备:

/* Safari 9+ (non-iOS) */

_:default:not(:root:root), .safari_only {

  color:#0000FF; 
  background-color:#CCCCCC; 

}

还有一个适用于Safari 9.0-10.0而非iOS设备的:

/* Safari 9.0-10.0 (not 10.1) (non-iOS) */

_:-webkit-full-screen:not(:root:root), .safari_only {

  color:#0000FF; 
  background-color:#CCCCCC; 

}

以下是将6.1-7.0和7.1+分开的黑客,这些还需要将多个黑客结合在一起才能获得正确的结果:

/* Safari 6.1-7.0 */

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

      color:#0000FF; 
      background-color:#CCCCCC; 

    );}
}

由于我已经指出了阻止iOS设备的方法,因此以下是针对非iOS设备的Safari 6.1+ hack的修改版本:

/* Safari 6.1-10.0 (not 10.1) (non-iOS) */

@media screen and (min-color-index:0) and(-webkit-min-device-pixel-ratio:0) 
{ @media {
    _:-webkit-full-screen, .safari_only { 

        color:#0000FF; 
        background-color:#CCCCCC; 

    }
}}

要使用它们:

<div class="safari_only">This text will be Blue in Safari</div>

通常[喜欢这个问题]人们问起Safari骇客的原因主要是为了将其与Google Chrome分开(再次不是iOS!)。发布替代方法可能很重要:如何也将Safari和Safari分别定位到Chrome如果需要,我在这里为您提供。

这里是基础知识,请再次在我的测试页上查看许多特定版本的Chrome,但这些通常涵盖了Chrome。Chrome的版本为45,Dev和Canary的版本目前为47。

我放在浏览器上的旧媒体查询组合仍然仅适用于Chrome 29+:

/* Chrome 29+ */

@media screen and (-webkit-min-device-pixel-ratio:0) and (min-resolution:.001dpcm)
{
    .chrome_only {

       color:#0000FF; 
       background-color:#CCCCCC; 

    }
}

@supports功能查询也适用于Chrome 29 +。...下面是我们用于Chrome 28+的版本的修改版本。Safari 9,即将到来的Firefox浏览器和Microsoft Edge浏览器并未与此配套:

/* Chrome 29+ */

@supports (-webkit-appearance:none) and (not (overflow:-webkit-marquee))
and (not (-ms-ime-align:auto)) and (not (-moz-appearance:none))
{
    .chrome_only {

       color:#0000FF; 
       background-color:#CCCCCC; 

    }
}

以前,Chrome 28及更高版本很容易定位。这是我看到它包含在其他CSS代码块中(最初不打算作为CSS hack)并意识到它的作用后发送给browserhacks的代码,因此我提取了相关的部分用于我们的目的:

[注意:]下面的这种较旧的方法现在可以显示Safari 9和Microsoft Edge浏览器,而无需进行上述更新。即将发布的Firefox和Microsoft Edge版本在其编程中增加了对多个-webkit- CSS代码的支持,Edge和Safari 9均增加了对@supports功能检测的支持。Chrome和Firefox以前包含@supports。

/* Chrome 28+, Now Also Safari 9+, Firefox, and Microsoft Edge */

@supports (-webkit-appearance:none) 
{
    .chrome_and_safari {

       color:#0000FF; 
       background-color:#CCCCCC; 

    }
}

Chrome版本22-28(如果需要以支持较早版本)的块也可以针对我上面发布的Safari组合hack进行修改:

/* Chrome 22-28 */

@media screen and(-webkit-min-device-pixel-ratio:0)
{
    .chrome_only {-chrome-:only(;

       color:#0000FF; 
       background-color:#CCCCCC; 

    );}
}

NOTE: If you are new, change class name but leave this the same-> {-chrome-:only(;

像上面的Safari CSS格式化黑客一样,这些漏洞可以按以下方式使用:

<div class="chrome_only">This text will be Blue in Chrome</div>

因此,您不必在这篇文章中进行搜索,这又是我的实时测试页面:

https://browserstrangeness.bitbucket.io/css_hacks.html#safari

[或镜子]

https://browserstrangeness.github.io/css_hacks.html#safari

测试页面还包含许多其他页面,特别是基于版本的页面,以进一步帮助您区分Chrome和Safari,以及针对Firefox,Microsoft Edge和Internet Explorer Web浏览器的许多技巧。

注意:如果某些操作不适合您,请首先检查测试页,但提供示例代码和您正在尝试的WHICH骇客,任何人都可以为您提供帮助。


9
只是想说测试页很棒。现在,我可以使用任何设备浏览到该站点,并查看哪些CSS规则适用!
duyn9uyen 2014年

1
这是否适用于iPhone或iPad上的Safari?
格雷格·罗兹玛丽诺维奇

1
实际上,我只是结合以上示例和(; property:value;);来解决了自己的问题。在下面,效果很好!
mydoglixu 2014年

1
此答案顶部的Safari 6.1+破解在Sass编译器中引发错误。有办法解决吗?
黑鸟2015年

2
@Blackbird对不起,但是您不能编译或过滤这些hack,它会破坏它们。它们必须原样使用。(在编译后将它们添加到完整的css文件中。)它们是非标准的事实是它们起作用的原因。
杰夫·克莱顿

89

有一种方法可以从Chrome过滤Safari 5+:

@media screen and (-webkit-min-device-pixel-ratio:0) { 
    /* Safari and Chrome */
    .myClass {
     color:red;
    }

    /* Safari only override */
    ::i-block-chrome,.myClass {
     color:blue;
    }
}


注意:在iOS [经过iOS 7测试]中,Chrome版本实际上正在运行safari引擎,因此在ipad或iphone上,您可以使用safari hacks。对于其他设备,它们是不同的。
杰夫·克莱顿2014年

因此,答案中的代码基本上适用于Safari 5.0和6.0,而不适用于6.1+?
Nic Cottrell 2014年

绝对准确地说,:: i-block-chrome,.myClass {}构造仅允许使用Safari 5.1-6.0,但也允许使用Chrome 10-24(不再使用旧版本的Chrome,因此不值得一提),但没有更新-Safari黑客通常会这样工作:一批处理5.1-6.0,另一批处理6.1-7.0,而更新的处理7.1-8.0。他们似乎要进行很多更新,直到他们决定转到与先前的.1版本非常接近的下一个数字版本。
杰夫·克莱顿

在2013年回答这个问题时,Safari 6.1刚刚发布,因此没有足够的人看到浏览器已更改,因此这是当时最准确的浏览器。如果您需要更新的,请在下面查看我的答案。在提供它时,这是一个很好的答案。时间随时间变化,所以我发布了我的作品作为对此的更新。我花了几个月的时间来创建6.1-7.0和7.1-8.0。希望您喜欢结果。如果遵循该模式,则很有可能在发布8.1版时,也需要进行其他修改。再一次只有时间会证明一切。
杰夫·克莱顿

21

仅萨拉里

.yourClass:not(:root:root){ 
    /* ^_^ */ 
}

8
愿意添加一些解释吗?我可以直接输入root:root吗?
Nubtacular

1
这个版本完全适用于Safari 3.x(和Chrome版本1.0,尽管现在没有人使用Chrome 1.0,因为它已经是30年代了……)
Jeff Clayton 2014年

这个现在也以Safari 9.0为目标,因此完整的统计信息已更新:/ * Chrome 1.0,Safari 3.X,Safari 9.0+ * /
Jeff Clayton 2015年

4
所述:not(:root:root)选择器根据CSS选择器3的规格(在这是无效:not()只能包含一个简单的选择器,即,一个类型选择器一个ID 一个类一个伪类),但根据完全有效的,以CSS选择4(其中:not()接受的列表选择器)。的确,当前只有Safari能够理解CSS Selectors 4语法,但是这种解决方案并非面向未来。
伊利亚·斯特雷钦

2
很少有黑客无法证明(很多实际的标准代码不是由于版本更改而来)的未来证明。最好的计划是,如果您要使用css hack,请仅将其用作临时修复程序,以便腾出时间进行更正式的跨浏览器更新。
杰夫·克莱顿

14

此hack 100%仅适用于Safari 5.1-6.0。我刚刚测试成功。

@media only screen and (-webkit-min-device-pixel-ratio: 1) {
     ::i-block-chrome, .yourcssrule {
        your css property
    }
}

3
此hack实际上适用于不同版本的Chrome和Safari。它仅允许使用Chrome 10-24(没有人再使用了,这就是为什么有人列出它阻止了Chrome)和Safari 5.1-6.0。但是,它不适用于Safari 6.1和更高版本。当时没有更好的黑客手段。
杰夫·克莱顿

1
@ veronica-lotti,这也对我有用。你摆脱了我的头痛。谢谢
Andhi Irawan '18

人-请注意。这些注释所描述的是一种在过去几年中不适用于Safari版本且仅适用于旧版本的方法。真正的意思是,互联网上的大多数人不会得到您想要的结果,而只有拥有旧计算机的人才可以得到。这不适用于当前的操作系统。目前,大多数人都拥有版本12和更高版本(不是6.0和更低版本,仅在Windows XP时代才是最新版本。)
Jeff Clayton

8

对于那些想为Safari 7.0及以下版本而不是7.1及以上版本实现黑客攻击的人-使用:

.myclass { (;property: value;); }
.myclass { [;property: value;]; }

我尝试使用Safari 7,但无法正常工作。您能否提供一个可行的示例?
多汁

@Juicy:在browserhacks.com上进行了实时测试-它们可在Safari 7及更低版本的Chrome以及Chrome 28及更低版本的系统上运行。(如另一篇发布的iOS 7和8所述,也许其他人也将Safari引擎用于Chrome,因此iPad上的Chrome和Safari都是真正的Safari)
Jeff Clayton 2014年

您可能已经在Safari 7.1(而不是Safari 7.0)中尝试过。它对7.0及更早版本有效,而不对7.1及更高版本有效。发布此答案时,7.0是Safari的最新版本,因此在那时是真实的。
杰夫·克莱顿

适用于Windows的Safari(版本5.1.7(7534.57.2))
jave.web 2015年

适用于Mac的Safari(版本6.0.2(7536.26.17))
Merlin

6

替换(.myClass)中的类

/ *仅适用于Safari * / .myClass:not(:root:root){ enter code here }


对于Safari来说,这是一个不错的选择-它针对的唯一其他浏览器是Chrome 1(不再使用Chome 1)
Jeff Clayton

针对未使用最新Mac的用户的确切规格:Chrome 1,Safari 3.X,Safari 9.0+(而非Safari 4-8)
Jeff Clayton

这适用于最新版本的Safari 7+,据我所知应该是公认的答案。
詹森(Jason Engage)

哇,在尝试了许多Safari浏览器黑客攻击后,这终于对我有用!!!
FairyQueen

4

顺便说一下,对于只需要在移动设备上定位Safari的任何人,只需向此黑客添加媒体查询即可:

@media screen and (max-width: 767px) {
    _::-webkit-full-page-media, _:future, :root .safari_only {
        padding: 10px; //or any property you need
    }
}

并且不要忘记将.safari_only类添加到要定位的元素,例如:

<div class='safari_only'> This div will have a padding:10px in a mobile with Safari  </div>

4

我喜欢使用以下方法:

var isSafari = /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);
if (isSafari) { 
  $('head').append('<link rel="stylesheet" type="text/css" href="path/to/safari.css">') 
};

此JavaScript hack方法需要安装JQuery软件包。
杰夫·克莱顿

这被认为是极其糟糕的做法,浏览器嗅探非常容易出错,并导致大量误报。不要这样做,即使是媒体查询嗅探也很脏,但是对于很小的更改也是可以接受的。
Wannes

3

使用仅适用于Safari的过滤器时,我可以定位Safari(iOS和Mac),但不包括Chrome(和其他浏览器):

@supports (-webkit-backdrop-filter: blur(1px)) {
  .safari-only {
    background-color: rgb(76,80,84);
  }
}

2

步骤1:使用https://modernizr.com/

步骤2:使用html类.regions仅选择Safari

a { color: blue; }
html.regions a { color: green; }

Modernizr将基于当前浏览器支持的内容将html类添加到DOM。Safari支持http://caniuse.com/#feat=css-regions区域,而其他浏览器则不支持(无论如何)。在选择不同版本的IE时,此方法也非常有效。愿原力与你同在。


1
modernizr是网站识别浏览器的绝佳javascript插件,非常棒的工具!-该骇客工具将(和其他骇客一样)起作用,直到其他浏览器决定支持区域功能为止
Jeff Clayton

1
CSS区域不再受支持。
1stthomas

2
区域使我能够在iOS上将Safari 6.1至11和7.1至11.2定位为目标,仅此一项就已经很棒。
lowtechsun

@lowtechsun-很好地发布您的统计信息,骇客仅是了解他们所针对的浏览器。
Jeff Clayton

2

嗨,我做了这个,对我有用

@media(max-width: 1920px){
    @media not all and (min-resolution:.001dpcm) {

        .photo_row2 {
            margin-left: 5.5% !important;
        }
    }
}

@media(max-width: 1680px){
    @media not all and (min-resolution:.001dpcm) {

        .photo_row2 {
            margin-left: 15% !important;
        }

    }
}

@media(max-width: 1600px){
    @media not all and (min-resolution:.001dpcm) {

        .photo_row2 {
            margin-left: 18% !important;
        }

    }
}


@media (max-width: 1440px) {
@media not all and (min-resolution:.001dpcm) {

        .photo_row2 {
            margin-left: 24.5% !important;
        }

    }

}


@media (max-width: 1024px) {
@media not all and (min-resolution:.001dpcm) {
    @media {
        .photo_row2 {
            margin-left: -11% !important;
        }

    }

}

这是一个不错的设置,它很好地利用了带有针对响应视图的网站的多种设备设置的hack。
杰夫·克莱顿

2

注意:如果仅iOS足够(如果您愿意牺牲Safari桌面),则可以使用:

    @supports (-webkit-overflow-scrolling: touch) {
    /* CSS specific to iOS devices */ 
    }

1

您可以使用媒体查询工具从其他浏览器中选择Safari 6.1-7.0。

@media \\0 screen {}

免责声明:此黑客还针对旧的Chrome版本(2013年7月之前)。


它在较新的Safari上不起作用,但是该统计数据是外科手术的:Safari 6.1-7.0,Chrome 22-28仍然很方便。
杰夫·克莱顿

0

这有效:

@media not all and (min-resolution:.001dpcm) { 
  @media {
    /* your code for Safari Desktop & Mobile */
    body {
      background-color: red;
      color: blue;
    }
    /* end */
  }
}

0

最后,我使用一些JavaScript来实现它:

if (navigator.vendor.startsWith('Apple'))
    document.documentElement.classList.add('on-apple');

然后在我的CSS中以Apple浏览器引擎为目标,选择器将是:

.on-apple .my-class{
    ...
}

0

https://stackoverflow.com/a/17637937/3174065 ,尽管此方法确实使用了某些JS,但仍在此处回答。如果使用js,请确保将js放在页脚中,主体必须完全加载才能正常启动,将其放置在头部时会出错,因为它在加载主体之前就启动了。

然后它将.safari类添加到主体,但仅在safari中,使对CSS的定位非常容易。


-1

它在野生动物园工作100%。

@media screen and (-webkit-min-device-pixel-ratio:0) 
{
::i-block-chrome, Class Name {your styles}
}

这适用于Safari的旧版本,而不是6.1和更高版本的当前版本。
杰夫·克莱顿

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.