我写小程序像菜虚鲲——3、你能17张牌把我秒杀,我当场把电脑屏幕吃掉(下)

简介: 本节来肝下「微信小程序中布局」相关姿势点。希望你学完本章后,可以:根据设计师给的设计稿,堆砌控件。

0x8、浮动与清除浮动


使元素脱离文档流,按照指定方向(左或右)移动直到外边缘碰到包含框或另一个浮动框的边框为止。浮动前竖向排列,浮动后横向排列;float属性,可选值left左,right右。写个例子体验下,复用上面的wxml,然后设置新的样式:


/* test.wxss */
view > view {
  line-height: 100rpx;
  width: 140rpx;
  text-align: center;
}
.view-1 {
  background: greenyellow;
}
.view-2 {
  background: blueviolet;
}
.view-3 {
  background: orange;
}
.view-4 {
  background: pink;
}


运行效果如下



接着为元素1设置一个向右的浮动 float:right; 运行结果如下:



如图,元素1脱离了文档流(所占空间被删除),然后浮动到右侧了,如果想调整元素1的位置,可以设置margin,比如这里设置margin-right:20rpx;



接着我们如果为元素2也设置一个向右的浮动:



按顺序排到了右侧,之所以没有像元素1一样贴着右边而是在元素1的左侧,因为碰到元素1浮动框了。接着为元素4页设置一个右浮动:



另外有一种情形要注意一下,把样式文件修改为:


/**index.wxss**/
view > view {
  line-height: 100rpx;
  width: 240rpx;
  float: left;
  text-align: center;
}
.view-1 {
  background: greenyellow;
  height: 140rpx;
}
.view-2 {
  background: blueviolet;
}
.view-3 {
  background: orange;
}
.view-4 {
  background: pink;
}


包含框太窄,无法容纳水平排列的三个浮动元素,那么其它浮动块向下移动,直到有足够的空间。如果浮动元素的高度不同,那么当它们向下移动时可能被其它浮动元素“卡住”.



接着说下「清除浮动」,示例代码如下:


<!-- test.wxml -->
<view class="view-wrapper">
  <view class="view-1">元素1</view>
  <view class="view-2">元素2</view>
</view>


/* test.wxss */
page {
  background: gray;
}
.view-wrapper {
  width: 75%;
  background: gold;
  padding: 10rpx;
}
view > view {
  width: 240rpx;
  text-align: center;
}
.view-1 {
  background: greenyellow;
}
.view-2 {
  background: blueviolet;
}
.view-3 {
  background: orange;
}
.view-4 {
  background: pink;
}


运行结果如下



接着为两个元素分别设置左和右的浮动,运行结果如下:



浮动带来的影响,可以为通过设置属性overflow: hidden; 来清除浮动。



除此之外还可以添加一个组件,然后设置clear:both实现相同的效果。


<view style="clear:both"/>


还有一种玩法:通过伪元素:after直接添加


.view-2:after {
  content: "";
  display: block;
  clear: both;
}


当然,你也可以直接写死容器元素的高度~


0x9、多列布局multi-column


CSS3新增了一个多栏布局,用来实现「文本多列」和「瀑布流」非常方便,就顺带讲下吧~


相关属性如下


  • column-rule-style:列与列间的边框样式;


  • column-rule-width:两列的边框厚度;


  • column-rule-color:两列的边框颜色;


  • column-rule:上述所有属性的简写,示例: column-rule: 1px solid lightblue;


  • column-count:创建多列,指定需要分割的列数;


  • column-width:列的宽度;


  • columns:column-width 和 column-count 的简写。


  • column-gap:列与列间的间隙;


  • column-span:是否跨多栏显示;


  • column-fill:指定如何填充列;


文本多列的代码示例如下


<!-- test.wxml -->
<view class="view-wrapper">
  <view class="view-1">大家好,我是练习时长两年半的个人练习生菜虚鲲,我喜欢唱,跳,rap,篮球,Music!</view>
</view>


/* test.wxss */
.view-1 {
  columns:auto 5;
  column-rule: 5rpx solid lightblue;
}


运行结果如下



实现一个简易图片瀑布流示例如下


