Как расположить выпадающий список относительно тела, а не родительского, с помощью popper js

#javascript #twitter-bootstrap #bootstrap-4 #popper.js

#javascript #twitter-bootstrap #bootstrap-4 #popper.js

Вопрос:

В принципе, у меня есть таблица с возможностью прокрутки, а в последнем столбце есть многоточие, которое открывает выпадающий список, но поскольку таблица доступна для прокрутки, выпадающий список отключается.

Если вы посмотрите на реализацию выпадающих списков bootstrap с помощью popper js, у них есть пограничный параметр, который вы можете передать.

Вот как это выглядит сейчас:

введите описание изображения здесь

И это мой код до сих пор:

 <template>
    <div class="relative">
        <div @click="toggleDropdown" ref="trigger">
            <slot name="trigger"></slot>
        </div>

        <div :class="[widthClass]"
             @click="open = false"
             class="rounded-md shadow-lg bg-white border border-gray-100 dark:border-gray-700 dark:text-gray-300 dark:bg-gray-700 text-gray-600 dark:text-gray-300"
             ref="menu"
             v-show="open">
            <div :class="contentClasses" class="rounded-md shadow-xs">
                <slot name="content"></slot>
            </div>
        </div>
    </div>
</template>

<script>
    import {createPopper} from '@popperjs/core';

    export default {

        props: {
            width         : {
                default: '48',
            },
            contentClasses: {
                default: () => ['py-1'],
            },
        },

        computed: {
            widthClass() {
                return {
                    '48': 'w-48',
                    '56': 'w-56',
                    '64': 'w-64',
                }[this.width.toString()]
            },
        },

        data() {
            return {
                open: false
            }
        },

        methods: {
            toggleDropdown() {
                if (this.open) {
                    this.open = false;
                } else {
                    this.open = true;
                    createPopper(this.$refs.trigger, this.$refs.menu, {
                        placement: 'bottom-start',
                        container: 'body',
                        modifiers: [
                            {
                                name   : 'preventOverflow',
                                enabled: false,
                                options: {
                                    boundary    : document.body,
                                    altBoundary : true,
                                    rootBoundary: 'window',
                                }
                            }
                        ]
                    });
                }
            },
        },
    }
</script>
 

Честно говоря, я понятия не имею, что я делаю, документы popper js не содержат примеров, только диаграммы. Помощь будет оценена.

Ответ №1:

Используете ли вы bootstrap v5 или v4.5? Для меня это работает с версией 4.5 с атрибутом html. data-boundary="window" Но я не мог заставить его работать с v5, поэтому я, наконец, нашел другое решение:

 return new bootstrap.Dropdown(dropdownTriggerEl, {
            popperConfig: {
                strategy: "fixed"
            }
        });
 

без strategy выбора:

введите описание изображения здесь

с strategy опцией:

введите описание изображения здесь

Кстати. Все еще понятия не имею, как заставить его работать декларативно с data-bs-... атрибутами html.

Комментарии:

1. Я использую TailwindCSS, я только что ссылался на загрузочную реализацию Popper JS