【发布时间】:2021-01-26 10:10:24
【问题描述】:
我这几天一直在与这个问题作斗争,我不确定为什么 chrome 浏览器会将 CSS 位置属性(上、右、下、左)转换为 inset 属性(大多数浏览器通常不支持)。
我在一个编辑器中工作,当您在 chrome 中编辑元素时,它会将 CSS 位置属性转换为如下所示的插入
但是当您在其他浏览器上使用 inset 属性查看在 chrome 上创建的元素时。 inset 属性被删除或删除并带有警告Unsupported Property Name(见下图)
但是,如果我使用 Brave 或 Safari 等浏览器使用编辑器构建我的页面,CSS 位置属性仍然是 Top、Right、Bottom、Left。 (见下图)
我的问题是我该如何解决这个问题,因为包括我在内的很多人都使用 chrome,而 inset 属性仅适用于 chrome 和 android 设备,不支持 iOS。
我们将不胜感激任何对正确方向的帮助。
更新 1
下面是我的代码,它在 Brave、Safari 上的工作方式与此完全相同,但 chrome 会转换为 inset。
更新 2
编辑器保存 HTML,并且 HTML 用于所有浏览器。当使用 chrome 编辑页面并将 CSS 位置属性更新为 Inset ...Inset 然后在所有浏览器中使用(并且这些浏览器(safari 和勇敢)不支持)...但是如果我从 Brave 浏览器或 safari 编辑我的页面并保存编辑器,使用 top, right, bottom, left CSS 位置属性,页面在所有浏览器上按预期呈现
我的解决方案
以下是我在 jQuery 中解决问题的方法。对于 AngularJS,请参阅@user10245459 的回答。我的解决方案假设您可以访问整个 HTML,因为在我的情况下,每当我保存编辑器时,页面的 HTML 对我都是可用的,所以我创建了一个函数来查看 HTML 代码并更新 inset 之前的样式将 HTML 代码放入文件中
/**
* A Very stressful/Painful hack for chrome converting Positing
* Properties to inset, causing text and heading to stack over each other
* in a corner on iOS mobile, IE/EDGE, Samsung Internet
*/
function updateInsetProperty( HTMLstring ) {
var _allStyles = HTMLstring.match(/style="([^"]*)"/g);
var _insetBank = [];
$.each(_allStyles, function(i, style){
var onlyStyleInsetProperty = style.replace(/"/, '').match(/inset:\s?([A-Za-z\s0-9\.\-]+)?/i);
if( onlyStyleInsetProperty != null ) {
var _splitInset = onlyStyleInsetProperty[1].split(' ');
var _insetReplacement = `top:${_splitInset[0]}; right:${_splitInset[1]}; bottom:${_splitInset[2]}; left:${_splitInset[3]}`;
var formattedStyle = HTMLstring.replace(onlyStyleInsetProperty[0], _insetReplacement);
HTMLstring = formattedStyle;
}
});
return HTMLstring;
}
那么就可以这样调用函数了。
var htmlCodeForMobile = updateInsetProperty(htmlTmp_mbl);
var htmlCodeForDesktop = updateInsetProperty(htmlTmp_dsk);
// Note: htmlTmp_mbl is the HTML code for mobile from
// the editor (in my case) or HTML from your source
// while htmlTmp_dsk is the HTML for desktop.
【问题讨论】:
-
这是我的代码imgur.com/WxAnRb7,它的渲染与在 safari 和勇敢时完全相同,但 chrome 将其转换为 inset
-
您正在投票结束这个问题...@melancia ...我的代码中没有任何插入,但已添加,如您在 imgur.com/WxAnRb7 中看到的那样。所以我不确定为什么这个问题被否决并投票结束
-
编辑器保存 HTML 属性(即内联 CSS 样式),因为它是从 chrome 浏览器编辑的...这就是为什么我的问题是如何防止 chrome 出现这种行为。
-
我没有为该属性设置任何简写,我认为浏览器没有理由为我假设或更改为简写... Brave 和 Chrome 正在 Chromium 上运行,但 Brave 没有假设或将属性更改为简写形式......为什么 Chrome 应该这样做并假设?如果该属性得到广泛支持,那将不是问题,但三星 Internet、iOS 手机、Safari 桌面、IE 不支持此功能。 android 上的用户得到了正确的布局,但 iOS 用户仅仅因为这个问题得到了一个非常扭曲的布局
-
啧啧!!!使用
filter,我是添加属性过滤器的人......所以每当我使用此类属性时,我总是使用供应商前缀......但在这种情况下,我没有使用inset属性......为什么应该为我添加吗?这就是我问这个问题的原因。在这一点上,我将停止回复。感谢您的宝贵时间
标签: css google-chrome css-position