Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >当flex容器中包含absolute元素时

当flex容器中包含absolute元素时

作者头像
celineWong7
发布于 2020-11-05 11:05:10
发布于 2020-11-05 11:05:10
3.7K00
代码可运行
举报
文章被收录于专栏:web前端踩坑web前端踩坑
运行总次数:0
代码可运行

我们曾经在 iphone5真机,绝对定位的兼容问题 这篇文章指出 采用的是 flex + positon:absolute 来布局时,遇到了低版本苹果机的兼容问题,而且后来还用了媒体查询的方式进行折中处理。 后来,同事反映在vivo xplay 5A 也遇到了和iphone5机型一样的兼容问题。由于vivo机型就不是很好媒体查询方式特别处理了,于是就不得不深究这个原因,并找到替代方案。

一、问题重现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<style type="text/css">
    .div1{
        width: 300px;
        height: 300px;
        background-color: pink;
        position: relative;
    }
    .div2 {
        width: 200px;
        height: 100px;
        background-color: green;
    }

    .div2{
        position: absolute;
    }
    .div1{
        display: flex;
        justify-content: center;
        /*justify-content: flex-end;*/
    }
</style>
<body>
    <div class="div1">
        <div class="div2"></div>
    </div>
</body>
</html>

我们设置了justify-content: center;,不同机型显示区别如下:

在PC端和iphone5以上的机型中:居中显示(正常)

在iphone5真机上的浏览器打开:偏右显示(异常)

有趣的是,我们把 justify-content: center; 改成 justify-content: flex-end; 时,它们的表现也不一致:

在PC端和iphone5以上的机型中:在容器内的最右端(正常)

在iphone5真机上的浏览器打开:跑到容器外了(异常)

当我们把绿色块改成相对定位时.div2{ position: relative; },就会发现flex布局在任何机子上都正常了。

可见,是因为 flex布局 和 绝对定位abosolute 起冲突了。

二、 问题分析

我们到技术文档查阅一下flex布局的一些说明https://www.w3.org/TR/css-flexbox-1/#abspos-items,可以看到如下一段话:

翻译过来就是:

绝对定位的元素是不参与flex布局的。

尽管文档规定如此,但我们在高版本的机型里面,却能实现两者的配合使用。也许将来这种兼容差异就不存在了,flex容器里面也可以有绝对定位元素了。

三、替代方案

问题原因是找到了,但还是得解决实际问题。

目前个人的需求是:绝对定位元素要实现水平居中,但又无法提前知道该元素的宽度。

最后在小伙伴的帮助下,找到了一种margin:auto的解决方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.div2{
        position:absolute;
        left: 0;
        right: 0;
        top: 0;
        bottom: 0;
        margin:auto;
    }

该方法的兼容性还没有具体测试,但目前来讲,能适配手头上的所有机型(包括iphone5)。

参考文献:

flex布局中的绝对定位:嗯,完美。还给出了w3.org的技术文档说明。

在flex布局中,不要使用绝对定位(fixed、absolute):一篇只说明现象,不给出具体原因分析的,同病相怜的家伙。

