• rax学习(三):实现微信消息长列表(LongList)之样式还原


    仓库地址:rax-longlist

    简单介绍一下

    本次示例选择微信消息列表,旨在实现移动端的无限滚动。为了增加趣味性,来恶搞微信消息吧!!!本节来还原一下微信消息的静态页面,下一节实现功能。

    需求

    • 高度还原微信消息列表页面
    • 群组消息、公众号消息、好友消息、微信运动消息、文件传输助手消息展示
    • 本地引静态资源,如图片
    • 头部标题和底部导航不动,中间列表自适应高度,超出滚动

    解决方案

    图片等静态资源放在src下的public目录中,启动之后要先npm run build构建一下
    顶部和底部固定,中间滚动可使用flex + calc来解决
    水平垂直居中,可以用flex的justify-content和align-items,设置为center即可
    没有素材怎么办?没有切图怎么办?没有设计稿怎么办?答案是使用微信截图,既可以查看颜色又可以截取图片。。。

    关键代码展示

    • 目录结构

    • LongList/index.jsx
    import {createElement} from 'rax';
    import View from 'rax-view';
    import Text from 'rax-text';
    import Image from 'rax-image';
    import ScrollView from 'rax-scrollview'
    import mock from './mock'
    import './index.css'
    export default ()=>{
    
      return <View className='wrapper'>
        <View className='message'>
          <Text className='message-text'>微信</Text>
          <Image className='more' source={{uri:'../../public/images/more.jpg'}}/>
        </View>
        <ScrollView className='list-wrapper'>
            {/* 搜索框 */}
            <View className='search-wrapper'>
              <View className='search'>
                <Image className='search-img' source={{uri:'../../public/images/search.png'}} />
                <Text className='search-text'>搜索</Text>
              </View>
            </View>
            {/* 消息列表 */}
              {mock.list.map(item=>(
                <View className='list-item' key={item.id}>
                  <View className='avatar'>
                    <Image className='avatar-img' source={{uri:item.image}}/>
                  </View>
                  <View className='info'>
                    <View className='info-msg'>
                      <Text className='info-msg-label'>{item.label}</Text>
                      <Text className='info-msg-value'>{item.value}</Text>
                    </View>
                    <View className='info-time'>
                      <Text className='info-time-label'>{item.time}</Text>
                    </View>
                  </View>
                </View>
              ))}
        </ScrollView>
    
        {/* 底部导航 */}
        <View className='nav-wrapper'>
            {
              mock.nav.map(item=>(
              <View className='nav' key={item.id}>
                <Image className='nav-img' source={{uri:item.image}}></Image>
                <Text className='nav-text' style={{color:item.active?'#56ba6a':'#000000'}}>{item.name}</Text>
              </View>
              ))
            }
        </View>
      </View>
    }
    
    
    • LongList/index.css
    .wrapper{
      display:flex;
      height:100%;
    }
    
    .message{
      100%;
      height:3rem;
      background-color:#f2f2f2;
      display:flex;
      justify-content: center;
      align-items: center;
      z-index:999;
    }
    .message-text{
      font-weight: bolder;
    }
    .more{
      1.5rem;
      height:1.5rem;
      position: absolute;
      right:1rem;
    }
    .search-wrapper{
      100%;
      background-color:#f2f2f2;
      display:flex;
      flex-direction: row;
      justify-content: center;
      padding:0.5rem 0.2rem;
    }
    .search{
      96%;
      padding-top:0.3rem;
      padding-bottom:0.3rem;
      background-color:#fff;
      border-radius:1px;
      display:flex;
      flex-direction: row;
      justify-content: center;
      align-items: center;
    }
    .search-img{
      1.2rem;
      height:1.2rem;
    }
    .search-text{
      color:#ccc;
      margin-left:0.5rem;
    }
    .list-wrapper{
      flex:1;
      100%;
      height:calc(100% - 10rem);
      background-color:#fff;
    }
    .list-item{
      display:flex;
      flex-direction: row;
      height:5rem;
    }
    
    .avatar{
      5rem;
      height:5rem;
      display:flex;
      flex-direction: row;
      justify-content: center;
      align-items: center;
    }
    
    .avatar-img{
      3.5rem;
      height:3.5rem;
      border-radius:0.2rem;
    }
    
    .info{
      border-bottom:0.01rem solid #f2f2f2;
      display:flex;
      flex-direction: row;
      justify-content: space-between;
      align-items: center;
      18.5rem;
    }
    .info-msg{
      height: 3.5rem;
      display: flex;
      justify-content: space-around;
    }
    .info-msg-label{
      font-size:1.2rem;
    }
    
    .info-msg-value{
      14rem;
      overflow:hidden;
    	text-overflow:ellipsis;
    	white-space:nowrap;
      font-size:1rem;
      color:#ccc;
    }
    
    .info-time{
      height:3.5rem;
      margin-right:1rem;
    }
    
    .info-time-label{
      color:#ccc;
      font-size:0.8rem
    }
    
    /* 底部导航 */
    .nav-wrapper{
      bottom:0rem;
      height:4rem;
      100%;
      background-color:#f8f8f8;
      color:#111;
      display:flex;
      flex-direction: row;
      justify-content: space-around;
      align-items: center;
    
    }
    .nav{
      display:flex;
      justify-content: center;
      align-items: center;
    }
    .nav-img{
      2rem;
      height:2rem;
    }
    .nav-text{
      font-size:0.7rem;
    }
    
    • Home/index.jsx
    import { createElement } from 'rax';
    import View from 'rax-view';
    import LongList from '../LongList';
    import './index.css';
    export default function Home() {
      return (
        <View className="home">
          <LongList />
        </View> 
      );
    }
    
    
    • Home/index.css
    
    html{
      100%;
      height:100%;
    }
    .home{
      background-color:#f2f2f2;
      100%;
      height:100%;
    }
    

    效果展示

    参考

  • 相关阅读:
    IE8"开发人员工具"使用详解下(浏览器模式、文本模式、JavaScript调试、探查器)
    SQL Server重新利用数据表的空间
    IE8“开发人员工具”使用详解上
    eclipse启动时提示"Failed to load the jni shared library"
    Python学习中遇到的问题(更新中...)
    “ORA12514: TNS: 监听程序当前无法识别连接描述符中请求的服务”问题的解决
    UVa 10881 Piotr's Ants
    (转)设计模式 经典书籍必备推荐
    eclipse的配置
    用python计算文件夹大小
  • 原文地址:https://www.cnblogs.com/xingguozhiming/p/13488212.html
Copyright © 2020-2023  润新知