How to Inspect and Debug CSS @starting-style Entry Transitions in Safari Web Inspector

Creating smooth entry animations when an element appears in the DOM or transitions from display: none to a visible display mode has historically been one of CSS’s most stubborn limitations. In traditional browser rendering engines, changing an element’s display property from none to block causes all style properties to compute simultaneously in a single rendering pass, completely bypassing CSS transitions. Developers were forced to resort to complex JavaScript workarounds using requestAnimationFrame, setTimeout, or manual class toggles. In modern WebKit and Safari, the CSS Transitions Level 2 specification solves this problem natively through the @starting-style at-rule and discrete transition behaviours. Using Safari Web Inspector, developers can inspect, test, and fine-tune these entrance animations with frame-by-frame precision.

How CSS @starting-style Transforms Entry Animations

To transition a CSS property (such as opacity, transform, or scale), a browser must know both the starting state and the ending state. When an element is hidden via display: none, it does not participate in the layout tree and possesses no computed style history. When made visible, the browser immediately applies the target styles without an initial frame from which to interpolate.

The @starting-style rule establishes an explicit “before-change” style snapshot:

  • Initial Style Definition: Dictates the exact computed values the browser must use as the starting frame when the element first receives a renderable display value.
  • Discrete Property Transitioning: Paired with transition-behavior: allow-discrete, it permits discrete properties like display and overlay to transition smoothly alongside continuous properties like opacity and transform.
  • Native Dialog and Popover Integration: Works seamlessly with the HTML <dialog> element and the native Popover API when moving elements into the top layer.

Syntax and Implementation Pattern

To animate a modal dialog or floating dropdown when it opens in Safari, define the base styles, open state, and starting style:

/* Target modal element */
.modal-dialog {
    display: none;
    opacity: 0;
    transform: scale(0.85);
    transition: opacity 0.3s ease, transform 0.3s ease, display 0.3s allow-discrete;
}

/* Open state applied when visible */
.modal-dialog[open] {
    display: block;
    opacity: 1;
    transform: scale(1);
}

/* Starting style applied only on the initial entry frame */
@starting-style {
    .modal-dialog[open] {
        opacity: 0;
        transform: scale(0.85);
    }
}

When the [open] attribute is toggled, Safari instantiates the layout using the values defined inside @starting-style before executing the transition to the values defined in .modal-dialog[open].

Inspecting @starting-style in Safari Web Inspector

To inspect and debug the entry transition in Safari Web Inspector:

  1. Launch Safari and navigate to your web application.
  2. Right-click the animated element and choose Inspect Element.
  3. In the DOM tree, select the target element and trigger its open state.
  4. In the right-hand panel, select the Styles tab. Scroll through the cascade rules to locate the @starting-style block.
  5. Confirm that Safari parses the at-rule without invalid syntax warnings. Verify that properties defined inside @starting-style accurately match the intended initial transform and opacity values.

Debugging Animations via the Safari Animations Panel

Fast micro-interactions can make it difficult to spot optical glitches or sudden jumps in scale. Use the Safari Web Inspector’s dedicated Animation controls to audit transitions at reduced speed:

  1. In the Safari Web Inspector menu, select Timelines or open the Graphics / Animations tab.
  2. Click the animation recording toggle to capture incoming transitions.
  3. Trigger the element’s appearance. WebKit records the transition curve.
  4. Adjust the timeline playback speed to 10% or 25% to watch the entry animation in slow motion.
  5. Verify that the element transitions smoothly from the starting values without flashing at full scale on the very first frame.

Handling Exit Transitions with transition-behavior: allow-discrete

While @starting-style handles the entrance transition, graceful exit animations require keeping the element in the rendering tree until the transition finishes:

/* Retain display during exit transition */
.toast-notification {
    display: flex;
    opacity: 1;
    transition: opacity 0.4s ease, display 0.4s allow-discrete;
}

.toast-notification.hidden {
    display: none;
    opacity: 0;
}

@starting-style {
    .toast-notification {
        opacity: 0;
    }
}

By declaring transition-property: opacity, display; and transition-behavior: allow-discrete;, Safari delays switching display to none until the opacity transition reaches completion.

Cross-Browser Fallbacks and Feature Detection

To ensure robust compatibility across older browsers while delivering enhanced transitions in modern Safari, use CSS feature queries:

/* Base styles for standard instant switching */
.dropdown-menu {
    display: none;
}

.dropdown-menu.active {
    display: block;
}

/* Enhanced transitions for supporting browsers */
@supports (transition-behavior: allow-discrete) {
    .dropdown-menu {
        opacity: 0;
        transition: opacity 0.25s ease, display 0.25s allow-discrete;
    }

    .dropdown-menu.active {
        opacity: 1;
    }

    @starting-style {
        .dropdown-menu.active {
            opacity: 0;
        }
    }
}

Auditing the @supports evaluation in Safari Web Inspector confirms that the browser recognises discrete transition capabilities and applies the progressive enhancement.

Get the best tech tips delivered straight to your inbox.

Join thousands of readers mastering Apple, Google, Microsoft, and Linux.