[构建 Vue 组件库] 小尾巴 UI 组件库 —— 横向商品卡片(仿淘宝)

这篇具有很好参考价值的文章主要介绍了[构建 Vue 组件库] 小尾巴 UI 组件库 —— 横向商品卡片(仿淘宝)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章归档于:https://www.yuque.com/u27599042/row3c6文章来源地址https://www.toymoban.com/news/detail-697867.html

组件库地址

  • npm:https://www.npmjs.com/package/xwb-ui?activeTab=readme
  • gitee:https://gitee.com/tongchaowei/xwb-ui

下载

npm i xwb-ui

配置

  • 按需导入
import {
  组件名
} from 'xwb-ui'
  • 完全导入
import {createApp} from 'vue'
import App from './App.vue'
import 'xwb-ui/style.css' // 导入样式
import XWB_UI from 'xwb-ui' // 导入组件全局注册插件

const app = createApp(App)

app.use(XWB_UI)

app.mount('#app')

Small

仿写样例

  • [构建 Vue 组件库] 小尾巴 UI 组件库 —— 横向商品卡片(仿淘宝),前端,vue.js,ui,前端,javascript,组件库,vue

组件名

  • GoodsCardRowSmall

组件说明

  • 组件中的文字先进行了大小统一,16px,对于各部分的文字大小可以通过 props 进行修改
  • 对于商品图片,默认 img 高度为父元素的 100%,可以通过商品图片的父元素 goods-img 设置宽高来修改图片的大小
  • 商品标签所占的空间,默认为商品价格和商品名剩下的所有空间,商品名默认两行文本,超出部分 overflow: hidden;
  • 其他样式与 props 请参考 组件 props 说明组件源码

组件 props 说明

/* 接收参数 */
const props = defineProps({
  // 商品卡片的宽度
  width: {type: String, default: '23.3rem'},
  // 商品卡片的高度
  height: {type: String, default: '10rem'},
  // 商品卡片圆角
  borderRadius: {type: String, default: '1rem'},
  // 商品卡片背景颜色
  backgroundColor: {type: String, default: '#f7f9fa'},
  // 商品卡片中文字颜色
  fontColor: {type: String, default: '#333333'},
  // 商品卡片样式修改过度时间
  transitionTime: {type: String, default: '0.3s'},
  // 商品卡片鼠标悬浮时边框颜色
  borderColor: {type: String, default: '#67c23a'},
  // 商品卡片鼠标悬浮时阴影颜色
  boxShadowColor: {type: String, default: '#67c23a'},
  // 商品名称
  name: {type: String, default: '商品名称'},
  // 商品名文字大小
  nameFontSize: {type: String, default: '1rem'},
  // 商品名文本区域的宽度
  nameWidth: {type: String, default: '12rem'},
  // 商品名文本区域高度
  nameHeight: {type: String, default: '2.6rem'},
  // 商品名文本行高
  nameLineHeight: {type: String, default: '1.3rem'},
  // 商品名鼠标悬浮文字颜色
  nameHoverFontColor: {type: String, default: '#67c23a'},
  // 商品图片 src
  imgSrc: {type: String, default: '/img/book-1.png_580x580q90.jpg_.webp'},
  // 商品图片 alt
  imgAlt: {type: String, default: '商品图片'},
  // 商品图片容器高度
  imgBoxHeight: {type: String, default: '9rem'},
  // 商品图片容器宽度
  imgBoxWidth: {type: String, default: '9rem'},
  // 商品图片圆角
  imgBorderRadius: {type: String, default: '1rem'},
  // 商品标签
  label: {type: Array, default: []},
  // 商品价格
  price: {type: Number, default: 0},
  // 商品价格文字大小
  priceFontSize: {type: String, default: '1.3rem'},
  // 商品价格文字颜色
  priceFontColor: {type: String, default: '#67c23a'},
  // 商品标签颜色
  labelColor: {type: String, default: '#67c23a'},
  // 商品标签内边距
  labelPAdding: {type: String, default: '0.1rem'},
  // 商品标签右外边距
  labelMarginRight: {type: String, default: '0.35rem'},
  // 商品标签边框圆角
  labelBorderRadius: {type: String, default: '0.2rem'},
  // 商品标签文字大小
  labelFontSize: {type: String, default: '0.5rem'},
})

