You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

检测Safari浏览器以切换CSS的display:flex/block属性

Safari 16.5+ flex布局兼容解决方案

问题背景

本人对编码和CSS不太熟悉,之前用ChatGPT生成的代码能实现根据浏览器切换CSS属性,但在Safari 16.5版本后失效。现在需要实现:检测到Safari浏览器时,将页面中#webtest元素的display设为block;其他浏览器保持display:flex。

出现该需求的原因是Safari的flex布局表现异常,执行搜索操作后页面元素会出现挤压问题。此前尝试过Java、PHP方案,均无效果,愿意支付25美元Paypal报酬寻求可行方案。

当前使用的失效代码

/* Styles for the 'webtest' ID in non-Opera and non-Safari browsers */
#webtest {
  display: flex;
  justify-content: center;
  /* Additional styles */
}

/* Exclude display: flex; for Opera and Safari */
@media not all and (-webkit-min-device-pixel-ratio:0) and (min-resolution:.001dpcm),
       not all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
  #webtest {
    display: block;
    /* Additional styles for Opera and Safari */
  }
}

可行解决方案

方案1:CSS @supports 精准匹配Safari

新版本Safari对旧媒体查询规则的支持有变化,可通过@supports结合Safari特有CSS属性精准识别:

#webtest {
  display: flex;
  justify-content: center;
  /* 其他通用样式 */
}

/* 仅匹配Safari浏览器 */
@supports (-webkit-hyphens:none) and (not (hyphens:none)) {
  #webtest {
    display: block;
    /* Safari专属样式 */
  }
}

原理:Safari支持私有前缀的-webkit-hyphens但不支持标准hyphens属性,通过该组合可精准区分Safari与其他WebKit内核浏览器(如Chrome)。

方案2:JavaScript检测并添加专属类名

若CSS方案仍有问题,可通过JS检测Safari后给目标元素添加类名,再通过CSS匹配:

// 检测Safari浏览器
function isSafari() {
  return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
}

// 给#webtest添加safari类
if (isSafari()) {
  document.getElementById('webtest').classList.add('safari');
}

对应CSS设置:

#webtest {
  display: flex;
  justify-content: center;
  /* 其他通用样式 */
}

#webtest.safari {
  display: block;
  /* Safari专属样式 */
}

该方法兼容性更强,不受CSS规则变更影响。

内容的提问来源于stack exchange,提问作者amdaman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:22:47