评论

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

关于边偏移和五种定位方式的知识点总结

前言

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,取值越大,定位元素在层叠次序中就越优先;如果取值相同,则以后渲染的优先。

总结

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

最后一次编辑于  2021-11-10  
点赞 20
收藏
评论

9 个评论

  • 知非
    知非
    2021-11-10

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

    2021-11-10
    赞同 3
    回复 2
    • 不平
      不平
      发表于小程序端
      2021-11-10

      谢谢~

      2021-11-10
      2
      回复
    • 知非
      知非
      2021-11-11回复不平
      不客气,一起学习进步啦!
      2021-11-11
      1
      回复
  • Smooth
    Smooth
    2021-11-13

    总结得很详细

    2021-11-13
    赞同 2
    回复
  • 没事
    没事
    2021-11-11

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

    2021-11-11
    赞同 2
    回复
  • 谋谋谋
    谋谋谋
    2021-11-11

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

    2021-11-11
    赞同 1
    回复
  • 吴洲航
    吴洲航
    发表于移动端
    2021-11-10
    很有收获,赞
    2021-11-10
    赞同 1
    回复 1
    • 不平
      不平
      发表于小程序端
      2021-11-10

      😄

      2021-11-10
      1
      回复
  • 黎伤℡
    黎伤℡
    2022-05-01

    如何在一张背景图为地图 在特殊的地点城市设置按钮 能让真机测试时不会出现 布局错乱的现象

    2022-05-01
    赞同
    回复 1
    • Hezit
      Hezit
      2022-12-28
      试试看把图片作为一个view的背景,然后让各个城市按钮在这个view中以百分比的方式定位,而且城市按钮都设置为absolute布局?
      我没试过,但是应该可以?
      2022-12-28
      回复
  • FWAN
    FWAN
    2022-02-23
    .inputBox{
      display: flex;
      flex-direction: row;
      height:88rpx;
      border5rpx solid #e6e6e6;
      border-radius8%;
      justify-content: space-between;
      align-items: center;
      margin10% 3% 10% 3%;
      position: sticky;
      top10%;
    }
    你好,我在设置position后,页面滑动穿过inputBox,会透过inputBox看到滑动后的内容,请教下怎么能遮住,滑动过程中没有这种穿透效果。
    
    2022-02-23
    赞同
    回复 1
    • 不平
      不平
      2022-02-25
      修改一下透明度,就可以让inputBox遮住后面的内容了
      2022-02-25
      回复
  • 立食荞麦面我能坐着吃吗
    立食荞麦面我能坐着吃吗
    2022-02-10

    学到了学到了,谢谢大佬分享

    2022-02-10
    赞同
    回复
  • PD
    PD
    发表于移动端
    2021-11-17
    最近也正好遇到这些问题,谢谢大佬分享
    2021-11-17
    赞同
    回复
登录 后发表内容