组件的使用

<GoodsCardRowSmall
  :name="'商品名称商品名称商品名称商品名称商品名称商品名称商品名称商品名称商品名称商品名称'"
  :label="['满减', '促销']"
  :labelColor="'red'"
  :borderColor="'red'"
  :boxShadowColor="'red'"
  :nameWidth="'100%'"
  :nameHoverFontColor="'red'"
  :imgSrc="'/img/book-1.png_580x580q90.jpg_.webp'"
  :priceFontColor="'red'"
></GoodsCardRowSmall>
  • [构建 Vue 组件库] 小尾巴 UI 组件库 —— 横向商品卡片(仿淘宝),前端,vue.js,ui,前端,javascript,组件库,vue

组件源码

<script setup>
/* 接收参数 */
const props = defineProps({
  // 商品卡片的宽度
  width: {type: String, default: '23.3rem'},
  // 商品卡片的高度
  height: {type: String, default: '10rem'},
  // 商品卡片圆角
  borderRadius: {type: String, default: '1rem'},
  // 商品卡片背景颜色
  backgroundColor: {type: String, default: '#f7f9fa'},
  // 商品卡片中文字颜色
  fontColor: {type: String, default: '#333333'},
  // 商品卡片样式修改过度时间
  transitionTime: {type: String, default: '0.3s'},
  // 商品卡片鼠标悬浮时边框颜色
  borderColor: {type: String, default: '#67c23a'},
  // 商品卡片鼠标悬浮时阴影颜色
  boxShadowColor: {type: String, default: '#67c23a'},
  // 商品名称
  name: {type: String, default: '商品名称'},
  // 商品名文字大小
  nameFontSize: {type: String, default: '1rem'},
  // 商品名文本区域的宽度
  nameWidth: {type: String, default: '12rem'},
  // 商品名文本区域高度
  nameHeight: {type: String, default: '2.6rem'},
  // 商品名文本行高
  nameLineHeight: {type: String, default: '1.3rem'},
  // 商品名鼠标悬浮文字颜色
  nameHoverFontColor: {type: String, default: '#67c23a'},
  // 商品图片 src
  imgSrc: {type: String, default: '/img/book-1.png_580x580q90.jpg_.webp'},
  // 商品图片 alt
  imgAlt: {type: String, default: '商品图片'},
  // 商品图片容器高度
  imgBoxHeight: {type: String, default: '9rem'},
  // 商品图片容器宽度
  imgBoxWidth: {type: String, default: '9rem'},
  // 商品图片圆角
  imgBorderRadius: {type: String, default: '1rem'},
  // 商品标签
  label: {type: Array, default: []},
  // 商品价格
  price: {type: Number, default: 0},
  // 商品价格文字大小
  priceFontSize: {type: String, default: '1.3rem'},
  // 商品价格文字颜色
  priceFontColor: {type: String, default: '#67c23a'},
  // 商品标签颜色
  labelColor: {type: String, default: '#67c23a'},
  // 商品标签内边距
  labelPAdding: {type: String, default: '0.1rem'},
  // 商品标签右外边距
  labelMarginRight: {type: String, default: '0.35rem'},
  // 商品标签边框圆角
  labelBorderRadius: {type: String, default: '0.2rem'},
  // 商品标签文字大小
  labelFontSize: {type: String, default: '0.5rem'},
})

/* 商品卡片样式 */
const goodsCardStyle = {
  width:props.width,
  height:props.height,
  borderRadius:props.borderRadius,
  backgroundColor: props.backgroundColor,
  color: props.fontColor,
  transition: `all ${props.transitionTime}`,
}

