mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-18 11:17:19 +08:00
fix(segment): handle change of direction scrolling
This commit is contained in:
18
core/src/components.d.ts
vendored
18
core/src/components.d.ts
vendored
@ -4442,8 +4442,13 @@ declare global {
|
|||||||
new (): HTMLIonSegmentContentElement;
|
new (): HTMLIonSegmentContentElement;
|
||||||
};
|
};
|
||||||
interface HTMLIonSegmentViewElementEventMap {
|
interface HTMLIonSegmentViewElementEventMap {
|
||||||
"ionSegmentViewScroll": { scrollDirection: string; scrollDistancePercentage: number };
|
"ionSegmentViewScroll": {
|
||||||
"ionSegmentViewScrollEnd": void;
|
scrollDirection: string;
|
||||||
|
scrollDistance: number;
|
||||||
|
scrollDistancePercentage: number;
|
||||||
|
};
|
||||||
|
"ionSegmentViewScrollEnd": { activeContentId: string };
|
||||||
|
"ionSegmentViewScrollStart": void;
|
||||||
}
|
}
|
||||||
interface HTMLIonSegmentViewElement extends Components.IonSegmentView, HTMLStencilElement {
|
interface HTMLIonSegmentViewElement extends Components.IonSegmentView, HTMLStencilElement {
|
||||||
addEventListener<K extends keyof HTMLIonSegmentViewElementEventMap>(type: K, listener: (this: HTMLIonSegmentViewElement, ev: IonSegmentViewCustomEvent<HTMLIonSegmentViewElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
|
addEventListener<K extends keyof HTMLIonSegmentViewElementEventMap>(type: K, listener: (this: HTMLIonSegmentViewElement, ev: IonSegmentViewCustomEvent<HTMLIonSegmentViewElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
|
||||||
@ -7538,11 +7543,16 @@ declare namespace LocalJSX {
|
|||||||
/**
|
/**
|
||||||
* Emitted when the segment view is scrolled.
|
* Emitted when the segment view is scrolled.
|
||||||
*/
|
*/
|
||||||
"onIonSegmentViewScroll"?: (event: IonSegmentViewCustomEvent<{ scrollDirection: string; scrollDistancePercentage: number }>) => void;
|
"onIonSegmentViewScroll"?: (event: IonSegmentViewCustomEvent<{
|
||||||
|
scrollDirection: string;
|
||||||
|
scrollDistance: number;
|
||||||
|
scrollDistancePercentage: number;
|
||||||
|
}>) => void;
|
||||||
/**
|
/**
|
||||||
* Emitted when the segment view scroll has ended.
|
* Emitted when the segment view scroll has ended.
|
||||||
*/
|
*/
|
||||||
"onIonSegmentViewScrollEnd"?: (event: IonSegmentViewCustomEvent<void>) => void;
|
"onIonSegmentViewScrollEnd"?: (event: IonSegmentViewCustomEvent<{ activeContentId: string }>) => void;
|
||||||
|
"onIonSegmentViewScrollStart"?: (event: IonSegmentViewCustomEvent<void>) => void;
|
||||||
}
|
}
|
||||||
interface IonSelect {
|
interface IonSelect {
|
||||||
/**
|
/**
|
||||||
|
@ -368,15 +368,13 @@ export class Segment implements ComponentInterface {
|
|||||||
const indicatorEl = this.getIndicator(current);
|
const indicatorEl = this.getIndicator(current);
|
||||||
this.scrolledIndicator = indicatorEl;
|
this.scrolledIndicator = indicatorEl;
|
||||||
|
|
||||||
const { scrollDirection, scrollDistancePercentage, scrollDistance } = ev.detail;
|
const { scrollDistancePercentage, scrollDistance: evScrollDistance } = ev.detail;
|
||||||
|
|
||||||
console.log('scroll', scrollDistancePercentage, scrollDistance);
|
|
||||||
|
|
||||||
if (indicatorEl && !isNaN(scrollDistancePercentage)) {
|
if (indicatorEl && !isNaN(scrollDistancePercentage)) {
|
||||||
indicatorEl.style.transition = 'transform 0.3s ease-out';
|
indicatorEl.style.transition = 'transform 0.3s ease-out';
|
||||||
|
|
||||||
const scrollDistance = scrollDistancePercentage * current.getBoundingClientRect().width;
|
const scrollDistance = scrollDistancePercentage * current.getBoundingClientRect().width;
|
||||||
const transformValue = scrollDirection === 'left' ? -scrollDistance : scrollDistance;
|
const transformValue = evScrollDistance < 0 ? -scrollDistance : scrollDistance;
|
||||||
|
|
||||||
// Calculate total width of buttons to the left of the current button
|
// Calculate total width of buttons to the left of the current button
|
||||||
const totalButtonWidthBefore = buttons
|
const totalButtonWidthBefore = buttons
|
||||||
|
@ -2043,7 +2043,7 @@ export class IonSegmentView {
|
|||||||
constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) {
|
constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) {
|
||||||
c.detach();
|
c.detach();
|
||||||
this.el = r.nativeElement;
|
this.el = r.nativeElement;
|
||||||
proxyOutputs(this, this.el, ['ionSegmentViewScroll', 'ionSegmentViewScrollEnd']);
|
proxyOutputs(this, this.el, ['ionSegmentViewScroll', 'ionSegmentViewScrollEnd', 'ionSegmentViewScrollStart']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2052,11 +2052,13 @@ export declare interface IonSegmentView extends Components.IonSegmentView {
|
|||||||
/**
|
/**
|
||||||
* Emitted when the segment view is scrolled.
|
* Emitted when the segment view is scrolled.
|
||||||
*/
|
*/
|
||||||
ionSegmentViewScroll: EventEmitter<CustomEvent<{ scrollDirection: string; scrollDistancePercentage: number }>>;
|
ionSegmentViewScroll: EventEmitter<CustomEvent<{ scrollDirection: string; scrollDistance: number; scrollDistancePercentage: number; }>>;
|
||||||
/**
|
/**
|
||||||
* Emitted when the segment view scroll has ended.
|
* Emitted when the segment view scroll has ended.
|
||||||
*/
|
*/
|
||||||
ionSegmentViewScrollEnd: EventEmitter<CustomEvent<void>>;
|
ionSegmentViewScrollEnd: EventEmitter<CustomEvent<{ activeContentId: string }>>;
|
||||||
|
|
||||||
|
ionSegmentViewScrollStart: EventEmitter<CustomEvent<void>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1882,7 +1882,7 @@ export class IonSegmentView {
|
|||||||
constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) {
|
constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) {
|
||||||
c.detach();
|
c.detach();
|
||||||
this.el = r.nativeElement;
|
this.el = r.nativeElement;
|
||||||
proxyOutputs(this, this.el, ['ionSegmentViewScroll', 'ionSegmentViewScrollEnd']);
|
proxyOutputs(this, this.el, ['ionSegmentViewScroll', 'ionSegmentViewScrollEnd', 'ionSegmentViewScrollStart']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1891,11 +1891,13 @@ export declare interface IonSegmentView extends Components.IonSegmentView {
|
|||||||
/**
|
/**
|
||||||
* Emitted when the segment view is scrolled.
|
* Emitted when the segment view is scrolled.
|
||||||
*/
|
*/
|
||||||
ionSegmentViewScroll: EventEmitter<CustomEvent<{ scrollDirection: string; scrollDistancePercentage: number }>>;
|
ionSegmentViewScroll: EventEmitter<CustomEvent<{ scrollDirection: string; scrollDistance: number; scrollDistancePercentage: number; }>>;
|
||||||
/**
|
/**
|
||||||
* Emitted when the segment view scroll has ended.
|
* Emitted when the segment view scroll has ended.
|
||||||
*/
|
*/
|
||||||
ionSegmentViewScrollEnd: EventEmitter<CustomEvent<void>>;
|
ionSegmentViewScrollEnd: EventEmitter<CustomEvent<{ activeContentId: string }>>;
|
||||||
|
|
||||||
|
ionSegmentViewScrollStart: EventEmitter<CustomEvent<void>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -763,7 +763,8 @@ export const IonSegmentContent = /*@__PURE__*/ defineContainer<JSX.IonSegmentCon
|
|||||||
export const IonSegmentView = /*@__PURE__*/ defineContainer<JSX.IonSegmentView>('ion-segment-view', defineIonSegmentView, [
|
export const IonSegmentView = /*@__PURE__*/ defineContainer<JSX.IonSegmentView>('ion-segment-view', defineIonSegmentView, [
|
||||||
'disabled',
|
'disabled',
|
||||||
'ionSegmentViewScroll',
|
'ionSegmentViewScroll',
|
||||||
'ionSegmentViewScrollEnd'
|
'ionSegmentViewScrollEnd',
|
||||||
|
'ionSegmentViewScrollStart'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user