一个基于element-ui(input)修改的搜索框小组件

961 阅读2分钟

       项目中遇到过搜索框的需求,要完善展示搜索联想信息,根据要求对element-ui的input框进行了一下样式修改,有需要的可借鉴一下。

先看看最终效果

ssk01.f9cca9ca.png

下面开始实现

选中模板(项目基于vue2+element-ui搭建)

此处我选择的是 input 组件中的自定义模板
element.eleme.io/#/zh-CN/com…

ssk02.05dbc77b.png

修改样式

HTML部分代码

输入框部分
 <template>
  <div class="youshangjiao" style="z-index: 110">
    <div class="ssk">
      <!-- :popper-append-to-body="false"  若要修改下拉框样式,此处必不可少的属性 -->
      <el-autocomplete
        :popper-append-to-body="false"
        class="fk"
        v-model="state1"
        :fetch-suggestions="querySearch"
        placeholder="请输入内容"
        @select="handleSelect"
        size="small"
      >
        <i
          class="el-icon-search el-input__icon"
          slot="suffix"
          @click="handleIconClick"
        >
        </i> 

        <!-- 此处放置下拉框 -->

      </el-autocomplete>
    </div>
  </div>
</template>
下拉框部分
<template class="cc" v-slot="{ item }">
          <div v-if="item.id === 1" style="color: #111111">
            已检索到"{{ state1 }}"相关结果{{ item.changdu }}条
          </div>
          <div class="bankuai">
            <div class="diyihang" style="display: flex">
              <div
                v-html="item.biaoti"
                style="
                  font-weight: bold;
                  overflow: hidden;
                  text-overflow: ellipsis;
                  margin: 0;
                  color: #111111;
                "
              ></div>
              <span style="color: #fff">查看详情</span>
            </div>

            <div
              v-html="item.neirong"
              style="
                font-size: 12px;
                color: #111111;
                overflow: hidden;

                display: -webkit-box;
                -webkit-box-orient: vertical;
                -webkit-line-clamp: 2;
                word-wrap: break-word;
              "
            ></div>
          </div>
        </template>

JS部分代码

<script>
export default {
  data() {
    return {
      state1: "",
      restaurants: [],
    };
  },

  methods: {
    skip(e) {
      this.$router.push(`${e}`);
    },
    querySearch(queryString, cb) {
      var restaurants = this.restaurants;
      var results = queryString
        ? restaurants.filter(this.createFilter(queryString))
        : restaurants;

      // 调用 callback 返回建议列表的数据
      // 关键字高亮
      let htmlStr = `<span style='color:green;'>${queryString}</span>`;

      //添加index属性(编号)
      results.forEach((item, index) => {
        item.biaoti = item.selectLable.replace(queryString, htmlStr);
        item.neirong = item.address.replace(queryString, htmlStr);
        // 添加数据长度(条数)属性,以此来获取建议栏(关联栏)查询到的数据条数
        item.changdu = results.length;
        // 添加属性编号,以此来控制检索条数展示栏的渲染情况
        item.id = index + 1;
      });

      cb(results);
    },

    createFilter(queryString) {
      return (restaurant) => {
        return (
          restaurant.selectLable
            .toLowerCase()
            .indexOf(queryString.toLowerCase()) !== -1
        );
      };
    },
    loadAll() {
      return [
        {
          selectLable: "海岛桑是如何飘洋过海来到此的?",
          address: "我是海岛桑,顾名思义,长在海岛的桑科植物。在内陆大家...",
        },
        {
          selectLable: "让我们瞅瞅景天植物的特殊技能",
          address: "我们景天植物的特殊技能就是...",
        },
        {
          selectLable: "我去的犬瘟热山去达摩",
          address: "去饿亲热亲热",
        },
        {
          selectLable: "看风景依然具有浑然一体",
          address: "哈达请问企鹅·",
        },
        {
          selectLable: "看山水依然具有怪石嶙峋",
          address: "地区划为期间的阿松",
        },
      ];
    },
    handleSelect(item) {
      this.state1 = item.selectLable;
      console.log(item);
    },
    handleIconClick(ev) {
      console.log(ev);
    },
  },
  mounted() {
    this.restaurants = this.loadAll();
  },
  computed: {},
};
</script>
核心方法querySearch的调整解析

