不完美解决谷歌Chrome在设置background cover和fixed属性后,滚动屏幕出现背景图片的拉伸

业务场景:

让元素有背景图.

背景图不随着页面滚动而移动,相对于浏览器窗口固定.

根据屏幕尺寸,背景图自动覆盖式填充,不能有接缝和重复.

元素要有圆角.

通过js入参动态设置背景图.

不便截图,相信各位上面可以看明白了.

复现:

css是这样的

.main {
    width: 90%;
    background-size: 100% 100%;
    border-radius: 3.125rem;
    padding: 5% 5% 20rem;
}

js中动态设置了背景图片

let mainStyleOverride = {
        background: `fixed url(${props.backgroundImageUrl.toString().startsWith("http") ? props.backgroundImageUrl : backImg}) `,
        backgroundSize: 'cover',
        //网上有人说这么做,但是不满足需求,这样设置以后,鼠标滚动背景图就跟着走了
        //transform: "translate3d(0, 0, 0)",
    }

return <div className="main" style={mainStyleOverride}>
        <div className="main-title">{props.title}</div>
        <div className="main-subTitle">{props.subTitle}</div>
    </div>

开始以为是rem的问题,同事说是这个可能是元素的高度变化了才导致的.但并不是.元素高度没有变化.

这个问题在safari上不存在.

解决方法:

方法1:

.main {
    width: 90%;
    //background-size: 100% 100%;
    //问题的根源
    //border-radius: 3.125rem;
    padding: 5% 5% 20rem;
    //增加后没有问题,找到灵感
    //background-position: 10rem 0;
    background-size: cover;
    //只有谷歌浏览器会出这个问题
    //-webkit-background-size: cover;
    //-moz-background-size: cover;
    //-o-background-size: cover;
    //为cover层提供定位
    position: relative;
    //将多余的box-shadow隐藏,否则如果调整时失误将box-shadow的第四参数调整过大会侵蚀别的元素
    overflow: hidden;
    //增加一个遮罩层,让中间镂空,周围圆角,圆角外部是白色的box shadow
    &-cover{
        //满铺
        width: 100%;
        height: 100%;
        position: absolute;
        //调整位置
        top: 0;
        left: 0;
        //圆角放在遮罩层
        border-radius: 3.125rem;
        //透明,就展示中间原来展示的内容了.
        background: transparent;
        //第四个参数要大于等于border-radius.否则圆角切不完,外面还剩一块,第三个参数要小,否则会出现渐变
        box-shadow: 0 0 1px 3.125rem white;
    }
}
export const AD = (props) => {
    let editing = props.editing;
    let mainStyleOverride = {
        backgroundImage: `url(${props.backgroundImageUrl.toString().startsWith("http") ? props.backgroundImageUrl : backImg})`,
        backgroundAttachment:'fixed',
    }
    const onClick = () => {
        window.location.href = props.buttonHrefUrl;
    }
    return <div className="main" style={mainStyleOverride}>
        <div className="main-cover"></div>
        <div className="main-title">{props.title}</div>
        <div className="main-subTitle">{props.subTitle}</div>
    </div>
};

但是这个方法会有一个问题:中间的内容会被cover掉

方法2:

四个角分别用四个矩形做圆角box-shadow,这样做的问题也有一个,谷歌浏览器会在渲染box-shadow时,外部的container边界上会映射出box-shadow的影子.

方法3:

main外面再包一层,圆角设置到外面

