微信小程序,学习笔记(二)样式(WXSS)及一个简单的小测试用例
2017-01-09 16:22
821 查看
微信小程序,学习笔记(二)样式(WXSS)及一个简单的小测试用例
WXSS(WeiXin Style Sheets)
这东西其实是微信自己的一种CSS语言,大部分都还是
CSS语法,也有自己的东西,主要针对微信自己的
WXML标记语言而生的,用来丰富其组件的显示效果。
WXSS相对
CSS并没有太大差别,只是需要注意以下几点
rpx像素单位,具体值是:
1rpx == 0.5px == 1物理像素,物理像素说的是硬件上表达的像素概念;
样式导入:在
WXSS文件中使用
@import test.wxss;方式导入,后面的分号不要省略;
样式使用方式:内联和行内,由于组件的
style属性接受动态参数形式去在运行时改变样式,因此建议:静态样式即不太会改变的样式不要使用行内
style形式,避免运行时重复渲染,而需要动态发生变化的采取行内方式,比如:
style="width:{{myWidth}};color:{{myColor}};",列表中的焦点行,获取到焦点时改变其宽度和字体颜色,就只要把这两个属性放到行内去运行时渲染。
例子: (预期达到的效果:点击表内行,背景框变亮,字体颜色变成白色)
<!--index.wxml--> <view id="ctl-list-date" class="ctl-list-date"> <view bindtap="tapDateRow" wx:for="{{dates}}" wx:key="unique" wx:for-index="idx" wx:for-item="date" id="ctl-list-{{idx}}" class="ctl-list-row" style="background:url({{rowStyle.bgImgUrl}}) no-repeat center;color:{{rowStyle.color}};">{{dates[index + idx].desc}}</view> </view>
页面图:
// index.js Page({ data: { rowStyle: { bgImgUrl: '../resources/images/dlist_bg.png', color: '#727374' } }, // 点击日期行 tapDateRow: function ( event ) { console.log( event ); // console.log( event.currentTarget ); // console.log( event.currentTarget == event.target ); var that = this; // 这里改变点击时行的样式 var rowStyle = { bgImgUrl: "../resources/images/dlist_bg_focus.png", color: '#FFFFFF' }; that.setData({rowStyle: rowStyle}); } });
点击行之后效果图:
从两图效果看,并不是想要的结果,点击行之后并不是当前行改变了,而是所有行都发生了变化,想想也是,
Page中的
data数据属性是全局的,而列表行又是通过
wx:for生成的多组件列表,属性所用的数据都是
data.rowStyle中的样式数据,当点击时数据发生变化,导致所有行都发生了变化。
但是
wxml又不允许直接操作组件,也没法获取到组件对象下,只能从数据入手。
测试用例
列表行单个刷新样式的解决方法(从数据入手)此方法可能比较笨拙,经测试可以达到预期效果,具体思路:
页面组件中,动态属性写法:(运用
{{flag ? sth : other}})动态改变属性值;
怎么让
flag在点击时能动态改变值呢,这个时候需要用到
wx:for创建组件时的索引
idx以及自定义属性了,即给每一行一个自定义属性,而这个属性的值就是当前组件的创建时的索引值,即:
data-index="{{idx}}",这样做之后,就可以在
index.js中通过
event.target.dataset.index方式去取到该值;
具体实现如下:
页面修改:
<!-- index.wxml --> <view bindtap="tapDateRow" wx:for="{{dates}}" wx:key="unique" wx:for-index="idx" wx:for-item="date" id="ctl-list-{{idx}}" class="ctl-list-row" data-index="{{idx}}" style="background:url({{rowFocusFlagArray[idx] == 1 ? rowFocusStyle.bgImgUrl : rowDftStyle.bgImgUrl}}) no-repeat center;color:{{rowFocusFlagArray[idx] == 1 ? rowFocusStyle.color : rowDftStyle.color}};">{{dates[index + idx].desc}}</view> </view>
脚本修改:(体现在数据和行为上)
Page({ data: { // 这个数组用来保存焦点行标记值,非焦点行均为 'undefined',焦点行为:1 rowFocusFlagArray: [], // 默认行样式 rowDftStyle: { bgImgUrl: '../resources/images/dlist_bg.png', color: '#727374' }, // 焦点行样式 rowFocusStyle: { bgImgUrl: '../resources/images/dlist_bg_focus.png', color: '#FFFFFF' } }, // 这里面初始化工作要搞一下 onLoad: function () { var that = this; var dates = util.getSevenDates(); that.setData({ dates: dates }); // 首先要清空下行标记值数组 var rowFocusFlagArray = []; // 默认第一行为焦点行 rowFocusFlagArray[0] = 1; that.setData({rowFocusFlagArray: rowFocusFlagArray}); }, // 点击日期行,主要点击事件逻辑就在这里面了 tapDateRow: function ( event ) { console.log( event ); // console.log( event.currentTarget ); // console.log( event.currentTarget == event.target ); var that = this; // 1. 更新前先清空焦点标识数组,防止上一个样式不还原 var rowFocusFlagArray = []; // 2. 根据 dataset 获取当前的索引,重点:必须要每行要加上个自定义数据:index var index = event.target.dataset.index; console.log( 'index = ' + index ); // 3. 然后重新设置标识值,这里拿到的 index 就是当前被点击的行的索引了 rowFocusFlagArray[index] = 1; // 4. 重新改变样式标识,刷新页面 that.setData({rowFocusFlagArray: rowFocusFlagArray}); } }
经过上面的修改,正式达到我们想要的效果(网上随便百度了个屏幕录制gif软件,发现还挺好用的 - -!)
用例说明
页面: 充分利用
wx:for的
index值,并且和自定义属性
dataset相结合,生成
data-index自定义属性,值等于
wx:for的
index值;
数据: 添加两个样式对象和一个行标记值数组(
rowDftStyle,
rowFocusStyle,
rowFocusFlagArray),三者关系为:通过判断
rowFocusFlagArray中对应行的标识值来决定采用
rowDftStyle还是
rowFocusStyle去作为当前行的样式;
行为: 先清空数据防止上一焦点行不还原,然后根据
dataset获取当前行索引,再根据索引去设置
rowFocusFlagArray值,最后通过自动刷新机制去改变样式;
总结
这篇本来根据
W3CSchool分类是要和组件,和
WeUI.js框架放一起,最后弄着弄着搞了点小例子,后面也看了下组件和
WeUI.js框架东西还是挺多的,决定分开放到下一次再去学习了,放一起怕消化不掉;
本篇主要简单记录了
WXSS自己的一点东西,应该不止像素和样式问题,后续再慢慢积累,主要是后面的动态改变焦点例子的实现,这个也算是承上启下吧,连接上一篇学习的内容,做了个小小的测试练习,复习下上一篇内容,加深下印象;
这个小测试用例目的主要有关:焦点动态改变问题,由于不能直接操作页面组件,因此只能从数据和行为方面去做处理,还好想到了个方法,感觉这个比较笨拙,不知道还有没有更方便的方法来实现。
完整
demo代码地址:https://github.com/gcclll 路径:
JavaScript-Codes/demos/WeChat/TvodPlayList/
相关文章推荐
- duilib学习笔记01:一个简单的Duilib程序的基本框架
- Directshow学习笔记五-----一个简单的视频播放程序(个人学习总结,仅供参考)
- 网络编程学习笔记二(实现一个基于简单TCP的用户注册程序)
- 【opencv学习笔记五】一个简单程序:图像读取与显示
- 【UNP学习笔记】一个简单的服务器/客户端程序
- OpenCV 2 学习笔记(3): 一个简单的opencv程序:在Console上显示图像
- jmeter学习_2(创建一个测试用例的简单流程)
- linux0.11学习笔记-技术铺垫-简单AB任务切换程序(1)-实现一个简单的bootloader
- 黑马程序员--学习笔记--一个WinForm简单加法练习程序
- J2EE学习笔记二:配置一个简单的J2EE测试环境
- zeromq学习笔记2——简单的客户端和服务端测试程序
- 微信小程序学习笔记(8)--------样式基础
- 【Rebol 学习笔记】第一篇:编写一个简单的 CGI 程序
- ACE学习笔记 ----- 一个简单的网页链接提取程序
- python学习笔记:"爬虫+有道词典"实现一个简单的英译汉程序
- JVM学习笔记——一个简单程序编译成字节码指令后的解释
- C++: wxWidgets (3) 一个简单的wxWidgets程序(学习笔记)
- 基于node的websocket学习笔记二:一个简单的聊天室程序与优化方案
- Servlet学习笔记_03_使用servlet编写一个简单的helloworld程序
- 32位汇编语言学习笔记(28)--一个简单的光标控制程序