基于WEUI快速搭建新闻列表页实践

859 阅读4分钟

在移动开发领域,快速构建美观且功能丰富的用户界面是提升应用体验的关键。微信官方推出的WEUI库为此提供了强大的支持,它专为微信网页和小程序设计,旨在提供一致的视觉和交互体验。本文将深入探讨如何利用WEUI快速搭建一个响应式新闻列表页面,同时强调无障碍设计的重要性。

引言

WEUI是一套高质量的前端UI库,它遵循微信的设计规范,能够帮助开发者迅速实现与微信原生应用风格一致的界面效果。本文将以新闻列表页为例,从组件选择、代码实现、事件处理、以及无障碍设计等方面进行详细阐述。

这里是weui压缩版本的网址"cdn.bootcdn.net/ajax/libs/w…" 我们用link引入该css样式

组件选择与布局

新闻列表页通常包含导航栏(Tabbar/Navbar)、搜索栏(Searchbar)和新闻列表(List)三大核心组件。在WEUI中,这些组件都已封装好,只需通过相应的类名引入即可:

<!-- navbar -->
<!-- .weui-navbar>a.weui-navbar__item*3 -->
    <div class="weui-navbar">
        <a href="#" class="weui-navbar__item weui-bar__item_on">推荐</a>
        <a href="#" class="weui-navbar__item ">热点</a>
        <a href="#" class="weui-navbar__item ">娱乐</a>
    </div>
<!-- searchbar -->
     <div class="weui-search-bar" id="search_bar">
        <form class="weui-search-bar__form">
            <div class="weui-search-bar__box">
                <i class="weui-icon-search"></i>
                <input type="search" 
                placeholder="搜索" 
                id="search_input" 
                class="weui-search-bar__input">
                <a href="#" class="weui-icon-clear"></a>
            </div>
            <label id="search_text" for="search_input" class="weui-search-bar__label">
                <i class="weui-icon-search"></i>
                <span>搜索</span>
            </label>
        </form>
        <a href="#" class="weui-search-bar__cancel-btn">取消</a>
     </div>
  • 导航栏:使用.weui-navbar.weui-navbar__item定义,其中.weui-bar__item_on类标识当前激活的选项。
  • 搜索栏.weui-search-bar提供了搜索框、清除按钮和取消按钮的完整结构,通过JavaScript控制搜索状态的切换。

代码实现细节

  1. 资源引用:通过CDN引入weui.min.css,确保快速加载和跨平台兼容性。此操作不仅提升了HTTP传输效率,也方便开发阶段的源码阅读和调试。

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>weui 新闻列表</title>
        <link href="https://cdn.bootcdn.net/ajax/libs/weui/2.6.12/style/weui.min.css" rel="stylesheet">
    </head>
    
  2. 事件监听与作用域处理:在处理导航栏的Tab切换时,通过事件委托的方式在.weui-navbar__item上监听click事件,ES5中可以利用闭包解决循环中事件监听器的索引问题。ES6的let关键字在每次循环中创建独立的作用域,避免了变量覆盖的问题。

    es5:

    const tabs =document.querySelectorAll('.weui-navbar__item')
                      for (var i=0; i<tabs.length; i++){
                        (function(){
                            tabs[i].addEventListener('click', function(){
                                console.log(i)
                            })
                        })(i)
                    }
    

    es6

    const tabs =document.querySelectorAll('.weui-navbar__item')
                    for (let  i=0; i<tabs.length; i++){
                        tabs[i].addEventListener('click', function(){
                            console.log(i)
                        })        
                    }
    
  3. 优化内存:在处理导航栏的Tab切换时,可以通过事件委托的方式在.weui-navbar上监听click事件进行内存优化,减少内存的使用

    const navbar =document.querySelector('.weui-navbar')
    navbar.addEventListener('click', function(event){
                // console.log(event.target)
                const target = event.target
                if(target.nodeName == 'A'){
                    event.preventDefault();
                    if (target.classList.contains('weui-bar__item_on')) {    
                        return;
                    }
                    document
                        .querySelector('.weui-bar__item_on')
                        .classList
                        .remove('weui-bar__item_on')
                    target.classList.add('weui-bar__item_on')
                }
            });
    
  4. 无障碍设计:WEUI设计考虑到了无障碍浏览的需求,在搜索栏中,通过<label>元素的for属性与输入框的id关联,确保屏幕阅读器能够正确识别和读出输入框的功能,即使输入框被视觉上隐藏,也可通过添加特定类(如.weui-search-bar_focusing)使其对辅助技术可见。

    const searchInput =document.querySelector('#search_input')
            const searchBar = document.querySelector('.weui-search-bar')
            document
                .querySelector('.weui-search-bar__label')
                .addEventListener('click', function() {
                    searchBar.classList.add('weui-search-bar_focusing')
                })
            searchInput.addEventListener('focus', function(event) {
                console.log('聚焦了')
            })
    

