ellipsis.ts 1017 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import type { CSSProperties, DirectiveBinding, ObjectDirective, App } from 'vue';
  2. interface IValue {
  3. width?: number;
  4. line?: number;
  5. }
  6. interface IOptions {
  7. [key: string]: CSSProperties;
  8. }
  9. const cssProperties: IOptions = {
  10. single: {
  11. overflow: 'hidden',
  12. textOverflow: 'ellipsis',
  13. whiteSpace: 'nowrap',
  14. },
  15. multiple: {
  16. display: '-webkit-box',
  17. overflow: 'hidden',
  18. wordBreak: 'break-all',
  19. },
  20. };
  21. const Ellipsis: ObjectDirective = {
  22. mounted(el: HTMLElement, binding: DirectiveBinding<Array<IValue>>) {
  23. const { value = [100, 1], arg = 'single' } = binding;
  24. const [width, line] = value;
  25. Object.entries(cssProperties[arg]).forEach(([key, value]) => {
  26. el.style[key] = value;
  27. });
  28. el.style.width = `${width}px`;
  29. if (arg === 'multiple') {
  30. el.style.webkitLineClamp = `${line}`;
  31. el.style.webkitBoxOrient = 'vertical';
  32. }
  33. },
  34. };
  35. export function setupEllipsisDirective(app: App) {
  36. app.directive('ellipsis', Ellipsis);
  37. }
  38. export default Ellipsis;