/* 商品名样式 */
const goodsNameStyle = {
  fontSize: props.nameFontSize,
  width: props.nameWidth,
  height: props.nameHeight,
  lineHeight: props.nameLineHeight,
}

/* 商品图片样式 */
const goodsImgStyle = {
  height: props.imgBoxHeight,
  width: props.imgBoxWidth,
  borderRadius: props.imgBorderRadius,
}

/* 商品价格样式 */
const goodsPriceStyle = {
  fontSize: props.priceFontSize,
  color: props.priceFontColor
}

/* 商品标签样式 */
const goodsLabelStyle = {
  color: props.labelColor,
  border: `1px solid ${props.labelColor}`,
  marginRight: props.labelMarginRight,
  padding: props.labelPAdding,
  borderRadius: props.labelBorderRadius,
  fontSize: props.labelFontSize
}

/* vue 内置函数 */
import { ref, onMounted } from 'vue'

/* 为商品卡片添加鼠标悬浮事件 */
// 变量名必须和元素上 ref 属性值一样
const goodsCardRef = ref(null) // 获取商品卡片引用
// 组件挂载之后进行事件的绑定
onMounted(() => {
  // 鼠标悬浮时,商品卡片边框颜色和盒子阴影
  goodsCardRef.value.addEventListener('mouseover', () => {
    goodsCardRef.value.style.border = `1px solid ${props.borderColor}`
    goodsCardRef.value.style.boxShadow = `0 0 8px 1px ${props.boxShadowColor}`
  })
  // 鼠标移开清除添加的样式
  goodsCardRef.value.addEventListener('mouseout', () => {
    goodsCardRef.value.style.border = 'none'
    goodsCardRef.value.style.boxShadow = 'none'
  })
})

/* 为商品名添加鼠标悬浮事件 */
const goodsNameRef = ref(null) // 商品名引用
// 组件挂载之后为商品名绑定事件
onMounted(() => {
  // 鼠标悬浮时添加样式
  goodsNameRef.value.addEventListener('mouseover', () => {
    goodsNameRef.value.style.color = props.nameHoverFontColor
  })
  // 鼠标移开恢复样式
  goodsNameRef.value.addEventListener('mouseout', () => {
    goodsNameRef.value.style.color = props.fontColor
  })
})
</script>

<template>
  <!-- 商品卡片 -->
  <div class="goods-card" :style="goodsCardStyle" ref="goodsCardRef">
    <!-- 商品图片 -->
    <div
        class="goods-img"
        :style="goodsImgStyle"
    >
      <img
          :src="imgSrc"
          :alt="imgAlt"
          :style="{ borderRadius: goodsImgStyle.borderRadius }"
      >
    </div>
    <!-- 商品信息 -->
    <div class="goods-info">
      <!-- 商品名 -->
      <p
          class="goods-name"
          :style="goodsNameStyle"
          ref="goodsNameRef"
      >{{ name }}</p>
      <!-- 商品标签 -->
      <div class="goods-label">
        <span
            v-for="(item, idx) in label"
            :key="idx"
            :style="goodsLabelStyle"
        >{{ item }}</span>
      </div>
      <p class="goods-price">
        <span
          :style="{color: goodsPriceStyle.color}"
        ></span>
        <span
          :style="goodsPriceStyle"
        >{{ price }}</span>
      </p>
    </div>
  </div>
</template>

<style lang="scss" scoped>
// 商品卡片
.goods-card {
  box-sizing: border-box;
  padding: 0.5rem 0.8rem 0.5rem 0.5rem;
  display: flex;
  justify-content: start;
  // 鼠标样式
  cursor: pointer;
  // 字体大小统一
  font-size: 16px;

  // 商品图片
  .goods-img {
    margin-right: 0.7rem;
    display: flex;
    justify-content: center;
    align-items: center;

    img {
      height: 100%;
    }
  }

  // 商品信息
  .goods-info {
    display: flex;
    flex-direction: column;
    justify-self: start;
    align-items: start;

    // 商品名
    .goods-name {
      box-sizing: border-box;
      margin: 0.5rem 0;
      overflow: hidden;
      // 鼠标样式
      cursor: pointer;

    }

    // 商品标签
    .goods-label {
      flex: 1;
      display: flex;
      align-items: start;
      justify-content: start;
    }

    // 商品价格
    .goods-price {
      margin-bottom: 1rem;
    }
  }
}
</style>

