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

news2024/11/24 22:35:09

文章归档于:https://www.yuque.com/u27599042/row3c6

组件库地址

  • 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

仿写样例

  • image.png

组件名

  • 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>
  • image.png

组件源码

<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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/980775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

css中flex和flex-grow的区别

设置了1个class为parent且宽度为700px的div父级元素&#xff1b; 它有3个子元素&#xff0c;分别宽高为100px&#xff1b; 其中item2的元素flex值为1&#xff0c;item3的元素flex值为2 <!DOCTYPE html> <html lang"en"> <head><style>.pare…

车船边缘网关是如何给车辆船只定位的?

随着智能交通系统的不断发展&#xff0c;车路协同成为了重要的研究方向之一。而AI边缘计算网关在这个领域中发挥着至关重要的作用。本文将重点介绍AI边缘计算网关在车路协同中的应用&#xff0c;并强调其中的重点词汇或短语。 首先&#xff0c;什么是AI边缘计算网关&#xff1…

华为数据管理——《华为数据之道》

数据分析与开发 元数据是描述数据的数据&#xff0c;用于打破业务和IT之间的语言障碍&#xff0c;帮助业务更好地理解数据。 元数据是数据中台的重要的基础设施&#xff0c;元数据治理贯彻数据产生、加工、消费的全过程&#xff0c;沉淀了数据资产&#xff0c;搭建了技术和业务…

