• UI组件库基础


    UI组件库

    全局组件*

    全局注册组件 & 并且使用了require.context

    模块化编程 & webpack打包

    1. const install=(Vue)=>{
    2. const context=require.context('.',true,/\.vue$/)
    3.     context.keys().forEach(fileName=>{
    4. const module=context(fileName)
    5.         Vue.component(module.default.name,module.default)
    6. })
    7. }
    8. export default {
    9.     install
    10. }

    button*

    SCSS:在@each中使用动态变量-腾讯云开发者社区-腾讯云

    @each:循环语句

    1. <template>
    2. <button class="zh-button" :class="buttonClass">
    3.   <span v-if="$slots.default"><slot></slot></span>
    4. </button>
    5. </template>
    6. <script>
    7. const types=['primary','info','success','warning','danger']
    8. export default {
    9.   name:'zh-button',
    10.   props:{
    11.     type:{
    12.       type:String,
    13.       default:'',
    14.       validator(val){
    15.         if(val && !types.includes(val)){
    16.           console.error('类型不合法')
    17.         }
    18.         return true;
    19.       }
    20.     }
    21.   },
    22.   computed:{
    23.     buttonClass(){
    24.       let classes=[]
    25.       if(this.type){
    26.         classes.push(`zh-button--${this.type}`)
    27.       }
    28.       return classes;
    29.     }
    30.   }
    31. }
    32. </script>
    33. <style scoped lang="scss">
    34. $primary-color:#409eff;
    35. $success-color:#67c23a;
    36. .zh-button{
    37.   padding: 12px 20px;
    38.   border: none;
    39.   color: #fff;
    40.   &:hover{
    41.   }
    42.   &:focus,&:active{
    43.   }
    44.   @each $type,$color in (
    45.     primary:$primary-color,
    46.     success:$success-color,
    47.   ){
    48.     &--#{$type}{
    49.       background:$primary-color;
    50.     }
    51.   }
    52. }
    53. </style>

    icon*

    iconfont的symbol方式引入项目不显示_svg use symbol 不显示-CSDN博客

    order:1

    1. <template>
    2. <button class="zh-button" :class="buttonClass" v-on="$listeners">
    3.   <zh-icon :icon="icon" v-if="icon"></zh-icon>
    4.   <zh-icon icon="loading" v-if="loading" color="#fff"></zh-icon>
    5.   <span v-if="$slots.default"><slot></slot></span>
    6. </button>
    7. </template>
    8. <script>
    9. const types=['primary','info','success','warning','danger']
    10. export default {
    11.   name:'zh-button',
    12.   props:{
    13.     type:{
    14.       type:String,
    15.       default:'',
    16.       validator(val){
    17.         if(val && !types.includes(val)){
    18.           console.error('类型不合法')
    19.         }
    20.         return true;
    21.       }
    22.     },
    23.     icon:{
    24.       type:String,
    25.     },
    26.     iconPosition:{
    27.       type:String,
    28.       default:'left'
    29.     },
    30.     loading:{
    31.       type:Boolean,
    32.       default:false,
    33.     }
    34.   },
    35.   computed:{
    36.     buttonClass(){
    37.       let classes=[]
    38.       if(this.type){
    39.         classes.push(`zh-button--${this.type}`)
    40.       }
    41.       if(this.iconPosition){
    42.         classes.push(`zh-button--icon-${this.iconPosition}`)
    43.       }
    44.       return classes;
    45.     }
    46.   }
    47. }
    48. </script>
    49. <style scoped lang="scss">
    50. $primary-color:#409eff;
    51. $success-color:#67c23a;
    52. .zh-button{
    53.   padding: 12px 20px;
    54.   border: none;
    55.   color: #fff;
    56.   display: inline-flex;
    57.   vertical-align: middle;
    58.   align-items: center;
    59.   cursorpointer;
    60.   &:hover{
    61.   }
    62.   &:focus,&:active{
    63.   }
    64.   @each $type,$color in (
    65.     primary:$primary-color,
    66.     success:$success-color,
    67.   ){
    68.     &--#{$type}{
    69.       background:$primary-color;
    70.     }
    71.   }
    72.   &--icon-left{
    73.     > .icon{
    74.       order1;
    75.     }
    76.     > span{
    77.       order2;
    78.     }
    79.   }
    80.   &--icon-right{
    81.     > .icon{
    82.       order2;
    83.     }
    84.     > span{
    85.       order1;
    86.     }
    87.   }
    88. }
    89. </style>

    绑定事件

    单元测试(略)

    CSS*

    三角形*

    宽高 padding都不写,只设置border的话,border会自动根据对角线/三角形来划分

    1. <div class="triangle"></div>
    2. <div class="triangle-2"></div>

    1. .triangle{
    2.     width0;
    3.     height0;
    4.     border10px solid transparent;
    5.     border-right10px solid red;
    6. }
    7. .triangle-2{
    8.     width0;
    9.     height0;
    10.     border10px solid transparent;
    11.     border-right-color: red;
    12.     border-top-color: red;
    13. }

    垂直居中

    盒子定位

    定位:相对/绝对

    已知宽高:margin-left/calc

    未知宽高:transform

    flex布局

    让盒子实现固定宽高比

    绘制<1px的线*

    1. ::after创建虚拟元素
    2. transform  scale缩放

    1. .thin{
    2.   width200px;
    3.   height100px;
    4.   background: blue;
    5. }
    6. .thin::before{
    7.   content"";
    8.   display: block;
    9.   height1px;
    10.   background: red;
    11.   transform-origin0 0;
    12.   transformscale(10.5);
    13. }

    圣杯布局*

    左中右:左右固定,中间伸缩

    flex布局

    通过flex值来设置

    flex: 伸 缩 basis

    1. <div class="box">
    2.     <div class="left"></div>
    3.     <div class="middle"></div>
    4.     <div class="right"></div>
    5. </div>

    1. .box{
    2.     width100vw;
    3.     height100px;
    4.     display: flex;
    5. }
    6. .box .left,.box .right{
    7.     flex0 0 100px;
    8.     background: red;
    9. }
    10. .box .middle{
    11.     flex1;
    12.     background: blue;
    13. }

    定位

    1. 盒子左右padding
    2. 中间子盒子width:100%,左右盒子定位

    1. <div class="box">
    2.     <div class="left"></div>
    3.     <div class="middle"></div>
    4.     <div class="right"></div>
    5. </div>
    6. *{
    7.     box-sizing: border-box;
    8.     margin: 0;
    9.     padding: 0;
    10. }
    11. .box{
    12.     position: relative;
    13.     width: 100%;
    14.     padding: 0 100px;
    15.     height: 100px;
    16.     position: relative;
    17. }
    18. .box .left,.box .right{
    19.     width: 100px;
    20.     height: 100px;
    21.     position: absolute;
    22.     left0;
    23.     top0;
    24.     background: red;
    25. }
    26. .box .right{
    27.     left: auto;
    28.     right0;
    29. }
    30. .box .middle{
    31.     width: 100%;
    32.     height: 200px;
    33.     background: blue;
    34. }

    响应式的方案*

    PC不同像素:

    vw/vh:百分比布局。

    @media:媒体查询。微调,指定大小基于它微调。

    移动&PC:共用一套页面。比如官网。

    @media:基于设备尺寸写多套样式

    移动端:

    rem:等比缩放。相对于页面根元素大小设置rem值

  • 相关阅读:
    登录之后右上角改变 进入登录状态
    SpringBootApplication注解
    2022中国电子展,国产超高清技术掀起新兴浪潮
    springboot实现简单的注册登录功能
    【C++】动态内存管理 ② ( new 运算符 为 基础数据类型 / 基础数据数组类型 分配堆内存 )
    『手撕Vue-CLI』处理不同指令
    0-30 VDC 稳压电源,电流控制 0.002-3 A
    基于springboot实现休闲娱乐代理售票平台系统项目【项目源码+论文说明】
    dubbo发送过程编码失败,会唤醒发送线程吗?
    Linux系统之配置Nginx反向代理
  • 原文地址:https://blog.csdn.net/betterangela/article/details/134088027