前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >纯CSS实现带有画布边框和刻度尺的样式!

纯CSS实现带有画布边框和刻度尺的样式!

作者头像
执行上下文
发布2023-12-05 09:55:56
4510
发布2023-12-05 09:55:56
举报
文章被收录于专栏:执行上下文执行上下文

前提

有一个ui需求需要实现类似在线画布功能那种边框带刻度尺的效果。主要是上边框和左边框需要实现此UI效果。

效果如下

业务需求

除了上面的效果之外,还需要每个大刻度是需要点击选中的。并且选中还有单独的选中样式。

解决思路

1、第一种想法就是通过div实现,大刻度用边框来实现,里面的小刻度用10个标签来实现。

2、通过css的background-image属性种 linear-gradient 方法来实现。

3、第一种和第二种结合,外侧大标签用border来实现,里面的小刻度用background-image来实现。

实现方案

尝试过后可以完美实现刻度尺的样式。但是因为实际需求需要可以点击选中,而且选中后刻度颜色需要改变所以选中第三种方式来实现。

具体代码

数据结构

代码语言:javascript
复制
cemeteryData: [
    {
      name: 'B1',
      id: 'b1',
      active: false,
    },
    {
      name: 'B2',
      id: 'b2',
    },
]

HTML代码

代码语言:javascript
复制
<!-- 顶部刻度 -->
<div class="topScale">
  <div
    class="scaleItem"
    @click="topScale(list, index)"
    :class="list.active && 'scaleActive'"
    v-for="(list, index) in topScaleData"
    :key="list.id"
  >
    {{ index + 1 }}列
    <div class="scale"></div>
  </div>
</div>

CSS部分代码

代码语言:javascript
复制
.topScale {
  width: 100%;
  display: flex;

  .scaleItem {
    position: relative;
    flex: 1;
    height: 40px;
    text-align: center;
    cursor: pointer;
    border: 1px solid #83aef9;
    border-top: none;
    border-right: none;

    &:last-child {
      border-right: 1px solid #83aef9;
    }

    .scale {
      position: absolute;
      bottom: 0;
      left: 10%;
      width: 80%;
      height: 10px;
      background-image: linear-gradient(90deg, #83aef9 1px, transparent 0);
      background-size: 75px 0px, 11% 10px;
    }
    
    # 主要样式
    
    &.scaleActive {
      --active-color: #fddae2;
      background-color: var(--active-color);
      border-left-color: var(--active-color);
      border-bottom-color: var(--active-color);
    
      .scale {
        background-image: linear-gradient(90deg, var(--active-color) 1px, transparent 0);
      }
    
      &:last-child {
        border-right-color: var(--active-color);
      }
    
      + .scaleItem {
        border-left-color: var(--active-color);
      }
    }
  }
}

其中有两个地方需要注意,一个是 background-size: 75px 0px, 11% 10px; 11%是设置横向的时候小刻度的间隔,10px是设置纵向的时候刻度的间隔。

还有个就是选中之后的样式,因为大标签的刻度是用的border来实现的。为防止边框重叠设置的右边框没有,只有最后一个元素的右边框才有。所以在选中的时候当前item的右边框是没有的,所以就需要将选中右侧item的左边框设置选中颜色。通过 + .scaleItem来选中邻居class.

实现后的效果

从前ing

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 执行上下文 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前提
  • 业务需求
  • 解决思路
  • 实现方案
    • 具体代码
    • 实现后的效果
    • 从前ing
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档