添加高亮关键字功能

// 关键字高亮
      let htmlStr = `<span style='color:green;'>${queryString}</span>`;

获取到自定义属性并作展示

results.forEach((item, index) => {
        item.biaoti = item.selectLable.replace(queryString, htmlStr);
        item.neirong = item.address.replace(queryString, htmlStr);
        // 添加数据长度(条数)属性,以此来获取建议栏(关联栏)查询到的数据条数
        item.changdu = results.length;
        // 添加属性编号,以此来控制检索条数展示栏的渲染情况
        item.id = index + 1;
      });

       其中, results.length 帮助我们拿到下拉框建议匹配到的数据条数,index 为我们自己添加的属性,以此来判断是否渲染匹配条数信息,若无此属性会导致  “已检索到xx相关结果xx条”  跟着整个插槽多次渲染。

CSS部分代码

       首先,保留模板样式,后续添加的全部css代码如下

<style scoped>
.youshangjiao {
  position: absolute;
  display: flex;
  width: 35%;
  height: 10%;
  top: 5%;
  right: 5%;
}
.ssk {
  position: relative;
  width: 64%;
  height: 90%;
}
.fk {
  width: 100%;
  height: 80%;
  position: absolute;
  top: 70%;
  left: 50%;
  transform: translate(-50%, -50%);
}
.fk /deep/ .el-input__inner {
  background-color: rgba(140, 165, 165, 0.4);
  font-weight: bold;
  color: #fff;
  border-radius: 20px;
  box-shadow: 1.5px 1px 1px #667f8a;
}
.fk /deep/ .el-input__inner:focus {
  border-color: #b3b896;
}
.fk /deep/ .el-input__icon {
  color: #617202;
}
.fk /deep/ .el-input__inner::placeholder {
  color: #e6e6e6;
}
div /deep/ .el-autocomplete-suggestion {
  background-color: rgba(135, 165, 165, 0.6);
}

/* 去掉下拉框的顶部小三角箭头 ,看着像一个箭头,其实是两个重叠在一起的箭头*/
div /deep/.el-popper .popper__arrow,
div /deep/.el-popper .popper__arrow::after {
  display: none;
}

.bankuai {
  border-top: 1px solid rgb(114, 114, 114);
}
</style>

       因为是基于element-ui的input作修改,因此样式修改需借助deep

输入框样式部分修改

.fk /deep/ .el-input__inner {
  background-color: rgba(140, 165, 165, 0.4);
  font-weight: bold;
  color: #fff;
  border-radius: 20px;
  box-shadow: 1.5px 1px 1px #667f8a;
}
.fk /deep/ .el-input__inner:focus {
  border-color: #b3b896;
}
.fk /deep/ .el-input__icon {
  color: #617202;
}
.fk /deep/ .el-input__inner::placeholder {
  color: #e6e6e6;
}

.el-input__inner :控制输入框背景颜色,字体粗细/颜色,形状(圆角)等
.el-input__inner:focus :代表输入框被选中后的状态
.el-input__icon :控制搜索小图标的样式
.el-input__inner::placeholder :控制引导文字的样式

下拉框样式部分修改

修改下拉框样式必须在el-autocomplete元素上加上  :popper-append-to-body="false"  ,否则无法生效

div /deep/ .el-autocomplete-suggestion {
  background-color: rgba(135, 165, 165, 0.6);
}

/* 去掉下拉框的顶部小三角箭头 ,看着像一个箭头,其实是两个重叠在一起的箭头*/
div /deep/.el-popper .popper__arrow,
div /deep/.el-popper .popper__arrow::after {
  display: none;
}

.bankuai {
  border-top: 1px solid rgb(114, 114, 114);
}

.el-autocomplete-suggestion :控制下拉框背景样式
.el-popper .popper__arrow :代表下拉框与输入框衔接的小箭头,有两个若去除则都要去除
.bankuai :为分割线,名字随便取,不需要可去除

源码地址

源码已上传到码云仓库gitee.com/laofang/zuj…