当前位置:首页 > VUE

vue实现搜索框样式

2026-02-23 08:47:17VUE

Vue 实现搜索框样式

基础搜索框实现

使用 Vue 的模板语法和样式绑定创建基础搜索框:

vue实现搜索框样式

<template>
  <div class="search-container">
    <input 
      v-model="searchQuery" 
      type="text" 
      placeholder="搜索..." 
      class="search-input"
    />
    <button @click="handleSearch" class="search-button">
      <i class="search-icon">🔍</i>
    </button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: ''
    }
  },
  methods: {
    handleSearch() {
      // 处理搜索逻辑
      console.log('搜索:', this.searchQuery)
    }
  }
}
</script>

<style scoped>
.search-container {
  display: flex;
  align-items: center;
  max-width: 500px;
  margin: 0 auto;
}

.search-input {
  padding: 10px 15px;
  border: 1px solid #ddd;
  border-radius: 4px 0 0 4px;
  flex-grow: 1;
  font-size: 16px;
}

.search-button {
  background: #42b983;
  color: white;
  border: none;
  padding: 10px 15px;
  border-radius: 0 4px 4px 0;
  cursor: pointer;
}

.search-icon {
  font-size: 16px;
}
</style>

带自动完成的搜索框

添加自动完成功能:

vue实现搜索框样式

<template>
  <div class="search-autocomplete">
    <input
      v-model="searchQuery"
      @input="handleInput"
      type="text"
      placeholder="搜索..."
      class="search-input"
    />
    <ul v-if="suggestions.length" class="suggestions-list">
      <li 
        v-for="(item, index) in suggestions" 
        :key="index"
        @click="selectSuggestion(item)"
      >
        {{ item }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: '',
      suggestions: []
    }
  },
  methods: {
    handleInput() {
      // 模拟API调用
      if(this.searchQuery.length > 2) {
        this.suggestions = [
          `${this.searchQuery} 结果1`,
          `${this.searchQuery} 结果2`,
          `${this.searchQuery} 结果3`
        ]
      } else {
        this.suggestions = []
      }
    },
    selectSuggestion(item) {
      this.searchQuery = item
      this.suggestions = []
    }
  }
}
</script>

<style scoped>
.search-autocomplete {
  position: relative;
  max-width: 500px;
  margin: 0 auto;
}

.suggestions-list {
  position: absolute;
  width: 100%;
  background: white;
  border: 1px solid #ddd;
  border-top: none;
  list-style: none;
  padding: 0;
  margin: 0;
  z-index: 10;
}

.suggestions-list li {
  padding: 10px;
  cursor: pointer;
}

.suggestions-list li:hover {
  background: #f5f5f5;
}
</style>

动画效果搜索框

添加过渡动画效果:

<template>
  <div class="animated-search">
    <div class="search-wrapper" :class="{ focused: isFocused }">
      <input
        v-model="searchQuery"
        @focus="isFocused = true"
        @blur="isFocused = false"
        type="text"
        placeholder="搜索..."
        class="search-input"
      />
      <button class="search-button">
        <i class="search-icon">🔍</i>
      </button>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: '',
      isFocused: false
    }
  }
}
</script>

<style scoped>
.animated-search {
  max-width: 500px;
  margin: 20px auto;
}

.search-wrapper {
  display: flex;
  border: 2px solid #ddd;
  border-radius: 30px;
  transition: all 0.3s ease;
  padding: 5px;
}

.search-wrapper.focused {
  border-color: #42b983;
  box-shadow: 0 0 8px rgba(66, 185, 131, 0.3);
}

.search-input {
  flex-grow: 1;
  border: none;
  outline: none;
  padding: 8px 15px;
  background: transparent;
  font-size: 16px;
}

.search-button {
  background: transparent;
  border: none;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  cursor: pointer;
  transition: background 0.3s;
}

.search-button:hover {
  background: rgba(66, 185, 131, 0.1);
}
</style>

移动端优化搜索框

针对移动设备的优化版本:

<template>
  <div class="mobile-search">
    <div class="search-bar">
      <input
        v-model="searchQuery"
        type="search"
        placeholder="搜索..."
        class="search-input"
      />
      <button class="clear-button" @click="clearSearch" v-show="searchQuery">
        ×
      </button>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: ''
    }
  },
  methods: {
    clearSearch() {
      this.searchQuery = ''
    }
  }
}
</script>

<style scoped>
.mobile-search {
  padding: 10px;
}

.search-bar {
  position: relative;
  display: flex;
  align-items: center;
}

.search-input {
  width: 100%;
  padding: 12px 40px 12px 15px;
  border: 1px solid #ddd;
  border-radius: 20px;
  font-size: 16px;
  -webkit-appearance: none;
}

.clear-button {
  position: absolute;
  right: 15px;
  background: none;
  border: none;
  color: #999;
  font-size: 20px;
  cursor: pointer;
  padding: 0;
  width: 20px;
  height: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
}
</style>

这些实现方法提供了从基础到高级的搜索框样式,可以根据具体需求选择或组合使用。每种实现都包含了完整的Vue组件代码和样式,可以直接集成到项目中。

标签: 样式vue
分享给朋友:

相关文章

vue实现标签

vue实现标签

Vue 实现标签的方法 在 Vue 中实现标签功能可以通过多种方式完成,以下是几种常见的方法: 使用动态组件 动态组件可以根据不同的条件渲染不同的标签内容。通过 :is 属性动态绑定组件名,实现标签…

vue 实现赋值

vue 实现赋值

Vue 实现赋值的方法 在 Vue 中,赋值操作通常涉及数据绑定和响应式更新。以下是几种常见的赋值方式: 直接赋值给 data 属性 在 Vue 实例的 data 对象中定义的属性可以直接通过 th…

vue 实现长按

vue 实现长按

实现长按功能的基本思路 在Vue中实现长按功能,通常需要监听元素的mousedown或touchstart事件,启动一个计时器。当用户按住元素超过设定的时间阈值时,触发长按回调函数。如果在时间阈值内触…

vue 实现loading

vue 实现loading

Vue 实现 Loading 的方法 使用 v-if 和 v-show 控制显示 在 Vue 中可以通过 v-if 或 v-show 控制 loading 组件的显示与隐藏。v-if 会动态创建或销毁…

vue最佳实现

vue最佳实现

Vue 最佳实践 组件设计 组件应遵循单一职责原则,每个组件只负责一个功能模块。命名采用 PascalCase(如 UserProfile.vue),模板中使用 kebab-case(如 <us…

vue遮罩实现

vue遮罩实现

实现 Vue 遮罩的常见方法 使用 CSS 定位和透明度 创建一个全屏遮罩层,通过 CSS 固定定位覆盖整个视口,并设置半透明背景色。 <template> <div cl…