页面展示

这里拉出我们的设计的页面来看看实际成果

下面这两张图体现的是导航栏的Tab切换时的样子

image.png

image.png"

下面这两张图体现的是无障碍浏览

image.png

image.png

全部代码展示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>weui 新闻列表</title>
    <link href="https://cdn.bootcdn.net/ajax/libs/weui/2.6.12/style/weui.min.css" rel="stylesheet">
</head>
<body>
    <!-- navbar -->
    <!-- .weui-navbar>a.weui-navbar__item*3 -->
    <div class="weui-navbar">
        <a href="#" class="weui-navbar__item ">推荐</a>
        <a href="#" class="weui-navbar__item weui-bar__item_on">热点</a>
        <a href="#" class="weui-navbar__item ">娱乐</a>
    </div>
    <!-- searchbar -->
    <!-- .weui-search-bar#search_bar -->
     <div class="weui-search-bar" id="search_bar">
        <form class="weui-search-bar__form">
            <div class="weui-search-bar__box">
                <i class="weui-icon-search"></i>
                <input type="search" placeholder="搜索" id="search_input" class="weui-search-bar__input">
                <a href="#" class="weui-icon-clear"></a>
            </div>
            <label id="search_text" for="search_input" class="weui-search-bar__label">
                <i class="weui-icon-search"></i>
                <span>搜索</span>
            </label>
        </form>
        <a href="#" class="weui-search-bar__cancel-btn">取消</a>
     </div>
    <!-- news-list -->
    <script>
        const tabs =document.querySelectorAll('.weui-navbar__item')
        const navbar =document.querySelector('.weui-navbar')
        const searchInput =document.querySelector('#search_input')
        const searchBar = document.querySelector('.weui-search-bar')

        document
            .querySelector('.weui-search-bar__label')
            .addEventListener('click', function() {
                searchBar.classList.add('weui-search-bar_focusing')
            })
        searchInput.addEventListener('focus', function(event) {
            console.log('聚焦了')
        })
        // 优化了内存

        navbar.addEventListener('click', function(event){
            // console.log(event.target)
            const target = event.target
            if(target.nodeName == 'A'){
                event.preventDefault();
                if (target.classList.contains('weui-bar__item_on')) {    
                    return;
                }
                document
                    .querySelector('.weui-bar__item_on')
                    .classList
                    .remove('weui-bar__item_on')
                target.classList.add('weui-bar__item_on')
            }
        });
        //同步代码
        // for (var i=0; i<tabs.length; i++){
        //     // 异步的代码   
        //     //   使用闭包
        //     (function(){
        //         tabs[i].addEventListener('click', function(){
        //              console.log(i)
        //         })
        //     })(i)
        // for (let i=0; i<tabs.length; i++){
        //     if( this.classList.contains('weui-bar__item_on')){
        //         return;
        //     }
        //     // 异步的代码   
        //     tabs[i].addEventListener('click', function(){
        //         // console.log(i)
        //         document
        //             .querySelector('.weui-bar__item_on')
        //             .classList
        //             .remove('weui-bar__item_on')
        //         this.classList.add('weui-bar__item_on')
        //     })        
        // }
    </script>
</body>
</html>

总结

通过本实践,我们不仅快速搭建了一个具有导航、搜索功能的新闻列表页面,还深刻体会到了WEUI组件库的便捷性和高效性。更重要的是,我们意识到了在现代Web开发中,无障碍设计不应是附加选项,而应当作为设计和开发的基本原则之一。WEUI在这方面做得尤为出色,其组件设计充分考虑了包括盲人在内的所有用户的使用体验,体现了产品设计的人文关怀。利用WEUI快速搭建新闻列表页不仅是一个技术实践过程,也是对用户体验和包容性设计的一次深入探索。随着移动互联网的持续发展,遵循这样的设计理念,将帮助我们构建更加友好、包容的数字世界。

绘制表情 (2).gif