`
wjyuian
  • 浏览: 1671 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

微信小程序的搜索高亮、自定义导航条等踩坑记录

阅读更多

原文地址:https://oomabc.com/articledetail?atclid=7421fe13daad46389791463f51d3395d

 

前言
我在写这个博客的小程序过程中,遇到了很多的问题。之前断断续续也写过不少JavaScript和css,不过都是半吊子。所以在看了一会小程序demo代码,就开工了。虽然在一天之后就基本完成了大体功能框架,但依旧在细节上碰到了不少问题。本博客会将我遇到的一些问题和自己的解决方案贴在下面,纯粹记录一下。

图片

搜索高亮
不管是电商网站还是博客,亦或者是招聘网站,通常都少不了搜索功能。而搜索通常都会有一个基础应用,那就是关键字高亮,因为输入的关键字可能包含多个词语,而当多个词语命中对应结果时,这几个词语可能不是连续出现,所以这些高亮通常是后端接口通过搜索引擎框架实现。

在HTML中,后端在返回的结果数据中,用标签(例如:<span class="keyword">需要高亮的关键字</span>)将命中的关键字包起来,然后前端通过css样式将这些关键字进行特殊标记。

图片


按照这个思路,依旧是通过后端将命中关键字用小程序的<text class="keyword"></text>标签包起来,前端通过样式对其进行高亮。很遗憾,小程序直接将这段文字连同标签一起展示了,而且网上也没有查到让标签不展示的方法,所以这个思路行不通。

在小程序中,我们可以通过wx:for来实现标签的动态生成,然后根据具体参数来确定text标签是否需要添加高亮class。

后端依旧将高亮的关键字进行特殊标记,我这里使用HHtextHHS和HHtextHHE作为高亮的开始和结束标签,然后通过js进行字符串分割,最终返回的数据结构如下:

[
    {content : '重温', type : 0},   //content就是要显示的文本内容,type=0表示不高亮
    {content : 'Java', type : 1},   //type=1表示要高亮
    {content : '设计模式——', type : 0},
    {content : '工厂', type : 1},
    {content : '模式', type : 0}
]
实现带高亮标签的字符串转为数组的js方法如下:

//入参非空判断在上层已处理
splitTitle : function(s) {
    //保存最终返回的结果
    var rslist = [];

    //根据高亮开始标签进行字符串分割
    var arr1 = s.split('HHtextHHS');

    //遍历分割之后的每一个字符串,进行结束标签判断
    for (var i in arr1) {
        var word1 = arr1[i];

        //过滤空字符串
        if (word1 && word1.length > 0) {

            //如果有结束标签,则进行高亮字符串截取,并设置高亮标志位
            var indexEnd = word1.indexOf('HHtextHHE');
            if (indexEnd >= 0) {
                rslist.push({
                    content: word1.substring(0, indexEnd),
                    type: 1
                });

                //剩余不需要高亮
                //注意:这里的处理方式是基于没有标签嵌套的情况,如果有嵌套,这里需要另写逻辑
                var wordEnd = word1.substring(indexEnd + 9);
                if (wordEnd && wordEnd.length > 0) {
                    rslist.push({
                        content: wordEnd,
                        type: 0
                    });
                }
            } else {//没有结束标签,则表示当前字符串不是需要高亮的
                rslist.push({
                    content: word1,
                    type: 0
                });
            }

        }
    }

    return rslist;
}
对应在wxml中,循环显示这个数组对象的标签写法如下:

<!-- 这里的splitTitleList就是上面的js方法返回的数组对象 -->
<text class="articleTitle">
    <text wx:for="{{splitTitleList}}">
        <text class="{{item.type == 1 ? 'keywordHighLight' : ''}}">{{item.content}}</text>
    </text>
</text>
高亮样式就是很简单的wxss:

.keywordHighLight{
    color : red;
}
搜索框放大镜icon
图片

通常的搜索输入框都会有一个放大镜进行icon标记,既简介又功能清晰。所以,我也想在自己的小程序中也实现这个样式,之前写类似的前端代码很少,所以我打算通过background-image来引入放大镜的图标。 结果很遗憾:

template/topSearch.wxss 中的本地资源图片无法通过 WXSS 获取,可以使用网络图片,或者 base64,或者使用<img>标签。
请参考文档:https://mp.weixin.qq.com/debug/wxadoc/dev/qa.html#%E6%9C%AC%E5%9C%B0%E8%B5%84%E6%BA%90%E6%97%A0%E6%B3%95%E9%80%9A%E8%BF%87-css-%E8%8E%B7%E5%8F%96
  39 |   margin-left: 15px;
  40 |
> 41 |   background-image: url('/image/search.pn');
     |                    ^
  42 | }
  43 |
  44 | .searchIconImg{
微信小程序提醒我们,WXSS无法直接引入本地图片,只能使用网络图片或者以Base64格式,或者在WXML中用<img>引入。

所以,我就尝试在WXML中,直接用style的行内样式通过background-image引入图片。嘿嘿,很简单的通过view和input两个标签实现了图标显示,而且微信开发者工具中可以正常显示并调试(不过,input标签有个bug,会显示两个图标)。最终经过一番折腾,终于进入真机调试环节,结果依旧是很遗憾,在手机上无法显示这些图片,而且最终审核发布之后,手机端还是无法显示。

这下终于明白当初那些提示的含义了,接下来我就使用image试试。结果确实是可以的,不过要进行样式微调。大概的WXML和样式如下:

<view class="topSearchInputOuter">
    <img src="/image/search.png" class="searchIconImg">
    <input class="topSearchInput" value="{{queryWord}}" focus="true" auto-focus="true" name="topSearchInput" placeholder=" 热门关键字" bindconfirm="searchArticles">
</view>
.topSearchInput{
    font-size: 13px;
    border: 0px solid #EFEFEF;
    width: 220px;
    line-height: 33px;
    height : 33px;
    color : gray;
    padding-left : 5px;
}

.topSearchInputOuter{
    background-color: #EFEFEF;
    border-radius : 15px;
    padding-left : 8px;
    width : 240px;
    line-height : 33px;
    display: flex;
}
.searchIconImg{
    width : 15px;
    height : 15px;
    vertical-align: middle;
    justify-content: center;
    margin-top:9px;
}
自定义状态栏
在实现状态栏搜索功能的时候,还遇到的另一个问题就是,微信默认状态栏是不允许修改的。如果需要自定义状态栏,需要在app.json文件的window参数中,设置navigationStyle为custom。

"window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "欢迎访问OoM技术博客",
    "navigationBarTextStyle": "black",
    "backgroundColor": "#f1e8e8",
    "navigationStyle": "custom" //这里设置状态栏(导航栏)样式为自定义
}
这样一来,顶部除了微信的胶囊按钮之外,一片清爽。

不过这样一来,我们就需要自己实现顶部状态栏+导航条的设备自适应功能了。由于我也不是专业的前端,因此网上搜寻了针对全面屏和非全面屏两种设备的自适应方案。

通过判断设备是否是全面屏(iPhone X),进行状态栏高度和导航栏高度动态调整。js代码如下:

var vm = this;
wx.getSystemInfo({  //wx提供的获得设备系统信息的方法
    success: function (res) {
        let totalTopHeight = 68
        if (res.model.indexOf('iPhone X') !== -1) {
            totalTopHeight = 88
        } else if (res.model.indexOf('iPhone') !== -1) {
            totalTopHeight = 64
        }

        var statusBar = {};

        //设置状态栏相关参数
        statusBar.statusBarHeight = res.statusBarHeight;
        statusBar.titleBarHeight = totalTopHeight - res.statusBarHeight;
        statusBar.queryWord = vm.globalData.searchDefaultPlacehoder;

        //设定全局参数,其他页面通过 const app = getApp();app.globalData.statusBar 获得
        vm.globalData.statusBar = statusBar;
    },
    fail: function() {
        vm.globalData.statusBar = {
            statusBarHeight : 0,
            titleBarHeight : 0
        };
    }
});
对应的在WXML中的使用,下面给出模板化应用的例子:

<template name="topNavTmp">

<view class="topNavView" style="padding-top: 0px; height :0px">

        <view class="header" style="">
            <!-- 状态栏 --->
            <view class="status-bar" style="height:{{barStatus.statusBarHeight}}px"></view>
            <!-- 导航栏 --->
            <view class="title-bar" style="height:{{barStatus.titleBarHeight}}px; line-height : {{barStatus.titleBarHeight}}px;">
                <!-- 这里是顶部的返回和home按钮 -->
                <view class="topNavLeft">
                    <view class="topNav-one"><img bindtap="clickAndBack" class="topNavImg" src="/image/back-1.png"></view>
                    <view class="topNav-sep"></view>
                    <view class="topNav-two"><img bindtap="clickAndHome" class="topNavImg" src="/image/home-1.png"></view>
                </view>
                <!-- 标题 -->
                {{barStatus.topNavTitle}}
                <view class="tablet"></view>
            </view>
        </view>
    </view>

    <!-- 将topNavView的fixed样式,用同样高度顶下去,不然后面的样式会浮上来 -->
    <view style="height : {{barStatus.statusBarHeight+barStatus.titleBarHeight}}px; text-align : center;"></view>
</template>
在引用的页面使用:

<!-- 在其它页面引入模板的使用 -->
<import src="/template/topNav.wxml">
<!-- 这里使用模板,传入参数 -->
<template is="topNavTmp" data="{{barStatus}}"></template>

 

0
0
分享到:
评论

相关推荐

    微信小程序 自定义tabbar (源码)

    微信小程序 自定义tabbar (源码)微信小程序 自定义tabbar (源码)微信小程序 自定义tabbar (源码)微信小程序 自定义tabbar (源码)微信小程序 自定义tabbar (源码)微信小程序 自定义tabbar (源码)微信小程序 自定义...

    基于微信小程序的t自定义tabbar源代码,免费下载

    基于微信小程序的t自定义tabbar源代码,免费下载基于微信小程序的t自定义tabbar源代码,免费下载基于微信小程序的t自定义tabbar源代码,免费下载基于微信小程序的t自定义tabbar源代码,免费下载基于微信小程序的t...

    微信小程序自定义渐变顶部导航条.rar

    在微信小程序开发中,自定义导航条是一种常见的需求,它能提供更加个性化和独特的用户体验。本教程主要聚焦于如何利用微信小程序的特性实现自定义渐变顶部导航条,并且涵盖自定义返回键的实现方法。 首先,我们需要...

    微信小程序自定义导航源码

    在微信小程序中,自定义导航是一项重要的功能,它能让开发者根据自己的需求和设计风格来定制化页面间的跳转效果,从而提升用户体验。本资源提供的"微信小程序自定义导航源码"是一个实现这一功能的示例代码,适用于...

    微信小程序官方动态自定义底部tabBar的例子

    微信小程序官方动态自定义底部tabBar是一种实现动态切换底部导航菜单的方式,它可以根据用户的实际需求,实现更加灵活和个性化的底部tabBar展示效果。本文将详细介绍微信小程序官方提供的动态自定义底部tabBar的实现...

    微信小程序——自定义tabbar(截图+源码).zip

    微信小程序——自定义tabbar(截图+源码).zip 微信小程序——自定义tabbar(截图+源码).zip 微信小程序——自定义tabbar(截图+源码).zip 微信小程序——自定义tabbar(截图+源码).zip 微信小程序——自定义...

    [微信小程序] 自定义顶部导航栏(navigationBar),兼容适配所有机型(完整实例)

    兼容适配所有机型(完整案例),本示例主要讲述如何隐藏掉小程序顶部导航栏,然后设置自定义navigationBar,其中涉及组件用法、参数传递、导航栏相关等,简单点来说就是将微信原生顶部导航栏改为自定义导航栏。

    微信小程序colorui组件库自定义导航栏和tabbar

    总之,微信小程序结合 ColorUI 组件库,能够帮助开发者轻松实现自定义的导航栏和 tabbar,创建出更加美观、个性化的用户界面。在实际开发过程中,不断学习和实践,熟练掌握这类组件的使用,将极大地提高开发效率,...

    微信小程序源码 自定义tabbar(学习版)

    微信小程序源码 自定义tabbar(学习版)微信小程序源码 自定义tabbar(学习版)微信小程序源码 自定义tabbar(学习版)微信小程序源码 自定义tabbar(学习版)微信小程序源码 自定义tabbar(学习版)微信小程序源码 自定义...

    微信小程序--自定义选择颜色(组件)

    1、微信小程序、颜色、组件、可自定义选择 2、该资源科用于用户自定义选择喜欢的颜色 3、已经封装成组件,可以直接调用即可 4、成功运用于网上用户,体验效果好 5、想要的小伙伴可以直接拿去使用,方便快捷高效的...

    微信小程序(uniapp + uView)自定义导航栏

    微信小程序(uniapp + uView)自定义导航栏

    适用于微信小程序客服消息自定义关键词回复的管理系统多开版本

    可运用于小程序各类型的客服消息的自动回复需求,支持小程序卡片、图片、图文、文本、链接等形式。 适合的群体:程序员、外包公司、电商公司使用。 服务器环境:linux+nginx或者linux+apahce,php7.2版本,mysql5.5+

    微信小程序自定义头部标题导航栏

    * navIcon: 用户自定义导航按钮图标路径 * navHome: 导航按钮为主页home,与返回back互斥,默认false显示返回back * 外部样式类:(使用时注意权重,添加外部样式类无效果的时候,给类加点权重就可以了) * ...

    基于JavaScript和微信小程序的Diyemoji自定义表情设计源码

    本项目提供基于JavaScript和微信小程序的Diyemoji自定义表情设计源码,包含164个文件,涵盖148个PNG表情图片、4个JavaScript脚本文件、3个JSON配置文件、3个SVG矢量图文件、2个微信小程序样式表文件、1个LICENSE授权...

    微信小程序自定义省市区资源数据

    微信小程序自定义省市区资源数据

    微信小程序自定义底部导航栏原生语法

    微信小程序官方提供了默认的导航栏样式,但有时开发者可能需要更自定义的外观和功能,这就需要用到原生语法来实现自定义底部导航栏。下面将详细介绍如何使用JavaScript开发微信小程序中的自定义底部导航栏。 1. **...

    微信小程序实现自定义加载图标功能

    微信小程序实现自定义加载图标功能是一个针对前端开发者的实用教程。这个教程详细说明了如何在微信小程序中实现一个自定义的加载动画,这是开发者在制作小程序时经常会遇到的一个需求。具体来说,这个知识点包括以下...

    微信小程序自定义预处理命令-sass转wxss

    微信小程序自定义预处理命令-sass转wxss。使用微信开发者工具的自定义预处理命令,输入此文件名,并将此文件放入小程序根目录,然后此命令会查找小程序的pages下的scss和app.scss文件,并将其编译为wxss文件。更多...

    微信小程序—自定义模态框

    默认情况下,微信小程序提供了一套内置的模态框组件,但有时候开发者可能需要根据项目需求进行自定义,以满足更个性化的界面设计和交互体验。本文将深入探讨如何在微信小程序中实现自定义模态框。 首先,我们要理解...

    来电模拟器微信小程序源码 可自定义来电名称归属地铃声等带流量主

    来电模拟器微信小程序源码 可自定义来电名称归属地铃声等带流量主 模拟一个来电电话,可以正常接通,挂断等 让你假装有事,迅速离场,避免尴尬等等! 比如使用场景: 相亲的时候遇到奇葩,想找接口离开. 场价party想...

Global site tag (gtag.js) - Google Analytics