Почему ширина игнорируется при использовании flex в Vuetify 3?

Используя Vuetify 3, я пытаюсь настроить собственную нумерацию страниц для таблицы. Все идет хорошо, за исключением того факта, что <v-select> игнорирует ширину при использовании flex.

<template>
  <v-app>
    <v-row class = "mt-2">
      <v-col cols = "12" sm = "12">
        <div class = "d-flex flex-wrap ga-3 justify-end">
          <!-- Items per Page -->
          <v-select
            class = "d-flex align-center"
            label = "Items per page"
            density = "comfortable"
            :model-value = "itemsPerPage"
            :items = "['5', '10', '25', '100']"
            variant = "outlined"
            @update:model-value = "itemsPerPage = parseInt($event,10)"
            style = "max-width: 150px"
          ></v-select>
          <p class = "d-flex align-center">
            {{ page * itemsPerPage - itemsPerPage + 1 }} - {{ page *
            itemsPerPage }} of {{ total }}
          </p>
          <!-- Pages selection -->
          <v-pagination
            class = "d-flex align-center"
            density = "comfortable"
            rounded = "circle"
            v-model = "page"
            :length = "pageCount"
            :total-visible = "6"
          ></v-pagination>
        </div>
      </v-col>
    </v-row>
  </v-app>
</template>

И сценарная часть (только ради ref, не более того)

<script setup>
  import { ref } from 'vue'

  const page = ref(1)
  const itemsPerPage = ref(10)
  const total = ref(150)
  const pageCount = ref(10)
</script>

Если вы посмотрите на <v-select>, то увидите, что style = "max-width: 150px" полностью игнорируется (в основном из-за class = "d-flex align-center", но я не знаю, как заставить его работать вместе).

Вот Vuetify Playground, чтобы в живом фрагменте лучше понять, что я имею в виду.

Обновлено:

Это первое изображение, как оно выглядит сейчас

И вот как я хочу, чтобы select выглядел (плюс выравнивание по центру, которое я не могу установить, кроме использования полей или отступов, но мне нужна более динамичная ситуация)

Любое предложение?

Вы правы, что встроенный стиль style = "max-width: 150px" в вашем v-select переопределяется классом d-flex. Вот два подхода к достижению желаемой ширины вашего v-select при сохранении макета flexbox.

Ravi Chauhan 26.04.2024 15:03

Возможно, я неправильно понимаю, но я не вижу, чтобы стиль был переопределен или проигнорирован. Элемент div, который является корневым элементом v-select, никогда не увеличивается более чем на 150 пикселей, что означает, что стиль max-width применяется правильно. Кроме того, если бы оно было переопределено, оно было бы вычеркнуто в инспекторе DOM, а это не так. Классы d-flex align-center находятся на родственном элементе, поэтому эти два стиля элемента не влияют друг на друга. Каким именно должен быть желаемый вид?

yoduh 26.04.2024 16:08

@yoduh, если вы откроете игровую площадку и удалите class = "d-flex align-center" внутри v-select, вы увидите, как выделение увеличивается в ширину (но оно потеряет выравнивание по центру). Я хочу сохранить эту ширину, не теряя гибкого выравнивания. Я обновлю вопрос двумя сравнительными изображениями.

alesssz 26.04.2024 16:24

Понятно, значит, я неправильно понял. Простите за это. Думаю, у меня есть решение, я опубликую его в ближайшее время.

yoduh 26.04.2024 16:37

@yoduh, твой ответ работает идеально, как и предполагалось, спасибо! Ваш ответ идеален!

alesssz 26.04.2024 17:04
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
5
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Глядя на DOM с помощью инспектора, часть проблемы заключается в том, что внутренний элемент div с классом v-input__control не использует полную ширину родительского div. Установка этого элемента на width: 100% поможет.

<style scoped>
  .v-select :deep(.v-input__control) {
    width: 100%;
  }
</style>

Другая проблема заключается в том, что для элемента входных данных зарезервировано некоторое пространство.

Если вы хотите использовать это пространство, вам нужно избавиться от этого элемента. На самом деле это можно сделать с помощью реквизита скрыть детали

Скрывает подсказки и ошибки проверки. Если установлено значение «авто», сообщения будут отображаться только в том случае, если есть сообщение (подсказка, сообщение об ошибке, значение счетчика и т. д.) для отображения.

Добавьте реквизит следующим образом:

<v-select
  class = "d-flex align-center"
  label = "Items per page"
  density = "comfortable"
  :model-value = "itemsPerPage"
  :items = "['5', '10', '25', '100']"
  variant = "outlined"
  @update:model-value = "itemsPerPage = parseInt($event, 10)"
  style = "max-width: 150px"
  hide-details
></v-select>

Это должно привести к желаемому виду.

Обновленная игровая площадка Vuetify

Другие вопросы по теме