Vuetify v-select 组件宽度改变

2024-04-18

My v-select组件应该有固定的宽度(60px),它们适合表格单元格,我想防止它们在选择值后更改宽度。

它们会更改宽度,并且下拉箭头在选择后会向右移动,因此如果有办法减小图标或其填充/边距的大小,可能会有所帮助。

真的不知道如何获取这个箭头的道具以及如何调用。

这是可重现的

https://codesandbox.io/s/competent-dew-eixq2?file=/src/components/Playground.vue https://codesandbox.io/s/competent-dew-eixq2?file=/src/components/Playground.vue

编辑:添加片段

<!DOCTYPE html>
<html>

<head>
  <link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
  <link href="https://cdn.jsdelivr.net/npm/@mdi/[email protected] /cdn-cgi/l/email-protection/css/materialdesignicons.min.css" rel="stylesheet">
  <link href="https://cdn.jsdelivr.net/npm/[email protected] /cdn-cgi/l/email-protection/dist/vuetify.min.css" rel="stylesheet">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui">
  <style>
    .select {
      max-width: 60px;
      max-height: 60px;
      font-size: 11px;
    }
    
    .col {
      max-width: 60px;
      max-height: 60px;
    }
  </style>
</head>

<body>
  <div id="app">
    <v-app>
      <v-row>
        <div class="col" v-for="col in cols" :key="col">
          <v-select class="select" :items="variants" item-value="name" item-text="name" label="" dense outlined hide-details single-line v-model="selected">
          </v-select>
        </div>
      </v-row>
    </v-app>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/[email protected] /cdn-cgi/l/email-protection/dist/vue.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/[email protected] /cdn-cgi/l/email-protection/dist/vuetify.js"></script>
  <script>
    new Vue({
      el: '#app',
      vuetify: new Vuetify(),
      data: {
        selected: "",
        cols: [1, 2, 3, 4, 5],
        variants: [{
            id: 0,
            name: ""
          },
          {
            id: 1,
            name: "1:0"
          },
          {
            id: 2,
            name: "0:1"
          },
          {
            id: 3,
            name: "1:0 B"
          },
          {
            id: 4,
            name: "0:1 B"
          },
          {
            id: 6,
            name: "1:0 R"
          },
          {
            id: 7,
            name: "0:1 R"
          },
          {
            id: 8,
            name: "1:0 F"
          },
          {
            id: 9,
            name: "0:1 F"
          },
        ],
      },
    })
  </script>
</body>

</html>

基本问题是 v-select 有一些样式(特别是填充和边距)在小宽度下效果不佳。

这是渲染的 v-select 的innerHTML,其中的样式需要减少

<div class="select...">                                      
  <div class="v-input__control">
    <div role="button" class="v-input__slot">                <!-- padding-right: 12px; -->
      <div class="v-select__slot">
        <div class="v-select__selections">                               
          <div class="v-select__selection--comma">           <!-- margin-right: 4px; -->
            1:0 B
          </div>
        </div>
        <div class="v-input__append-inner">                  <!-- padding-left: 4px; -->
          <div class="v-input__icon v-input__icon--append">  <!-- width: 24px; min-width: 24px;-->
            <i aria-hidden="true" class="v-icon..."></i>                 
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

除了这些 insideHTML 更改之外,您还需要每列 60px 的固定宽度,因此请更改

<style>
  .select {
    max-width: 60px;
    ...
  }

to

<style>
  .select {
    width: 60px;
    ...
  }

调整 Vuetify 内部样式

查看有关样式的 Vuetify 问题,有人建议使用无范围样式块或深层样式块,但这对我来说都不起作用。 Vuetify 表示,他们正在努力改进样式的应用方式以克服这些问题。

幸运的是,Vue 本身就有工具可以用 javascript 来实现这一点。

这些是关键步骤

  • 添加对 v-select 的引用,以便可以在 javascript 中访问它
  • 向 v-select 添加更改处理程序,以便在用户选择某些内容时可以重新设置元素的样式
  • 定义对象中的样式调整,以便您可以轻松调整它们
  • 添加应用样式的方法
  • 调用中的方法mounted()和 v 选择@change handler
  • use Vue.nextTick()允许 Vuetify 首先设置样式,然后应用我们的自定义样式

这是调整后的代码片段。我放入了一些非常小的填充和边距,并最大化了所选值的空间(以避免文本换行)。您可能想尝试一下这些样式,因为我不确定我是否理解所有要求。

<!DOCTYPE html>
<html>

