【问题标题】:Prevent Chrome browser from converting position property to inset防止 Chrome 浏览器将位置属性转换为插入
【发布时间】: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


【解决方案1】:

我在使用 Angular ngStyle 时遇到同样的问题
[1]https://i.stack.imgur.com/GQu0V.png

<div class="content" [ngStyle]="getStyleByKeys(content.propList, styleKeys)"></dvi>

我找到了一个解决方法,仅供您参考。希望对您有所帮助:
[2]https://i.stack.imgur.com/cNqVd.png

<div class="content" [attr.style]="(getStyleString(getStyleByKeys(content.propList, styleKeys))) | safeStyle"></div>
import { pick } from 'lodash';

getStyleByKeys(props, keys): any {
    let res = {};

    if ( !props ) { return {}; }
    if ( keys ) { res = pick(props, keys); }
    return res;
}
getStyleString(o: any): any {
    return Object.keys(o).reduce((style, i) => {
        style += `${i}: ${o[i]}; `;
        return style;
    }, '');
}
``

【讨论】:

  • 我也做了类似的事情来解决我的问题......我将使用我使用的 JS 代码更新我的问题
  • 用我使用@10Rep 的 jQuery 解决方案更新了我的问题。希望对你有帮助
猜你喜欢
  • 2013-09-21
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
相关资源
最近更新 更多