zoukankan      html  css  js  c++  java
  • 在 Vue.js 中制作自定义选择组件

    定制 select 标签的设计非常困难。有时候,如果不使用样式化的 div 和自定义 JavaScript 的结合来构建自己的脚本,那是不可能的。在本文中,你将学习如何构建使用完全自定义 css 设置样式的 vue.js 组件。

    html

    <template>
      <div
        class="custom-select"
        :tabindex="tabindex"
        @blur="open = false"
      >
        <div
          class="selected"
          :class="{open: open}"
          @click="open = !open"
        >
          {{ selected }}
        </div>
        <div
          class="items"
          :class="{selectHide: !open}"
        >
          <div
            class="item"
            v-for="(option, i) of options"
            :key="i"
            @click="selected=option; open=false; $emit('input', option)"
          >
            {{ option }}
          </div>
        </div>
      </div>
    </template>

    需要注意以下几点:

    • tabindex 属性使我们的组件能够得到焦点,从而使它变得模糊。当用户在组件外部单击时,blur 事件将关闭我们的组件。
    • input 参数发出选定的选项,父组件可以轻松地对更改做出反应。

    JavaScript

    <script>
    export default {
      props:{
        options:{
          type: Array,
          required: true
        },
        tabindex:{
          type: Number,
          required: false,
          default: 0
        }
      },
      data() {
        return {
          selected: this.options.length > 0 ? this.options[0] : null,
          open: false
        };
      },
      mounted(){
        this.$emit('input', this.selected);
      }
    };
    </script>

    另外,要注意的重要事项:

    我们还会在 mount 上发出选定的值,以便父级不需要显式设置默认值。如果我们的 select 组件是较大表单的一部分,那么我们希望能够设置正确的 tabindex 。

    电脑刺绣绣花厂 http://www.szhdn.com 广州品牌设计公司https://www.houdianzi.com

    css

    <style scoped>
    
    .custom-select {
      position: relative;
       100%;
      text-align: left;
      outline: none;
      height: 47px;
      line-height: 47px;
    }
    
    .selected {
      background-color: #080D0E;
      border-radius: 6px;
      border: 1px solid #858586;
      color: #ffffff;
      padding-left: 8px;
      cursor: pointer;
      user-select: none;
    }
    
    .selected.open{
      border: 1px solid #CE9B2C;
      border-radius: 6px 6px 0px 0px;
    }
    
    .selected:after {
      position: absolute;
      content: "";
      top: 22px;
      right: 10px;
       0;
      height: 0;
      border: 4px solid transparent;
      border-color: #fff transparent transparent transparent;
    }
    
    .items {
      color: #ffffff;
      border-radius: 0px 0px 6px 6px;
      overflow: hidden;
      border-right: 1px solid #CE9B2C;
      border-left: 1px solid #CE9B2C;
      border-bottom: 1px solid #CE9B2C;
      position: absolute;
      background-color: #080D0E;
      left: 0;
      right: 0;
    }
    
    .item{
      color: #ffffff;
      padding-left: 8px;
      cursor: pointer;
      user-select: none;
    }
    
    .item:hover{
      background-color: #B68A28;
    }
    
    .selectHide {
      display: none;
    }
    </style>

    该 CSS只是一个示例,你可以按照你的需求随意修改样式。

  • 相关阅读:
    触摸屏测试:Tslib
    Ubuntu:我不小心把/var/lock文件夹给删了
    驱动开发学习笔记. 0.02 基于EASYARM-IMX283 烧写uboot和linux系统
    驱动开发学习笔记. 0.01 配置arm-linux-gcc 交叉编译器
    驱动开发学习笔记.0.00 从拿到一块开发板开始
    利用联合体通过串口收发浮点数
    stm32 MDK5软件仿真之查看io口输出
    ListView 类
    INotifyPropertyChanged 接口
    ItemsControl 类绑定数据库
  • 原文地址:https://www.cnblogs.com/xiaonian8/p/13825873.html
Copyright © 2011-2022 走看看