到了这里,关于[构建 Vue 组件库] 小尾巴 UI 组件库 —— 横向商品卡片(仿淘宝)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [自定义 Vue 组件] 小尾巴顶部导航栏(2.0) TailTopNav

    文章归档:https://www.yuque.com/u27599042/coding_star/oglrqteg8fzvvzn0 [自定义 Vue 组件] 响应式顶部导航栏(1.0) TopNav:https://www.yuque.com/u27599042/coding_star/hzltsltxgavwx8u2 [自定义 Vue 组件] 小尾巴 Logo 组件(2.0) TailLogo:https://www.yuque.com/u27599042/coding_star/mluie83zdzaf40sy [自定义 Vue 组件] 小尾巴下拉菜

    2024年02月05日
    浏览(38)
  • 前端Vue自定义精美商品分类组件category 可用于电商应用分类页面

    随着技术的不断发展,传统的开发方式使得系统的复杂度越来越高。在传统开发过程中,一个小小的改动或者一个小功能的增加可能会导致整体逻辑的修改,造成牵一发而动全身的情况。为了解决这个问题,我们采用了组件化的开发模式。通过组件化开发,可以有效地实现单

    2024年02月14日
    浏览(43)
  • 前端UI组件库深度解析:构建现代化的用户体验

    在当今的前端开发中,UI组件库已经成为了我们工具箱中不可或缺的一部分。这些库可以极大地提高我们的工作效率,同时也使我们能够专注于实现真正的业务逻辑,而不是重复地编写UI代码。本篇博客将详细地探讨UI组件库的核心概念,特性以及如何有效地使用它们。 UI组件

    2024年02月10日
    浏览(75)
  • 前端Vue自定义商品订单tabs标题栏选项卡组件 可设置文字下划线颜色

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。 通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月16日
    浏览(46)
  • 前端Vue自定义商品评价页面单选多选标签tags组件单选多选按钮选择器picker组件

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。 通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月16日
    浏览(67)
  • 前端Vue自定义轮播图视频播放组件 仿京东商品详情轮播图视频Video播放效果 可图片预览

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月15日
    浏览(54)
  • 前端Vue组件之仿京东拼多多领取优惠券弹出框popup 可用于电商商品详情领券场景使用

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月16日
    浏览(55)
  • Vue + Element UI 前端篇(七):功能组件封装

    为了避免组件代码的臃肿,这里对主要的功能部件进行封装,保证代码的模块化和简洁度。 组件结构 组件封装重构后,试图组件结构如下图所示 代码一览 Home组件被简化,包含导航、头部和主内容三个组件。 Home.vue HeadBar.vue MenuBar.vue Main.vue 国际化语言切换也被封装成为了组

    2024年02月09日
    浏览(39)
  • 【前端Vue】Element UI:一站式前端组件库的简单入门指南

    在现代的前端开发中,UI组件库扮演着至关重要的角色。它们为开发者提供了一套可重用的UI组件和工具,使得构建复杂的用户界面变得更加高效和便捷。在这篇文章中,我将向大家介绍Element UI,这是一个功能强大且易于使用的前端组件库。我将简单探讨Element UI的组件用法和

    2024年02月11日
    浏览(41)
  • 使用Vue 3和Vite构建基础案例整合饿了么UI、路由、组件和常用插件

    引言: Vue 3和Vite是当前前端开发中非常热门的技术组合,它们提供了快速、高效的开发环境和强大的生态系统。本篇博客将介绍如何使用Vue 3和Vite构建一个基础案例,并整合饿了么UI、路由、组件和常用插件,让您快速上手并搭建一个功能强大的Web应用。 首先,我们需要安装

    2024年02月04日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包