advertise {
  overflow: hidden;
  border-radius: 3.125rem;
  width: 100%;

  &-main {
    width: 100%;
    box-sizing: border-box;
    padding: 5% 5% 20rem;
    background-size: cover;
    position: relative;
}

这个方法也有一个问题:

safari不显示圆角,手机chrome和safari也不显示圆角. 

方法4:

使用svg,也有问题 某个宽度/角度的时候也会出现边缘.应该是浏览器计算精度问题了.

这个问题在左上角0,0的位置不会出现,坐标非0的时候计算可能就会出现问题.解决办法是:

<svg
            xmlns="http://www.w3.org/2000/svg"
            version="1.1"
            viewBox="0 0 1000 50"
            style={{
                background:'transparent',
                position:'absolute',
                top:0,
                left:0,
            }}
        >
            <path d="M 0,50 A 50,50 0 0 1 50,0 L 0,0 M0,50 Z" fill="white"></path>
            <path d="M 950,0 A 50,50 0 0 1 1001,50 L 1001,0 Z" fill="white"></path>
        </svg>


注意1001的写法  实际你的视口是1000的,但是要写成大于1000 防止计算的时候丢精度导致的问题.但是不要写的太大.比如你写成1010,那么可能就发生形变了. 

比如像下面这样 就是写成1010的效果

但是这之后还是有一个问题:safari浏览器会有问题,svg的定位错误.  哈哈哈哈哈

总结:

并不是什么技术方案,只是个思路,经验代替不了思考.

具体原因不清楚,可能是浏览器问题以后会解决吧.只要解决问题就好.

用background clip可以解决?,我没有弄,当需要更多效果或者验收不过的时候可以考虑.

最后,没有完美解决,或许我该试试用4个svg分别做四个角,而不是用上下两个?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在 Chrome 浏览器中,使用 --user-data-dir 参数时,会创建一个新的用户数据目录,并且会加载所有的插件、扩展程序等。因此,加载时间可能会比较长,造成浏览器启动速度变慢。 如果你想提高浏览器的启动速度,可以考虑减少扩展程序的数量,或者直接使用默认的用户数据目录,而不使用 --user-data-dir 参数。 ### 回答2: chromedriver是用于控制Chrome浏览器的工具,它支持一些高级特性,如模拟用户行为、自动化测试等。在使用chromedriver时,可以通过设置user-dir属性指定用户数据目录,以便浏览器能够保存用户的个人设置、历史记录、插件等数据。 当设置了user-dir属性后,chromedriver在启动时会加载指定的用户数据目录,这会导致启动变得较慢。因为加载用户数据目录需要加载和处理大量的数据文件,包括浏览历史、插件配置、Cookie等等。加载过程可能会涉及大量的磁盘读取、内存处理和网络通信,这些都需要一定的时间。 另外,用户数据目录可能会很大,特别是在使用浏览器较长时间或进行了大量的操作后。如果设置了user-dir属性后,chromedriver每次启动都需要加载整个用户数据目录,这会增加启动时间。 此外,chromedriver还可能会被其他因素影响导致启动变慢,如电脑性能较低、网络连接问题、Chrome浏览器本身的问题等。 综上所述,设置user-dir属性chromedriver启动变慢可能是由于加载和处理大量的用户数据文件导致的,同时可能还受到其他因素的影响。如果使用时出现启动缓慢的情况,可以尝试优化计算机性能、检查网络连接或升级Chrome浏览器等措施来改善。 ### 回答3: Chromedriver 是一个控制 Chrome 浏览器的工具,用于自动化测试等场景。它可以通过设置 user-dir 属性指定用户数据目录,用于保存浏览器的用户信息和配置。 在启动 Chromedriver 时,如果设置了 user-dir 属性,它会加载指定目录下的用户数据,包括浏览器的历史记录、插件、设置等信息。这样可以使得每次启动 Chromedriver 时都是在一个特定的用户环境中进行操作,以实现测试的准确性和稳定性。 然而,由于加载用户数据需要时间,这就导致了启动 Chromedriver 变得比较慢。尤其是当用户数据目录的大小较大或者存储的数据较多时,加载过程可能会更加耗时。 此外,如果用户数据目录中保存了大量插件或者扩展,这些插件的加载也会增加启动时间。因为在启动时,Chromedriver 需要加载并初始化这些插件以保证与用户实际使用环境的一致性。 为了加快 Chromedriver 的启动速度,可以考虑以下几个方面的优化: 1. 精简用户数据目录:删除不必要的历史记录、缓存文件等,只保留影响测试的最小数据集; 2. 减少插件和扩展数量:只保留对测试用例有影响的插件,删除其他不必要的插件; 3. 提前加载用户数据:在测试开始之前,可以先启动一次 Chromedriver,加载用户数据,然后退出,这样第二次启动时就能够快速加载。 综上所述,通过设置 user-dir 属性可以实现在指定的用户环境中进行自动化测试,但是可能会导致启动速度变慢。可以通过优化用户数据和插件的方式来减少启动时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Afterwards_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值