实现绝对定位元素水平垂直居中的两种方法:完美啊~给出了一个很漂亮的margin:auto方案啊!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
canvas 系列学习笔记三《样式和颜色》
通过上下文可以设置strokeStyle (线条颜色) 和 fillStyle (填充颜色)。 设置完之后画线和填充就是设置的颜色。
星宇大前端
2022/09/28
5750
canvas 系列学习笔记三《样式和颜色》
canvas的api小结
HTML   <canvas id="canvas"></canvas> Javascript   var canvas=document.getElementById('canvas');   canvas.width   canvas.height   var context=canvas.getContext("2d")   //使用context进行绘制   //画图线   moveTo(x,y);   lineTo(x,y);   beginPath();   closePath();   //状
玩蛇的胖纸
2018/06/08
5770
Canvas高级
1.基本语法 <script> var can = document.getElementById("can"), context = can.getContext("2d"); can.width = 600; can.height =800; can.style.border = "1px solid red"; /*cancas是基于状态的绘制的,而不是对某一个线条或者框框设置,是对整个环境的定义*/ /*意思就是说设
天天_哥
2018/09/29
9340
canvas学习笔记(七)—-裁切路径
clip()将当前的路径转换为裁剪路径 只能用一次,后续再用,不起作用 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>day5-1</title>
Java架构师必看
2021/08/19
5520
❤️创意网页:打造炫酷网页 - 旋转彩虹背景中的星星动画
在这个技术博客中,我们将学习如何使用HTML5 Canvas和JavaScript创建一个炫酷的网页效果。我们将打造一个动态的旋转彩虹背景,并在其中添加一个可爱的旋转星星动画。通过本博客,您将了解如何使用Canvas绘制彩虹渐变背景和绘制旋转的星星,以及如何通过动画实现星星的旋转效果。
命运之光
2024/03/20
1950
❤️创意网页:打造炫酷网页 - 旋转彩虹背景中的星星动画
我希望按照我的思路尽可能将canvas基础讲明白
写在前面 canvas很多人写过,我之前的博客里面也写过关于canvas的教程,但是后面我觉得其实不太好,因为很多东西都是很模糊的,没有非常直观清晰的将canvas讲解明白,究其原因,还是这个属性使用的不够多,导致很多属性不够熟练,但是我希望这篇文章可以将这个属性彻底的讲明白,毕竟只是一个标签而已,怎么讲都不会太复杂,他之所以不太好学原因就在于他自带的方法太多,加上很多的效果都是需要方法之间的相互配合使用,所以难度和复杂度就直接升高了很多,它不像html的其他标签一样,比如p、span等都只是自带了一些样
何处锦绣不灰堆
2022/05/31
3550
我希望按照我的思路尽可能将canvas基础讲明白
第155天:canvas(二)
​ 这个属性影响到 canvas 里所有图形的透明度,有效的值范围是 0.0 (完全透明)到 1.0(完全不透明),默认是 1.0。
半指温柔乐
2018/09/11
4870
第155天:canvas(二)
06. Web大前端时代之:HTML5+CSS3入门系列~HTML5 画布(下)
矩 阵 变 化 其实像 translate(移动),scale(缩放),rotate(旋转)都是特殊的矩阵变换 transform(m11,m12,m21,m22,dx,dy) 替换当前的变换矩阵(transform() 允许您缩放、旋转、移动并倾斜当前的环境) http://www.w3school.com.cn/tags/canvas_transform.asp 参数图解 本质公式 参数详解 水平缩放绘图 m11 水平倾斜绘图 m12 垂直倾斜绘图 m21 垂直缩放绘图 m22 水平移动绘图 dx 垂直
逸鹏
2018/04/09
1.4K0
Canvas
1.基本使用方法 <canvas id="demo">对不起,您的浏览器不支持canvas</canvas> <!--牢记,canvas不要再CSS里面设置宽高--> //-------------------------------------- <script type="text/javascript"> /*第一步,获取canvas标签*/ var can = document.getElementById("demo"); can.style.border = '1p
天天_哥
2018/09/29
1.2K0
Canvas
http://www.w3c.org/TR/2dcontext/ https://html.spec.whatwg.org/
jinghong
2020/05/09
13.1K0
Canvas
H5和微信小游戏 Canvas API 整理前言
这段时间闲下来,系统学习了微信小程序和微信小游戏,发现还是挺有意思的。现在微信小游戏的开发都离不开游戏引擎,用原生小游戏开发工具开发的很少很少。但是毕竟我不是专业游戏开发,所有游戏引擎就不搞了,我们就单纯来看原生微信小游戏开发。
大公爵
2018/10/10
2.9K0
H5和微信小游戏 Canvas API 整理前言
canvas详细教程! ( 近1万字吐血总结)
今天为大家带来的是我已经写了很久了的canvas详细教程,按照文章的案例一个一个敲下来保证你可以学会绘制很多图案和动画,对入门canvas很有帮助!
用户9999906
2022/12/22
3.8K0
H5-使用canvas绘制
canvas标签用于绘制图画,它是通过js来实现图画的绘制,这里将学习一下其基本用法。 首先,创建一个画布,这样我们就可以在上面进行创作了。
kdyonly
2023/03/03
9060
canvas知识点
HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成. <canvas> 标签只是图形容器,您必须使用脚本来绘制图形。 你可以通过多种方法使用Canva绘制路径,盒、圆、字符以及添加图像。
HUC思梦
2020/09/03
8610
canvas的api的学习(一)
Canvas是 HTML5 新增的,一个可以使用脚本(通常为JavaScript)在其中绘制图像的 HTML 元素。它可以用来制作
前端老鸟
2019/07/31
4110
HTML5特性&&canvas
1.HTML5是由W3C(万维网联盟,专注于XHTML 2.0)和WHATWG(专注于web表单和应用程序)共同合作的结果,2014年10月完成标准制定! 主要设计目的:为了在移动设备上支持多媒体。 2.HTML5新特性:(区分HTML) 绘画canvas; 用于媒介回放的video和audio元素; 本地离线缓存localStorage长期缓存数据,浏览器关闭后数据不丢失;sessionStorage的数据浏览器关闭后自动删除; 语义化更好的元素,如:header,nav,article,section,
用户1149564
2018/01/11
9630
HTML5特性&&canvas
canvas绘制折线路径动画
要实现以上路径动画,一般可以使用svg的动画功能。或者使用canvas绘制,结合路径数学计算来实现。
用户3158888
2022/03/22
1.6K0
canvas绘制折线路径动画
Canvas
注意canvas 的 width 和 height 不要用 css 来设定,如果用 css 样式来设置,会变形和失真
小丞同学
2021/08/16
1.2K0
HTML5(五)——Canvas API
Canvas API(画布)提供了一个通过 javascript 和 html 的 canvas 元素来在网页上实时绘制图形的方式。可用于动画、游戏、图标、图片编辑等多个方面。
呆呆
2021/09/29
6350
熬夜总结了 “HTML5画布” 的知识点(共10条)
(xStart,yStart)是线段的起点,(xEnd,yEnd)是线段终点。起点到终点之间的颜色呈渐变。
小灰
2020/08/02
7.1K0
相关推荐
canvas 系列学习笔记三《样式和颜色》
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验