【笔记】WXSS中定位属性position的使用总结
发布于 2 年前 作者 bwan 636 次浏览 来自 分享

前言

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 回复

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

很有收获,赞

总结得很详细

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

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

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

回到顶部