Panel / Side Panels

    Let’s look how to add Side Panels to our App. We may include up to 2 panels to our App, one on left side and another one on right side. We should add panels’ HTML right in the beginning of the app root element (or in case there is no root element in use):

    Panel Effect

    After we added panels we need to choose opening effect for each panel. There could be one of two effects: “Reveal” (when panel moves out whole app’s content) or “Cover” (when panel overlays app’s content). If you want to use “Reveal” effect you should add additional class to Panel, or **panel-cover** for cover effect:

    1. <body>
    2. <!-- App root element -->
    3. <div id="app">
    4. <!-- Left panel, let it be with reveal effect -->
    5. <div class="panel panel-left panel-reveal">
    6. ... panel content goes here ...
    7. </div>
    8. <!-- Right panel, with cover effect -->
    9. <div class="panel panel-right panel-cover">
    10. ... panel content goes here ...
    11. </div>
    12. ...
    13. </div>
    14. </body>

    Panel App Parameters

    It is possible to control some default panels behavior using global app parameters by passing panels related parameters under panel parameter:

    For example:

    Let’s look at related App methods to work with Panel:

    app.panel.open(side, animate)- open panel

    • side - string. Panel to open: “left” or “right”. Required in case you have two panels.
    • animate - boolean. Should it be opened with animation or not. Optional, by default is true

    app.panel.close(side, animate)- close panel

    • side - string. Panel to close. Optional, by default will close any opened panel.
    • animate - boolean. Should it be opened with animation or not. Optional, by default is true

    app.panel.create(parameters)- create new panel instance

    • parameters - object. Object with panel parameters.

    Method returns created Panel instance

    app.panel.get(side)- get Panel instance by specified side

    • side - string. Panel to get

    Method returns Panel instance

    app.panel.enableSwipe(side)- enable swipes for panel (swipe-to-close and swipe-to-open)

    • side - string. Panel to enable swipe actions on

    app.panel.disableSwipe(side)- disable swipes for panel (swipe-to-close and swipe-to-open)

    • side - string. Panel to disable swipe actions on

    app.panel.left- left panel instance

    app.panel.right- right panel instance

    Panel Parameters

    If we create Panel manually using app.panel.create method we need to pass object with panel parameters:

    For example:

    1. var panel = app.panel.create({
    2. el: '.panel-left',
    3. })

    Panel Methods & Properties

    After we created Panel instance (by calling app.panel.create) or after we got Panel instance (by calling app.panel.get) we may use its useful methods and properties:

    • To open panel we need to add **panel-open** class to any HTML element (prefered to link)

    • To close panel we need to add **panel-close** class to any HTML element (prefered to link)

    • If you want to specify which panel should opened/closed, then it could be done via additional **data-panel="left** attribute on this HTML element

    According to above note:

    Routable Panels

    Routable Panels available from Framework7 version 3.2.0.

    Panels can also be routable with same features as for routable modals and pages:

    • it provides opportunity to open Panel by usual links instead of so called special links or API,
    • with enabled Push State, the same Panel will be opened when you refresh browser, navigate back and forward in history,
    • with routable Panels you can load Panel itself and its content in the same ways as for pages and modals, i.e. using , content, template, templateUrl, component or componentUrl
    1. routes = [
    2. ...
    3. // Creates Panel from passed HTML string
    4. {
    5. path: '/left-panel/',
    6. panel: {
    7. content: `
    8. <div class="panel panel-left panel-cover">
    9. <div class="view">
    10. <div class="page">
    11. ...
    12. </div>
    13. </div>
    14. </div>
    15. `
    16. }
    17. },
    18. // Load Panel from file via Ajax
    19. {
    20. path: '/right-panel-ajax/',
    21. panel: {
    22. url: './right-panel.html',
    23. /* right-panel.html contains:
    24. <div class="panel panel-right panel-reveal">
    25. <div class="view">
    26. <div class="page">
    27. ...
    28. </div>
    29. </div>
    30. </div>
    31. */
    32. },
    33. },
    34. // Load Panel from component file
    35. {
    36. path: '/panel-component/',
    37. panel: {
    38. componentUrl: './panel-component.html',
    39. /* panel-component.html contains:
    40. <div class="panel panel-left panel-cover">
    41. <div class="page">
    42. ...
    43. </div>
    44. </div>
    45. </div>
    46. </template>
    47. <style>...</style>
    48. <script>...</script>
    49. */
    50. },
    51. },
    52. ]

    According to example above:

    • when you click on link with /left-panel/ href attribute it will open Panel from specified string content,
    • when you click on link with /right-panel-ajax/ href attribute it will perform Ajax request to right-panel.html file and open it as a Right Panel,
    • when you click on link with /panel-component/ href attribute it will perform Ajax request to panel-component.html file, parse it as a Router Component and open it as a Panel,

    Note that routable Panels can’t be mixed with static Panels. So if you have static left panel in the app, then only right panel can be loaded as routable panel.

    Panel Events

    App and Panel Instance Events

    Panel instance emits events on both self instance and app instance. App instance events has same names prefixed with panel.

    1. var app = new Framework7();
    2. var $$ = Dom7;
    3. // Dom Events
    4. $$('.panel-left').on('panel:open', function () {
    5. console.log('Panel left: open');
    6. });
    7. $$('.panel-left').on('panel:opened', function () {
    8. console.log('Panel left: opened');
    9. });
    10. // Instance Events
    11. var panelRight = app.panel.right;
    12. panelRight.on('open', function () {
    13. console.log('Panel right: open');
    14. });
    15. panelRight.on('opened', function () {
    16. console.log('Panel right: opened');
    17. });
    18. // App Events
    19. app.on('panelClose', function (panel) {
    20. console.log('Panel ' + panel.side + ': close');
    21. });
    22. app.on('panelClosed', function (panel) {
    23. });