<head>
  <link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
  <link href="https://cdn.jsdelivr.net/npm/@mdi/[email protected] /cdn-cgi/l/email-protection/css/materialdesignicons.min.css" rel="stylesheet">
  <link href="https://cdn.jsdelivr.net/npm/[email protected] /cdn-cgi/l/email-protection/dist/vuetify.min.css" rel="stylesheet">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui">
  <style>
    .select {
      width: 60px;
      max-height: 60px;
      font-size: 11px;
    }
    
    .col {
      max-width: 60px;
      max-height: 60px;
    }
  </style>
</head>

<body>
  <div id="app">
    <v-app>
      <v-row>
        <div class="col" v-for="col in cols" :key="col">
          <v-select ref="select" @change="applyCustomStyles"
 class="select" :items="variants" item-value="name" item-text="name" label="" dense outlined hide-details single-line v-model="selected">
          </v-select>
        </div>
      </v-row>
    </v-app>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/[email protected] /cdn-cgi/l/email-protection/dist/vue.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/[email protected] /cdn-cgi/l/email-protection/dist/vuetify.js"></script>
  <script>
    const customStyles = {
      ".v-input__slot": {
        padding: "0 0 0 4px",
      },
      ".v-select__selections": {
        width: "27px",
      },
      ".v-select__selection--comma": {
        margin: "7px 0 7px 0",
      },
      ".v-input__append-inner": {
        "padding-left": "0",
      },
      ".v-input__icon": {
        width: "14px",
        "min-width": "14px",
      },
    };

    new Vue({
      el: '#app',
      vuetify: new Vuetify(),
      mounted() {
        this.applyCustomStyles();
      },
      methods: {
        applyCustomStyles() {
          Vue.nextTick(() => {
            this.$refs.select.forEach((vSelect) => {
              Object.entries(customStyles).forEach(([selector, styles]) => {
                Object.entries(styles).forEach(([style, value]) => {
                  vSelect.$el.querySelector(selector).style[style] = value;
                });
              });
            });
          });
        },
      },
      data: {
        selected: "",
        cols: [1, 2, 3, 4, 5],
        variants: [{
            id: 0,
            name: ""
          },
          {
            id: 1,
            name: "1:0"
          },
          {
            id: 2,
            name: "0:1"
          },
          {
            id: 3,
            name: "1:0 B"
          },
          {
            id: 4,
            name: "0:1 B"
          },
          {
            id: 6,
            name: "1:0 R"
          },
          {
            id: 7,
            name: "0:1 R"
          },
          {
            id: 8,
            name: "1:0 F"
          },
          {
            id: 9,
            name: "0:1 F"
          },
        ],
      },
    })
  </script>
</body>

</html>

为什么不一个<style> block?

建议使用无范围样式块来覆盖 Vuetify 样式。

例如,

<style>
  .select .v-input__slot {
   padding-right: 4px
  }
  ...
</style>

问题是 Vuetify 样式是在组件上声明的样式之后应用的。

您可以通过应用比 Vuetify 使用的更高的特异性来做到这一点,例如

<style>
  .select.v-text-field.v-text-field--enclosed:not(.v-text-field--rounded)>.v-input__control>.v-input__slot {
  padding-right: 4px
}
</style>

给你这个

因此您可以找出所有需要更改的现有位置并复制 Vuetify 选择器。

当使用新版本的 Vuetify 或更改组件的形状时,可能会出现此问题。对我来说,javascript 解决方案看起来更易于管理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vuetify v-select 组件宽度改变 的相关文章

随机推荐

  • 无法让复杂的 mysql 查询工作

    我正在尝试编写一个 mysql 查询 但遇到了一些问题 我正在尝试从我的 Wordpress 数据库中查询 WooCommerce 数据 基本发票数据存储在 wp posts 表中 其余数据存储在 wp postmeta 表中 现在wp p
  • 在一行中设置多个变量

    在 perl 中 我可以在一行中定义一堆变量 my value 0 my a b c value 有没有类似的 C 方法可以做到这一点 这是我所拥有的 const bool free true bool t1 t2 t3 private v
  • 在使用 CTE 模拟的 UPSERT 中生成默认值

    在 PostgreSQL 中模拟 UPSERT 的可写 CTE 看起来相当优雅 直到我们在 Postgres 中获得实际的更新插入 合并 请参阅 https stackoverflow com a 8702291 558819 https
  • 使用Python子进程处理带括号的文件路径

    我要处理的文件的路径中包含括号 path dir file with parentheses txt 我正在尝试用 Python 处理它们 如下所示 subprocess call process s path shell True 但是
  • MongoDB Ruby 驱动程序 - “同步”:无法从陷阱上下文调用

    我试图使用 Kernel trap 捕获信号 并在该上下文中运行数据库请求 但出现上述错误 以前有人遇到过吗 有什么办法解决吗 示例代码 trap HUP do db db name update id 123 set gt a 1 end
  • 如何从 Autodesk Forge API 按项目获取评论和传输?

    我试图找到一种获取评论和传输的方法 但在 BIM360 API 或数据管理 API 中没有找到它 可以获得吗 目前尚未公开 BIM 360 的审核和传输 API 有一个Review API的愿望 ALEX 37150 API 希望 公开文档
  • 如何创建 Typescript 类的泛型类型的新实例?

    如何在 Typescript 中按预期完成以下工作 export class ProxyObject
  • 在 Arduino 上将整数/小数转换为十六进制?

    如何将整数或小数变量转换为十六进制字符串 我可以做相反的事情 将十六进制转换为整数 但我无法找出其他方法 这是为了Serial print 数组中的十六进制值 查看 Arduino 字符串教程here http arduino cc en
  • 删除图像上绘制的文本的顶部和底部填充

    我正在从指定的文本生成图像 但我面临一个问题 我无法删除生成的图像内绘制文本的顶部和底部填充 我尝试在使用时更改字符串格式Graphics DrawString 但我只设法删除了左右填充 private void button1 Click
  • Android - setRequestedOrientation - 活动和视图生命周期

    我在使用 JNI 的本机代码方面遇到了一些问题 我怀疑这可能是由于调用setRequestedOrientation 当我打电话时活动会发生什么setRequestedOrientation 是刚刚重新启动还是完全被破坏了 另外 视图会发生
  • 如何即时命名变量?

    是否可以动态创建新的变量名称 我想将列表中的数据帧读取到末尾带有数字的新变量中 比如 orca1 orca2 orca3 如果我尝试类似的事情 paste orca i sep list name i 我收到这个错误 target of a
  • NSLocale currentLocale 始终返回“en_US”而不是用户当前的语言

    我正在国际化 iPhone 应用程序 我需要根据用户当前的区域设置对某些视图进行编程更改 我快要疯了 因为无论 iPhone 模拟器或实际硬件上的语言偏好是什么 locale始终评估为 en US NSString locale NSLoc
  • Unity fps 旋转相机

    在我的游戏中 我有一个摄像头 我希望将 FPS 之类的旋转附加到该摄像头上 因此 如果我将光标向左移动 我希望凸轮向左旋转 如果我向上移动光标 那么凸轮应该向上看 等等 我目前已经部分工作 我可以左看 右看 上看 下看 当我向下看然后左右移
  • 从Python中的当前日期获取7天前的日期[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我试图在 python 中获取从当前日期开始 7 天前的日期 谁能帮我 import datetime as DT today DT da
  • 如何处理在 JQuery 中返回字符串的 JSON 请求?

    json jQuery 新手 如果这有一个明显的答案 我很抱歉 我正在 jQuery 中执行 ajax 请求 如下所示 ajax url theURL dataType jsonp type get success function dat
  • ServiceRoute + WebServiceHostFactory 杀死 WSDL 生成?如何使用 ?wsdl 创建无扩展的 WCF 服务

    我正在尝试使用无扩展名 无 svc WCF 服务 其他人可以确认或否认我遇到的问题吗 我在代码中使用路由 并在 global asax cs 的 Application Start 中执行此操作 RouteTable Routes Add
  • 将用户从 SP 中注销,但不从 IDP 中注销

    是否可以将用户从使用 SAML 身份验证的应用程序中注销 但让他们保持登录 IDP 的状态 以便他们可以继续访问其他服务提供商 我希望能够将用户从应用程序中注销 并让他们在返回应用程序时进行身份验证 而无需将其从 IDP 中注销 即我不想使
  • 放弃支持库 v7。我做错了什么?

    我需要为 2 3 及更高版本的设备添加操作栏 我最近知道了 appcompat v7 支持库 它正是这样做的 我已经按照支持库设置指南 http developer android com tools support library set
  • Debian 在没有桌面的情况下启动 Qt GUI 应用程序

    我在 SBC 上运行 Debian 2 6 我计划在嵌入式设置中使用它 我需要做的是配置它 以便 linux 启动并运行我的 Qt GUI 应用程序 我是否需要窗口管理器来执行此操作 或者我可以使用 X11 来执行此操作吗 另外 因为它将用
  • Vuetify v-select 组件宽度改变

    My v select组件应该有固定的宽度 60px 它们适合表格单元格 我想防止它们在选择值后更改宽度 它们会更改宽度 并且下拉箭头在选择后会向右移动 因此如果有办法减小图标或其填充 边距的大小 可能会有所帮助 真的不知道如何获取这个箭头