【笔记】WXSS中定位属性position的使用总结

发布于 4 年前作者 bwan1020 次浏览最后编辑 4 年前来自 share

前言

WXSS (WeiXin Style Sheets)是微信开发的样式语言,用于描述 WXML 的组件样式,它具有CSS 的大部分特性。关于在定位时常用到的属性position,文档中没有对应的描述,所以我自己总结了position的一些基础知识点。

定位

定位的目的是为了更好控制和摆放box,从而实现需要的网页布局。与flex布局的容器、坐标轴等概念不同,定位布局可以轻松任意指定box的摆放位置,定位的属性分为两种,一是边的偏移,二是定位的方式。

边偏移

边偏移有四个属性,分别是top,left,right和bottom,对应于基于顶部,左边,右边和底部的偏移。注意,如果position是默认值,也就是静态定位static时,指定边偏移是无效的行为。例如下面的代码,对于static-view类选择器,我们没有指定position的值,因此position设为默认值static,此时指定属性left是无效的行为:

/*  index.wxss */
.static-view{
  height: 100px;
  width: 100px;
  background-color:red;
  left:50px;
  /* position: static; */
}

显示效果如下,红色正方形仍然贴着屏幕左端:

定位方式

定位的方式即position的值,常用的有五种,分别是静态定位static(默认值), 相对定位relative, 绝对定位absolute, 固定定位fixed和粘性定位sticky。接下来分别介绍一下各种定位方式的区别。

静态定位 static

静态定位是所有元素的默认定位方式,当你没有为元素指定position的值时,默认值就是static,举个例子,在.wxml中渲染三个不同颜色的view,它们的position都为默认的static:

<!-- index.wxml -->
<view class='view-red'></view>
<view class='view-blue'></view>
<view class='view-green'></view>

/* index.wxss */
.view-red{
  height: 100px;
  width: 100px;
  background-color:red;
  /* position: static; */
}

显示效果如下,三个view按照标准流的方式排列:

注意,在静态定位状态下,无法通过边偏移属性(top、bottom、left或right)来改变元素的位置。

相对定位 relative

相对定位是将元素相对于它的正常位置进行定位的,所谓的正常位置就是position为static时元素在标准文档流中的位置。相对定位的position值为relative,我们修改刚刚红色正方形的position为relative,并设置left为50px:

/* index.wxss */
.view-red{
  height: 100px;
  width: 100px;
  background-color:red;
  left: 50px;
  position: relative; 
}

显示效果如下,可以看到红色正方形相对于刚刚的位置向右偏移了50px:

绝对定位 absolute

绝对定位比较特殊,因为它脱离了标准文档流,以其父容器或父容器中最近的非static(其他四种定位方式)元素的位置为参考。如果没有找到这样的非static元素,就以page作为参考。绝对定位的position值为absolute,我们修改蓝色正方形的position为absolute,并设置left为100px,top为100px;:

/* index.wxss */
.view-blue{
  height: 100px;
  width: 100px;
  background-color:blue;
  left:100px;
  top:100px;
  position: absolute;
}

显示效果如下,由于没有非static的父容器,view-blue以page为参考位置,left和top指定了它的偏移。还可以看到,绿色正方形在原来的位置向上移动了,原因是蓝色正方形使用了绝对定位,脱离了标准文档流,就为绿色正方形“腾出”了它原来的位置。

我们换个例子,让红色正方形作为蓝色正方形的父容器,代码如下:

<!-- index.wxml -->
<view class='view-red'>
    <view class='view-blue'></view>
</view>

/* index.wxss */
.view-red{
  height: 300px;
  width: 300px;
  background-color:red;
  left: 50px;
  position: relative; 
}
.view-blue{
  height: 100px;
  width: 100px;
  background-color:blue;
  left:200px;
  top:100px;
  position: absolute;
}

显示效果如下,可以看出此时蓝色正方形以红色正方形的位置作为参考:

固定定位 fixed

固定定位也脱离了标准文档流,可以把它理解为以page为参考的绝对定位,固定定位的position值为fixed,我们常常会在顶部或底部导航栏中使用固定定位。以自定义tabBar组件为例:

.tab-bar {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  height: 48px;
  background: white;
  display: flex;
  padding-bottom: env(safe-area-inset-bottom);
}

显示效果如下,无论如何滚动,tabBar都会固定在屏幕底部。

关于自定义tabbar组件,可以查看该代码片段:自定义tabBar组件

粘性定位 sticky

粘性定位的元素依赖于用户的滚动,在相对定位和固定定位之间切换。一般情况下,sticky等同于relative,当页面滚动超出目标区域时,它便切换为fixed,固定在目标位置。目标位置通过指定top, left, right和bottom来设置。修改代码如下:

<!-- index.wxml -->
<view style="height:100px"></view>
<view class='view-blue'></view>
<view class='view-green'></view>
<view style="height: 3000px;"></view>

/* index.wxss */
.view-blue{
  height: 100px;
  width: 100px;
  background-color:blue;
  position: relative;
}
.view-green{
  height: 100px;
  width: 100px;
  background-color:green;
  position: sticky; 
  top:0px;
}

显示如下,此时绿色正方形是相对定位,在标准文档流中:

下拉滚动条100px,可以看出绿色正方形仍为相对定位:

继续下拉滚动条,可以发现蓝色正方形消失,但绿色正方形一直处于屏幕顶端,此时已经切换为固定定位:

覆盖问题

在开发中,我们常常使用子元素绝对定位,父元素相对定位的方法来控制布局,但是仍会遇到不同元素的覆盖现象,可以通过设置属性z-index来解决。z-index的默认值是0,取值越大,定位元素在层叠次序中就越优先;如果取值相同,则以后渲染的优先。

总结

定位布局是各自布局方法中较为简单的一种,它的属性一是边偏移,二是定位方式,两者配合使用才可以构造出美观的布局。

6 回复
jingfan
jingfan1 楼4 年前

不像我,我都是无脑grid,让他自己排

yuqiang
yuqiang2 楼4 年前

很有收获,赞

osun
osun3 楼4 年前

总结得很详细

umeng
umeng4 楼4 年前

社区大佬真多 我算是学到了

caojuan
caojuan5 楼4 年前

写的很不错,学会了很多以前不知道的。

bfu
bfu6 楼2 个月前

最近也正好遇到这些问题,谢谢大佬分享