Angular Accordion 구성 요소 개요

    What is Angular Accordion?

    Angular Accordion은 클릭 가능한 헤더와 관련 콘텐츠 섹션이 단일 컨테이너에 표시되는 수직 확장형 패널을 구축하기 위한 GUI 구성 요소입니다. 아코디언은 일반적으로 단일 페이지에서 콘텐츠의 여러 섹션을 스크롤할 필요성을 줄이는 데 사용됩니다. 기본 패널의 확장 상태를 제어하기 위한 키보드 탐색 및 API를 제공합니다.

    사용자는 썸네일이나 라벨과 같은 항목 목록 간에 상호 작용하고 탐색할 수 있습니다. 포함된 정보를 표시하기 위해 각 항목을 전환(확장 또는 축소)할 수 있습니다. 구성에 따라 한 번에 하나 또는 여러 개의 확장된 항목이 있을 수 있습니다.

    Angular Accordion Example

    다음은 FAQ 섹션의 기본 Angular Accordion 예입니다. 개별 작업 섹션이 있는 아코디언처럼 작동합니다. 한 번의 클릭으로 각 텍스트 블록을 전환하는 동시에 여러 패널을 동시에 확장할 수 있습니다. 이렇게 하면 매번 이전에 열었던 섹션을 숨기는 자동 확장 및 축소 패널 사이를 오갈 필요 없이 정보를 더 쉽게 읽을 수 있습니다.

    여기서는 igx-accrodion 및 해당 확장 패널을 정의하는 방법을 볼 수 있습니다. 또한 이 샘플은 두 가지 유형의 확장 동작을 보여줍니다. 스위치 버튼은 한 번에 확장할 단일 분기와 다중 분기 사이를 전환하도록 SingleBranchExpand 속성을 설정합니다.

    Getting Started with Ignite UI for Angular Accordion

    Ignite UI for Angular Accordion 구성 요소를 시작하려면 먼저 Ignite UI for Angular 설치해야 합니다. 기존 Angular 애플리케이션에서 다음 명령을 입력합니다.

    ng add igniteui-angular
    

    Ignite UI for Angular에 대한 전체 소개를 보려면 시작하기 항목을 읽어보세요.

    다음 단계는 IgxAccordionModule 당신의 app.module.ts 파일.

    // app.module.ts
    
    ...
    import { IgxAccordionModule } from 'igniteui-angular';
    // import { IgxAccordionModule } from '@infragistics/igniteui-angular'; for licensed package
    
    @NgModule({
        ...
        imports: [..., IgxAccordionModule],
        ...
    })
    export class AppModule {}
    

    또는 16.0.0부터 IgxAccordionComponent 독립 실행형 종속성으로 가져오거나 IGX_ACCORDION_DIRECTIVES 토큰을 사용하여 구성 요소와 모든 지원 구성 요소 및 지시문을 가져올 수 있습니다.

    // home.component.ts
    
    ...
    import { IGX_ACCORDION_DIRECTIVES } from 'igniteui-angular';
    // import { IGX_ACCORDION_DIRECTIVES } from '@infragistics/igniteui-angular'; for licensed package
    
    @Component({
        selector: 'app-home',
        template: `
        <igx-accordion>
            <igx-expansion-panel>
                <igx-expansion-panel-header>
                    <igx-expansion-panel-title>Title Panel 1</igx-expansion-panel-title>
                </igx-expansion-panel-header>
                <igx-expansion-panel-body>
                    Content Panel 1
                </igx-expansion-panel-body>
            </igx-expansion-panel>
        </igx-accordion>
        `,
        styleUrls: ['home.component.scss'],
        standalone: true,
        imports: [IGX_ACCORDION_DIRECTIVES]
        /* or imports: [IgxAccordionComponent] */
    })
    export class HomeComponent {}
    

    이제 Ignite UI for Angular 가져왔으므로 igx-accordion 및 해당 패널의 기본 구성으로 시작할 수 있습니다.

    Using the Angular Accordion Component

    IgxAccordionComponent의 각 섹션은 확장 패널을 사용하여 정의됩니다. 패널은 요구 사항에 따라 패널 상태를 구성할 수 있는 기능을 제공하는 비활성화된 속성, 축소된 속성animationSettings 속성을 제공합니다.

    Declaring an accordion

    아코디언은 내부에 선언된 모든 igx-expansion-panel 래핑합니다.

    <igx-accordion #accordion [singleBranchExpand]="true">
        <igx-expansion-panel>
            <igx-expansion-panel-header>
                <igx-expansion-panel-title>Title Panel 1</igx-expansion-panel-title>
            </igx-expansion-panel-header>
            <igx-expansion-panel-body>
                Content Panel 1
            </igx-expansion-panel-body>
        </igx-expansion-panel>
        <igx-expansion-panel>
            <igx-expansion-panel-header>
                <igx-expansion-panel-title>Title Panel 2</igx-expansion-panel-title>
            </igx-expansion-panel-header>
            <igx-expansion-panel-body>
                Content Panel 2
            </igx-expansion-panel-body>
        </igx-expansion-panel>
    </igx-accordion>
    

    사용하여 패널 접근자는 모든 항목을 포함하는 컬렉션에 대한 참조를 얻을 수 있습니다. 확장 패널의 아이들 igx-accordion.

    @ViewChild('accordion', { static: true })
    public accordion!: IgxAccordionComponent;
    
    this.accordion.panels;
    

    위에서 설명한 것처럼, SingleBranchExpand 속성을 사용하면 한 번에 단일 패널 또는 여러 패널을 확장할 수 있는지 여부를 설정할 수 있습니다.

    Angular Accordion Animations

    Angular Accordion은 패널의 확장 및 축소 작업에 대한 애니메이션을 지원합니다. 애니메이션 동작을 사용자 정의할 수 있습니다. 일반적으로 애니메이션은 각 확장 패널에 대해 개별적으로 설정할 수 있습니다. 그러나 IgxAccordionComponent 수준에서는 모든 패널에 동시에 적용할 수도 있습니다. 이를 통해 사용자는 IgxAccordionComponent의 animations 속성을 통해 모든 섹션의 애니메이션을 한 번에 비활성화할 수 있습니다.

    애니메이션과 관련하여 두 가지 옵션이 있습니다. 먼저 아코디언 구성 요소에 animationSettings 속성을 설정할 수 있습니다.

    import { useAnimation } from '@angular/animations';
    import { slideInLeft, slideOutRight } from 'igniteui-angular';
    // import { slideInLeft, slideOutRight } from '@infragistics/igniteui-angular'; for licensed package
    
    @Component({
        ...
    })
    export class AccordionComponent {
        public animationSettingsCustom = {
            closeAnimation: useAnimation(slideOutRight, {
                params: {
                    duration: '100ms',
                    toPosition: 'translateX(25px)'
                }
            }),
            openAnimation: useAnimation(slideInLeft, {
                params: {
                    duration: '500ms',
                    fromPosition: 'translateX(-15px)',
                    startOpacity: 0.1
                }
            })
        };
    }
    

    보시다시피 우리는 slideInLeft 그리고 slideOutRight 우리의 애니메이션 내장된 애니메이션 제품군 컨텐츠를 접을 때 컴포넌트 컨텐츠가 왼쪽부터 나타나고 오른쪽으로 사라지도록 합니다. 일부 애니메이션 매개변수를 재정의하여 애니메이션을 추가로 사용자 정의합니다.

    다음 스니펫은 애니메이션 설정을 구성요소에 전달하는 방법을 보여줍니다.

    <igx-accordion #accordion [animationSettings]="animationSettingsCustom">
        ...
    </igx-accordion>
    
    Note

    IgxAccordionComponent의 애니메이션을 끄려면 animationSettings​ ​null로 설정할 수 있습니다.

    또는 모든 단일 확장 패널animationSettings 입력을 설정할 수 있습니다.

    <igx-accordion #accordion [singleBranchExpand]="true">
         <igx-expansion-panel [animationSettings]="slideLeftRightSettings">
            <igx-expansion-panel-header>
                <igx-expansion-panel-title>Title Panel 1</igx-expansion-panel-title>
            </igx-expansion-panel-header>
            <igx-expansion-panel-body>
                Content Panel 1
            </igx-expansion-panel-body>
        </igx-expansion-panel>
        <igx-expansion-panel [animationSettings]="slideTopBottomSettings">
            <igx-expansion-panel-header>
                <igx-expansion-panel-title>Title Panel 2</igx-expansion-panel-title>
            </igx-expansion-panel-header>
            <igx-expansion-panel-body>
                Content Panel 2
            </igx-expansion-panel-body>
        </igx-expansion-panel>
    </igx-accordion>
    

    CollapseAllExpandAll 메소드를 사용하면 프로그래밍 방식으로 IgxAccordion의 모든 IgxExpansionPanel을 각각 축소 및 확장할 수 있습니다.

    Note

    SingleBranchExpand 속성이 true로 설정된 경우 ExpandAll 메소드를 호출하면 마지막 패널만 확장됩니다.

    Angular Accordion Templating Example

    Angular Accordion 구성 요소를 사용하면 헤더와 콘텐츠 패널의 모양을 사용자 정의할 수 있습니다. 아래 샘플은 IgxExpansionPanel의 내장 템플릿 기능을 사용하여 정교한 필터링 옵션을 구현하는 방법을 보여줍니다.

    Nested Angular Accordions Scenario

    다음 Angular 아코디언 예제에서는 이 일반적인 애플리케이션 시나리오를 어떻게 진행할 수 있는지 설명하기 위해 복잡한 FAQ 섹션을 만들 것입니다. 샘플에서 중첩된 IgxAccordionComponent는​ ​확장 패널 본체 내부에 아코디언을 추가하여 구현됩니다.

    <igx-accordion #accordion>
         <igx-expansion-panel>
            <igx-expansion-panel-header>
                <igx-expansion-panel-title>Title Panel 1</igx-expansion-panel-title>
            </igx-expansion-panel-header>
            <igx-expansion-panel-body>
                <igx-accordion #childAccordion>
                    <igx-expansion-panel>
                        <igx-expansion-panel-header>
                            <igx-expansion-panel-title>Title Nested Panel 1</igx-expansion-panel-title>
                        </igx-expansion-panel-header>
                        <igx-expansion-panel-body>
                            Content Nested Panel 1
                        </igx-expansion-panel-body>
                    </igx-expansion-panel>
                    ...
                </igx-accordion>
            </igx-expansion-panel-body>
        </igx-expansion-panel>
        ...
    </igx-accordion>
    

    아래에서 결과를 볼 수 있습니다.

    Keyboard Navigation

    Ignite UI for Angular의 키보드 탐색은 최종 사용자에게 다양한 키보드 상호 작용을 제공합니다. 이 기능은 기본적으로 활성화되어 있으며 최종 사용자가 패널을 쉽게 탐색할 수 있도록 해줍니다. IgxAccordionComponent 탐색은 W3C 접근성 표준을 준수하며 사용이 편리합니다.

    주요 조합

    • Tab- 포커스를 첫 번째(포커스가 아코디언 이전에 있는 경우)/다음 패널로 이동합니다.
    • Shift + Tab- 포커스를 마지막으로 이동(포커스가 아코디언 뒤에 있는 경우)/이전 패널
    • 아래쪽 화살표- 포커스를 아래 패널로 이동합니다.
    • 위쪽 화살표- 포커스를 위 패널로 이동합니다.
    • Alt + 아래쪽 화살표- 아코디언에서 초점이 맞춰진 패널을 확장합니다.
    • Alt + 위쪽 화살표- 아코디언에서 초점이 맞춰진 패널을 축소합니다.
    • Shift + Alt + 아래쪽 화살표- 활성화된 모든 패널 확장(singleBranchExpand가 true로 설정된 경우 마지막으로 활성화된 패널 확장)
    • Shift + Alt + 위쪽 화살표- 활성화된 모든 패널 축소
    • - 아코디언에서 활성화된 첫 번째 패널로 이동합니다.
    • - 아코디언에서 마지막으로 활성화된 패널로 이동합니다.

    Angular Accordion Styling

    아코디언은 기본 패널의 컨테이너 역할만 합니다. IgxExpansionPanel 항목의 스타일 지정 섹션에 설명된 대로 스타일은 패널 테마를 통해 직접 적용할 수 있습니다.

    설계상 확장 패널이 igx-accordion 내에 배치되는 경우 확장 패널에 여백이 설정됩니다. 이를 수정하기 위해 igx-expansion-panel 테마 내에 노출된 속성이 있습니다. 테마 엔진이 제공하는 기능을 활용하려면 스타일 파일에 index 파일을 가져와야 합니다.

    @use "igniteui-angular/theming" as *;
    
    // IMPORTANT: Prior to Ignite UI for Angular version 13 use:
    // @import '~igniteui-angular/lib/core/styles/themes/index';
    

    가장 간단한 접근 방식에 따라 확장 패널 테마를 확장하고 $expanded-margin 매개변수를 허용하는 새 테마를 만듭니다.

    $custom-panel-theme: expansion-panel-theme(
        $expanded-margin: 0px
    );
    

    Using CSS Variables

    마지막 단계는 구성 요소의 테마를 포함하는 것입니다.

    :host {
        @include css-vars($custom-panel-theme);
    }
    

    Using Theme Overrides

    Internet Explorer 11에서 구성 요소의 스타일을 지정하려면 CSS 변수가 지원되지 않기 때문에 다른 접근 방식을 사용해야 합니다.

    구성 요소가 Emulated ViewEncapsulation 사용하는 경우::ng-deep 사용하여 이 캡슐화를 penetrate 해야 합니다. 사용자 정의 테마가 다른 구성 요소로 누출되는 것을 방지하려면::ng-deep:host 선택기로 래핑해야 합니다.

    :host {
        ::ng-deep {
            @include expansion-panel($custom-panel-theme);    
        }
    }
    

    API Reference

    Additional Resources

    우리 커뮤니티는 활발하고 항상 새로운 아이디어를 환영합니다.