12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- import { isClient } from '@vueuse/core';
- import { isNumber, isObject, isString } from '../types';
- import { camelize } from '../strings';
- import { entriesOf, keysOf } from '../objects';
- import { debugWarn } from '../error';
- import type { CSSProperties } from 'vue';
- const SCOPE = 'utils/dom/style';
- export const classNameToArray = (cls = '') => cls.split(' ').filter((item) => !!item.trim());
- export const hasClass = (el: Element, cls: string): boolean => {
- if (!el || !cls) return false;
- if (cls.includes(' ')) throw new Error('className should not contain space.');
- return el.classList.contains(cls);
- };
- export const addClass = (el: Element, cls: string) => {
- if (!el || !cls.trim()) return;
- el.classList.add(...classNameToArray(cls));
- };
- export const removeClass = (el: Element, cls: string) => {
- if (!el || !cls.trim()) return;
- el.classList.remove(...classNameToArray(cls));
- };
- export const getStyle = (element: HTMLElement, styleName: keyof CSSProperties): string => {
- if (!isClient || !element || !styleName) return '';
- let key = camelize(styleName);
- if (key === 'float') key = 'cssFloat';
- try {
- const style = (element.style as any)[key];
- if (style) return style;
- const computed: any = document.defaultView?.getComputedStyle(element, '');
- return computed ? computed[key] : '';
- } catch {
- return (element.style as any)[key];
- }
- };
- export const setStyle = (
- element: HTMLElement,
- styleName: CSSProperties | keyof CSSProperties,
- value?: string | number,
- ) => {
- if (!element || !styleName) return;
- if (isObject(styleName)) {
- entriesOf(styleName).forEach(([prop, value]) => setStyle(element, prop, value));
- } else {
- const key: any = camelize(styleName);
- element.style[key] = value as any;
- }
- };
- export const removeStyle = (element: HTMLElement, style: CSSProperties | keyof CSSProperties) => {
- if (!element || !style) return;
- if (isObject(style)) {
- keysOf(style).forEach((prop) => removeStyle(element, prop));
- } else {
- setStyle(element, style, '');
- }
- };
- export function addUnit(value?: string | number, defaultUnit = 'px') {
- if (!value) return '';
- if (isString(value)) {
- return value;
- } else if (isNumber(value)) {
- return `${value}${defaultUnit}`;
- }
- debugWarn(SCOPE, 'binding value must be a string or number');
- }
|