Форум программистов, компьютерный форум, киберфорум
React/ReactJS
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1

CSS transition, max-height

10.10.2020, 21:02. Показов 1725. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

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

Проблема в том, что при "разворачивании" панели - иконки резко меняют позицию без использования свойства transition (указано по свойству, которое изменяется). (Если менять через панель разработчика в браузере свойства, которые меняются при наличии класса - то все идет с использованием transition)

Не могли бы вы подсказать в чем затык\ошибка? Это я не туда поместил transition (или не на то свойство) или же это косяк навешивания доп. класса для элемента?

В codepen копия работает более-менее корректно, в React-приложении же нет.

Кликните здесь для просмотра всего текста

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
export type SidePanelItem = {
    name: string;
    icon?: string;
};
 
export type SidePanelProps = {
    items: Array<SidePanelItem>;
    children: JSX.Element;
    onItemClick: (name: string) => void;
    expanded?: boolean;
};
 
export default function SidePanel(props: SidePanelProps): JSX.Element {
    const [state, setState] = React.useState<boolean>(props.expanded || true);
 
    const sidePanelItems: Array<SidePanelItem> =
            [
                {
                    name: 'Messaging',
                    icon: 'fax',
                },
                {
                    name: 'Gamification courses',
                },
                {
                    name: 'Contacts',
                    icon: 'address-card',
                },
                {
                    name: 'Snooring',
                    icon: 'bed',
                },
                {
                    name: 'Courses',
                    icon: 'user-graduate',
                }
            ];
 
    const className: string =
        state ? ' side-panel--expanded' : '';
    
    return (
        <div className={`side-panel${className}`}>
            <aside className="side-panel__panel" style={{ backgroundColor: "#462B45", color: "#000"}}>
                <hr/>
                <ul className="side-panel__items">
                    {sidePanelItems.map(item => generateSidePanelItem(item))}
                </ul>
                {generateExpander(state, () => setState(!state))}
            </aside>
            <main className="side-panel__content-container">
                <div className="side-panel__side-content">
                    {props.children}
                </div>
            </main>
        </div>
    );
};
 
const generateExpander = (expanded: boolean, clickHandler: () => void): JSX.Element => {
    const content =
        expanded
            ? (<div className="side-panel__expander-menu" onClick={clickHandler}>
                <span>Collapse</span>
                <i className="fas fa-angle-double-left" />
            </div>)
            : (<div className="side-panel__expander-menu" onClick={clickHandler}>
                <i className="fas fa-angle-double-right" />
            </div>);
 
    return (
        <div className="side-panel__expander" onClick={clickHandler}>
            {content}
        </div>);
};
 
const generateSidePanelItem = (item: SidePanelItem): JSX.Element => {
    const elementClass: string = isNullOrUndefined(item.icon) ? ' side-panel__item--no-icon' : '';
    const iconClass: string = isNullOrUndefined(item.icon) ? ' icon--empty' : ` fa-${item.icon}`;
 
    return (
        <li className={`side-panel__item${elementClass}`}>
            <i className={`fas${iconClass}`}/>
            <span>{item.name}</span>
        </li>
    );
};
SCSS
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
$transition: 0.1s cubic-bezier(0.45, 0.05, 0.55, 0.95);
 
.side-panel {
    &__panel {
        width: 4.5em;
        position: fixed;
        z-index: 1;
        bottom: 0;
        top: 3.5em;
        padding: 1.5em 0 0;
 
        display: flex;
        flex-direction: column;
 
        transition: $transition width;
    }
 
    hr {
        margin: 0.5em 1.25em 0.5em 0.75em;
    }
 
    &__items {
        list-style: none;
 
        margin: 1em 0 0 0;
        padding: 0;
        flex-grow: 1;
    }
 
    &__item {
        font-size: 1.25em;
        padding: 0.5em 1em;
        max-height: 2.5em;
 
        cursor: pointer;
        user-select: none;
        text-transform: capitalize;
 
        transition: 0.125s ease background-color,
            $transition max-height;
        display: flex;
        align-items: center;
        overflow: hidden;
 
        &--no-icon i.fas {
            margin-right: 1em;
        }
 
        &:hover {
            background-color: rgba(0, 0, 0, 0.25);
        }
        &:active {
            background-color: rgba(0, 0, 0, 0.5);
        }
 
        .fas {
            margin-right: 0.75em;
            width: 1.5em;
 
            &.icon--empty::before {
                content: attr(data-letter);
                font-size: larger;
            }
        }
 
        span {
            visibility: hidden;
        }
    }
 
    &__expander {
        width: 4.5em;
 
        transition: $transition all;
 
        &-menu {
            height: 46px;
            padding: 0.5em 1em;
            display: flex;
            justify-content: center;
            align-items: center;
 
            cursor: pointer;
 
            span {
                display: none;
 
                font-size: 20px;
                flex: 1;
                display: flex;
                justify-content: center;
 
                user-select: none;
            }
 
            &:hover {
                background-color: rgba(0, 0, 0, 0.25);
            }
            &:active {
                background-color: rgba(0, 0, 0, 0.5);
            }
        }
    }
 
    &--expanded {
        .side-panel {
            &__panel {
                width: 15em;
                white-space: pre-line;
 
                .side-panel {
                    &__item {
                        width: 12em;
                        max-height: 5em;
 
                        span {
                            visibility: visible;
                        }
                    }
 
                    &__expander {
                        width: 15em;
 
                        &-menu {
                            align-items: baseline;
 
                            span {
                                display: inline;
                            }
                        }
                    }
                }
            }
 
            &__content-container {
                padding-left: 15em;
            }
        }
    }
 
    &__content-container {
        padding-left: 5em;
        margin: 4em 0.5em 0.5em;
 
        transition: $transition padding-left;
 
        .side-panel__side-content {
            border: 1px solid rgba(0, 0, 0, 0.125);
            border-radius: 0.25rem;
            padding: 0.5em;
        }
    }
}


Спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.10.2020, 21:02
Ответы с готовыми решениями:

max-height и min-height резиновый блок
есть див &lt;div class=&quot;main&quot;&gt;&lt;/div&gt; подключены стили .main{ border:1px solid #0C0; max-width:3000px; min-width:1000px; ...

Не работает ни animation, ни transition для свойства height
Здравствуйте, у меня не работает ни анимация, ни переход свойства height div'а. Анимация: @-webkit-keyframes scroll-up-down { ...

Что такое -webkit-transition, -moz-transition, -o-transition?
Изучаю анимацию в css с помощью transition. В каждом примере вижу похожую запись. -webkit-transition: top 1s ease-out 0.5s; ...

4
 Аватар для Ovederax
604 / 404 / 212
Регистрация: 30.04.2017
Сообщений: 744
Записей в блоге: 1
11.10.2020, 07:26
Цитата Сообщение от bodynar Посмотреть сообщение
Не могли бы вы подсказать в чем затык\ошибка?
текст span сразу исчезает при display none; и размер item сразу прыгает в уменьшение/увеличение
попробуй использовать opacity для скрытия и показа текста
в codepen стало плавно сворачивать элементы
Цитата Сообщение от bodynar Посмотреть сообщение
в React-приложении же нет.
я вижу visibility: hidden; в scss на 67 строке
как я понимаю он должен работать по аналогии с opacity (по документации не убирает элемент из верстки)
и в codepen он дает такую же плавность
обрати внимание на строки 86 и 129 убрав display и применив visibility/opacity
1
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
13.10.2020, 13:27  [ТС]
Ovederax, Пробовал скрывать текст элементов меню (li > span) через visibility и opacity - результат нулевой, т.е. иконки все равно "скачут" резко.
Но почему точь-в-точь разметка и стили в react и в codepen работают по-разному - не могу понять.

Если менять параметры через панель разработчика в браузере (видимость, максимальная высота) - без клика, то все транзитивно изменяется

Возможно ли, что я чуть позже залью код в репозиторий, и вы посмотрите его на своей машине?
0
 Аватар для Ovederax
604 / 404 / 212
Регистрация: 30.04.2017
Сообщений: 744
Записей в блоге: 1
13.10.2020, 16:16
Цитата Сообщение от bodynar Посмотреть сообщение
Возможно ли, что я чуть позже залью код в репозиторий, и вы посмотрите его на своей машине?
ну если и не я, то возможно кто-то другой сможет увидеть ошибку
0
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
14.10.2020, 02:11  [ТС]
Разобрался. Проблема никак не связана с css. Для генерации элементов я также использую уникальные идентификаторы, которые генерирую непосредственно в компоненте. При смене состояния реакт выполняет ре-рендер, в рамках которого идентификаторы заново генерируются и поддерево элементов изменяется, из-за этого transition не отрабатывает
В первом сообщении не указал, так как не посчитал нужным, но данный участок "все ломал"
JavaScript
1
2
3
4
5
const mappedMenuItems: Array<SidePanelItem & { uid: string }> =
        props.items.map(menuItem => ({
            ...menuItem,
            uid: generateUid()
        }));
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.10.2020, 02:11
Помогаю со студенческими работами здесь

Центрировать изображение с max-height:100% и max-width:100%
Здравствуйте. Есть блок с высотой 300px и шириной 30%, внутри блока есть картинка. размер картинки может быть любой и надо чтобы он...

CSS transition
Добрый день! Подскажите пожалуйста, необходимо сделать 4 наклона шестиугольника с помощью переходов, я сделал наклон необходимо...

CSS Transition
Добрый день уважаемые спецы. Написал на css и html выпадающее меню, хотел немного украсить с помощью transition , но почему то работает как...

Не работают transition в CSS
По каким то причинам не работают переходы. Более того, в PHPStorm эти свойства отображаются как Unknown. Что я не так делаю? Подскажите,...

Непонятки с css. Не работает transition
Вопрос почему не работает transition. Изучаю возможности scss и столкнулся с этой проблемкой. Есть код &lt;!DOCTYPE html&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru