需求


- 如图,在小程序全局设置固定
padding
的情况下,需要令scroll-view
(粉色背景块)占据整个屏幕宽度。
思路
思路一:单独设置padding
- 取消全局设置的
padding
,每个模块自己单独设置padding
,这种方法很简单,但每个模块都要单独设置,就有点繁琐,并不推荐。
思路二:获取屏幕宽度,并将获取到的宽度给scroll-view
设置
- 因为这个屏幕宽度在同一个设备不会改变,所以可以在全局
app.js
用wx.getSystemInfoSync()
获取设备信息,这个信息中具有屏幕宽度、高度等信息,将宽度动态设置给组件,如下图是iPhone XR
的设备信息:

思路三:使用视口单位vw
- 视口代表当前可见的计算机图形区域。在
Web
浏览器术语中,通常与浏览器窗口相同。
- 视口的大小取决于屏幕的大小,而
1
视口宽度(1vw
)等于视口宽度的1%
,它不同于百分比的地方是,它的宽度是依赖于视口的宽度的,而百分比是元素的祖先元素来决定的。
- 其他的视口单位还有:
vh
、vmin
、vmax
vh
:视口高度的1/100
vmin
:视区宽度或高度较小值的1/100
vmax
:视区宽度或高度较大值的1/100
实现
思路二实现:
- 在
app.js
中
- 设置全局数据
globalData
- 利用
wx.getSystemInfoSync()
获取设备信息,并给globalData
中的数据赋值screenWidth
、screenHeight
App({
// 应用程序启动时
onLaunch() {
// 获取设备信息
const info = wx.getSystemInfoSync();
// info中有screenWidth
this.globalData.screenWidth = info.screenWidth;
this.globalData.screenHeight = info.screenHeight;
},
globalData: {
screenWidth: 0,
screenHeight: 0,
},
});
- 在组件中
- 可以根据
getApp()
来获取全局的数据,const app = getApp()
- 再给
data
中的数据进行赋值
// 获取app.js中的数据
const app = getApp();
Component({
data: {
screenWidth: app.globalData.screenWidth,
},
});
<scroll-view scroll-x class="menu-list" style="width: {{screenWidth}}px;">
<block wx:for="{{6}}" wx:key="*this">
<view class="menu-item"></view>
</block>
</scroll-view>
- 因为在
.menu-item
中每个都设置了margin-left: 20rpx
,所以,需要使用相对定位向左偏移20rpx
,不然最左边的一开始便会和左边相差20rpx
,这个20rpx
是全局设置的padding
的大小,

- 由于下图,还需要拿到最后一个元素给它设置
margin-right: 20rpx;

.menu-list {
white-space: nowrap;
position: relative;
left: -20rpx;
}
.menu-item {
display: inline-block;
// 根据顶部对齐
vertical-align: top;
width: 220rpx;
height: 220rpx;
background-color: pink;
margin-left: 20rpx;
}
.menu-item:last-of-type {
margin-right: 20rpx;
}
思路三实现:
- 在思路二实现的
css
的.menu-list
中加上width: 100vw;
,这样,宽度就是屏幕宽度
- 再将
wxml
中的style="width: {{screenWidth}}px;"
去掉即可