//test.js,新增一堆图片URL
Page({
  data: {
    pics: [
      "http://img4.imgtn.bdimg.com/it/u=529905932,1803087578&fm=26&gp=0.jpg",
      "http://img5.imgtn.bdimg.com/it/u=823139735,3514716232&fm=26&gp=0.jpg",
      "http://img4.imgtn.bdimg.com/it/u=529905932,1803087578&fm=26&gp=0.jpg",
      "http://img5.imgtn.bdimg.com/it/u=2958310391,871610286&fm=26&gp=0.jpg",
      "http://img5.imgtn.bdimg.com/it/u=2958310391,871610286&fm=26&gp=0.jpg",
      "http://img5.imgtn.bdimg.com/it/u=2958310391,871610286&fm=26&gp=0.jpg",
      "http://img2.imgtn.bdimg.com/it/u=3924656228,1474918552&fm=26&gp=0.jpg",
      "http://img4.imgtn.bdimg.com/it/u=529905932,1803087578&fm=26&gp=0.jpg",
      "http://img2.imgtn.bdimg.com/it/u=3924656228,1474918552&fm=26&gp=0.jpg",
      "http://img5.imgtn.bdimg.com/it/u=823139735,3514716232&fm=26&gp=0.jpg",
      "http://img5.imgtn.bdimg.com/it/u=2958310391,871610286&fm=26&gp=0.jpg",
      "http://img5.imgtn.bdimg.com/it/u=2958310391,871610286&fm=26&gp=0.jpg",
      "http://img5.imgtn.bdimg.com/it/u=823139735,3514716232&fm=26&gp=0.jpg",
      "http://img2.imgtn.bdimg.com/it/u=3924656228,1474918552&fm=26&gp=0.jpg",
      "http://img5.imgtn.bdimg.com/it/u=823139735,3514716232&fm=26&gp=0.jpg",
      "http://img4.imgtn.bdimg.com/it/u=529905932,1803087578&fm=26&gp=0.jpg",
      "http://img2.imgtn.bdimg.com/it/u=3924656228,1474918552&fm=26&gp=0.jpg",
    ]
  },
})


<!-- test.wxml,利用wx:for生成控件 -->
<view class="content">
  <block wx:for="{{pics}}">
    <image src="{{item}}" mode="widthFix"></image>
  </block>
</view>


/* test.wxss */
page {
  background: gray;
}
.content {
  columns: auto 3;
  width: 100%;
  column-gap: 5rpx;
}
image {
  width: 100%;
  display: block;
  box-sizing: border-box;
  padding: 5rpx;
}


运行结果如下



瀑布流是实现了,但是左下角的蕾姆酱被切成两半了,如果不想切断,可以为子元素设置「break-inside」属性来防止多列布局,分页媒体和多区域上下文中的意外中断。直接在image的样式里添加:


break-inside: avoid;


运行后结果如下



0x10、flex弹性布局


学习完前面的内容,我们可以通过display,position,float来布局,但是灵活性较差。2009年,w3c提出了一种新的布局方案:flex弹性布局,可以简便、完整、响应式地实现多种页面布局。任何元素都可以开启弹性布局,采用Flex布局的元素,称为「Flex容器(flex container)」,它里面所有的子元素会自动成为容器成员,称为「Flex 项目(flex item)」。


留意下上面的「主轴」和「侧轴」,其实就是「水平」和「垂直」两个方向。


Flex的属性分为两个部分:「容器属性」和「项目属性」,具体如下图所示:



因为属性较多,限于偏于,也不一一展示具体效果了,Runoob上有对应的效果展示,读者请自行移步至:


www.runoob.com/cssref/css3…,查看学习:



最后再提下和flex有关的两点:


第一点


设置flex布局后,子元素的float,clear和vertical属性将失效!


第二点


行内元素也可以使用Flex布局,设置display:inline-flex;即可。


0x0、布局实战:写个抠腚优鲜的首页


Tips:因内容太多,实战部分拆分到另一篇中juejin.cn/post/684490…


小结


相信读者学完本节,基本可以应付日常小程序页面的堆砌了。这种实操性比较强的东西,切忌死记,建议自己找些小程序仿写下,熟能生巧,别说没有设计稿,没有图片没有尺寸,上节学的反编译技能呢???


笔者不是专业前端,以上内容都是现学现卖,如有纰漏或建议,欢迎评论区指出,谢谢~

源码整理下再丢Gayhub,后面再发个地址哈~


参考文献:







相关文章
|
24天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp微信小程序的阳光电脑公司的维修服务的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的阳光电脑公司的维修服务的详细设计和实现
15 0
|
26天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的电脑硬件库存管理系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的电脑硬件库存管理系统附带文章和源代码部署视频讲解等
13 0
|
26天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的电脑配件销售系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的电脑配件销售系统附带文章和源代码部署视频讲解等
11 0
|
小程序 网络协议
微信电脑版小程序最新抓包方案
微信电脑版小程序最新抓包方案
2743 0
|
小程序 IDE API
使用Python做一个切换电脑桌面壁纸的小程序
简介:免费的壁纸软件竟有许多广告,影响自己体验? 那就使用python自己制作一个小软件满足自己的需求!
使用Python做一个切换电脑桌面壁纸的小程序
|
小程序
我写小程序像菜虚鲲——3、你能17张牌把我秒杀,我当场把电脑屏幕吃掉(中)
本节来肝下「微信小程序中布局」相关姿势点。希望你学完本章后,可以:根据设计师给的设计稿,堆砌控件。
127 0
|
编解码 小程序 前端开发
我写小程序像菜虚鲲——3、你能17张牌把我秒杀,我当场把电脑屏幕吃掉(上)
本节来肝下「微信小程序中布局」相关姿势点。希望你学完本章后,可以:根据设计师给的设计稿,堆砌控件。
122 0