Python实现猎人猎物优化算法(HPO)优化卷积神经网络分类模型(CNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

ps显示msvcp140.dll丢失的解决方法,四个解决方法分享

我想和大家分享一个关于ps显示msvcp140.dll丢失的问题以及解决方法。这个问题可能会困扰很多使用Photoshop软件的朋友&#xff0c;特别是在运行某些特定功能时&#xff0c;会出现“无法运行此程序&#xff0c;因为找不到”的错误提示。那么&#xff0c;如何解决这个问题呢&…

现在嵌入式行业工作起薪是多少呢?发展怎么样?

今天闲逛看到有位毕业大学生询问的问题&#xff0c;我就来客观讨论一下&#xff0c;其实工作方面都是起薪多少取决于你个人的学历&#xff0c;能力等背景。嵌入式岗位的就业比起其他很多工程师岗位算还不错的&#xff0c;但是不如互联网&#xff0c;这一点不用质疑。起薪多少这…

element-plus中更改分页器的文字

实现&#xff1a; main.ts 文件中增加如下代码&#xff1a; import zhCn from element-plus/es/locale/lang/zh-cn // 自定义文字&#xff08;使用默认文字不用设置&#xff09; zhCn.el.pagination.goto 跳转到 zhCn.el.pagination.pageClassifier 页 // 创建应用实例对象 c…

学校宿舍智能水电表管理系统:为节约资源保驾护航

随着科技的不断发展&#xff0c;越来越多的学校开始重视宿舍管理的智能化。其中&#xff0c;智能水电表管理系统作为一项重要的基础设施&#xff0c;已经逐渐被各大高校引入。本文将围绕学校宿舍智能水电表管理系统展开详细介绍&#xff0c;让我们一起来了解一下这个节约资源、…

[machineLearning]非监督学习unsupervised learning

1.什么是非监督学习 常见的神经网络是一种监督学习,监督学习的主要特征即为根据输入来对输出进行预测,最终会得到一个输出数值.而非监督学习的目的不在于输出,而是在于对读入的数据进行归类,选取特征,打标签,通过对于数据结构的分析来完成这些操作, 很少有最后的输出操作. 从…

搭建STM32F407的SPI-Flash(基于STM32CubeMX)

网上有不少例子&#xff0c;都对&#xff0c;但对我来说碰到几个坑&#xff0c;避免以后再犯错&#xff0c;mark下。 目标&#xff1a;通过SPI接口&#xff0c;对Nor Flash进行读写 开发板上Nor Flash 是W25Q128&#xff0c; 128Mbit&#xff0c;也就是16MB样子 CubeMx端配置…

WebClient vs HttpClient:异同对比

在 Java 开发中&#xff0c;进行网络通信是常见的需求。WebClient 和 HttpClient 是两种常用的用于发送 HTTP 请求的工具。它们都具有相似的功能&#xff0c;但在实现细节和用法上存在一些差异。本文将详细介绍 WebClient 和 HttpClient 的异同&#xff0c;帮助您选择适合您项目…

leetcode 205. 同构字符串

2023.9.6 本题维护两个映射表map&#xff0c;若发现无法对应则返回false。 代码如下&#xff1a; class Solution { public:bool isIsomorphic(string s, string t) {unordered_map<char,char> m1;unordered_map<char,char> m2;for(int i0; i<s.size(); i){//相…

信息化战略规划-CRO-SCM-应用集成-电子商务

信息化战略规划-CRO-SCM-应用集成-电子商务 信息化战略体系(重点)信息系统战略规划&#xff08;重点&#xff09;客户关系管理&#xff08;重点&#xff09;供应链管理企业应用集成电子商务 信息化战略体系(重点) 企业战略&#xff1a;目标 企业战略规划&#xff1a;实现目标的…

【EI/SCOPUS会议征稿】第二届环境遥感与地理信息技术国际学术会议(ERSGIT 2023)

第二届环境遥感与地理信息技术国际学术会议 2023 2nd International Conference on Environmental Remote Sensing and Geographic Information Technology 第二届环境遥感与地理信息技术国际学术会议&#xff08;ERSGIT 2023&#xff09;定于2023年11月10-12日在中国陕西西安…

数据库设计:防止MySQL字段名与关键字相撞,保护数据完整性!

MySQL是一款广泛应用的关系型数据库管理系统&#xff0c;对于数据库设计而言&#xff0c;字段名的选择是至关重要的一环。不小心选择了和MySQL关键字相同的字段名可能导致严重的数据完整性问题。下面将深入探讨如何防止MySQL字段名与关键字相撞&#xff0c;以保护数据的完整性。…

6.(高级示例篇)cesium暗色系地图样式地图(颜色滤镜)

注&#xff1a;高级示例博客不提供源码 地图之家总目录&#xff08;订阅之前建议先查看该博客&#xff09; 效果如下所示&#xff1a; cesium暗色系地图样式地图&#xff08;颜色滤镜&#xff09;

Multimodel Image synthesis and editing:The generative AI Era

1.introduction 基于GAN和扩散模型&#xff0c;通过融入多模态引导来调节生成过程&#xff0c;从不同的多模态信号中合成图像&#xff1b;是为多模态图像合成和编辑使用预训练模型&#xff0c;通过在GAN潜在空间中进行反演&#xff0c;应用引导函数&#xff0c;或调整扩散模型…

鞋业的数字化转型:3D建模与3D打印

3D打印正在成为时尚行业的一笔重要资产。 正如我们在之前的博客文章中看到的那样&#xff0c;制鞋行业实际上正在充分利用这种新的制造工艺。 这是改进许多不同公司的原型设计和生产流程的一种方法。 但为了改进这些流程&#xff0c;获得正确的 3D 建模软件非常重要。 即使你不…

rknn_server启动方法

rknn_server: 是一个运行在板子上的后台代理服务&#xff0c;用于接收PC通过USB传输过来的协议&#xff0c;然后执行板端runtime对应的接口&#xff0c;并返回结果给PC。 当rknn_server没有启动&#xff0c;则在上位机和瑞芯微开发板的连扳调试&#xff0c;容易出现如下错误&a…

安防监控/视频汇聚/视频云存储EasyCVR平台v3.3版本AI智能分析网关V3接入教程2.0

TSINGSEE的边缘计算硬件智能分析网关V3内置多种AI算法模型&#xff0c;包括人脸、人体、车辆、车牌、行为分析、烟火、入侵、聚集、安全帽、反光衣等等&#xff0c;可应用在安全生产、通用园区、智慧食安、智慧城管、智慧煤矿等场景中。将网关硬件结合TSINGSEE青犀的视频汇聚/安…