搬砖小记:一个简单的加载中效果
这是一个使用绝对定位实现的完美居中。
今天下午没事,就去了波公司转转,顺便帮学长打打杂,修修BUG🤔。其中我的任务之一就是为抽奖页面做一个加载遮罩。
场景
横屏
在公司的项目中,有一个模仿王者荣耀的横屏抽奖页面。
这是一个采用 uniapp 混合开发的 APP,然鹅,似乎 uniapp 开发的 app 在进行横竖屏强制切换的时候,会出现 font-size 莫名奇妙变大的问题。
为了避免因为强制页面横屏造成的文字突然变大的问题,所以我们在抽奖页面载入时添加了定时器,在页面开始载入后 500 毫秒进行横屏的旋转。
onLoad: function() {
// 延时 500ms 进行旋转
setTimeout(() => {
plus.screen.lockOrientation('landscape-primary');
}, 500)
}
这样一番设置后,页面显示确实没有啥明显的问题,但是先显示竖屏,再转为横屏的效果让人看起来不是特别舒服。(大概是下面这样
遮罩
为了缓和页面载入后再旋转导致的奇怪显示效果,我决定在横屏载入前使用一个遮罩进行遮挡。这一步的优化非常简单,直接使用了 uView 中的 u-mask组件进行了遮挡:
<u-mask :show="maskShow" :custom-style="{background: '##191C3F'}">
<view style="width: 100%; height: 100%; display: flex; justify-content: center;align-items: center;">
<image style="width: 100rpx; height: 100rpx;" mode="aspectFit"></image>
</view>
</u-mask>
上面的代码中我使用了 u-mask 组件,并向组件中放置了插槽。插槽中的容器通过 flex 布局,实现了中间嵌入的 image 组件水平和垂直居中。
然后在页面载入时显示带有加载动图的遮罩,等待页面旋转完毕后,取消遮罩显示。
onLoad: function() {
setTimeout(() => {
plus.screen.lockOrientation('landscape-primary');
setTimeout(() => {
this.maskShow = false
}, 1000)
}, 500)
}
这种方法确实可以达到我想要的预期效果,可是在部分配置较低的手机上,就会出现旋转已经完成,但动图还没加载出来的情况。
优化
综合分析了一波,感觉可能是 flex 布局的渲染较慢的缘故,为了加快响应速度,于是这里就弃用 flex 布局采用了 absolute 绝对定位的方式,来使遮罩内容更快的进行加载。
<u-mask :show="maskShow" :custom-style="{background: '##191C3F'}">
<image style="position: absolute;left: 50%; top:50%;transform: translate(-50%,-50%); width: 100rpx; height 100rpx;" mode="aspectFit" src="/static/imgs/loading.gif">
</image>
</u-mask>
在这一步优化完成后,可以看到页面旋转的过程已经被遮罩和加载动画进行了遮挡,相比之前有着更好的用户体验。
思考
绝对定位的完美居中
我们都知道,使用 flex 布局可以很简单的实现一个完美的居中效果。(如果你还不会,可以看看我的上一篇文章 链接)。
那么使用 absolute/fixed 绝对定位是不是也能一样简单的做一个完美居中呢?答案是可以的。
栗子
这里我们先使用 html 建一个简单的 div。给 body 和 div 设置不同的背景颜色。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>fixed布局完美居中</title>
<style type="text/css">
body {
background-color: aqua;
}
body>div {
width: 300px;
height: 150px;
background-color: blueviolet;
}
</style>
</head>
<body>
<div></div>
</body>
</html>
现在,我们给 div 加上绝对定位布局,并且设置了 left:50%; top:50%
body>div {
width: 300px;
height: 150px;
background-color: blueviolet;
position: absolute;
left: 50%;
top: 50%;
}
咦?说好的居中呢?怎么跑到右下角去了?
其实,这里我们使用 left 和 top 属性,更改的是 div 左上角的位置,我们可以看到 div 盒子的左上角已经处于当前 body 的中间了。那么如何让我们的整个 div 居中呢?
其实很简单,我们只要让 div 向左上角偏移 1/2 自身的宽度就可以了。而 CSS 中,我们可以使用 transform 来进行位置偏移:
transform: translate(-50%,-50%);
加上这一行代码后,我们再刷新页面,可以看到 div 盒子已经使用绝对定位固定在页面中间了!
完整代码
是不是用绝对定位来写居中也很方便呢?在实际开发中,并不是说我们一定要使用较新的 flex 布局去取代传统的浮动定位或绝对定位,而是要根据项目的需要和实际运行效果来决定我们的布局方式。
篇幅限制,完整示例代码请公众号后台回复 ”绝对居中“ 来获取。
This blog is under a CC BY-NC-ND 4.0 Unported License
本文链接:https://coding.emptinessboy.com/2021/04/%E6%90%AC%E7%A0%96%E5%B0%8F%E8%AE%B0%EF%BC%9A%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E5%8A%A0%E8%BD%BD%E4%B8%AD%E6%95%88%E6%9E%9C/