【三】封装DOM操作

作者: 大海爱奔跑 | 来源:发表于2020-02-25 10:29 被阅读0次

    关于专题【vue开发音乐App】

    将一些涉及DOM操作的方法封装成dom.js,培养组件化开发的习惯和思维,良好的封装有利于代码维护和效率提升。

    一、常见的DOM操作

    • addClass(el, className):为元素el添加名为className的样式类
    • hasClass(el, className):判断元素el是否包含名为className的样式类
    • getData(el, name, val):获取/设置指定dom上的属性值(第三个参数val,存在表示设置,不存在表示获取)
    • prefixStyle(style):为样式style拼接一个能够支持它的浏览器内核前缀

    二、src/common/js/dom.js

    // 为元素el添加名为className的样式类
    export function addClass (el, className) {
      // 添加之前先检查是否已经包含该类
      if (hasClass(el, className)) {
        return false
      }
      let classArr = el.className.split(' ')
      classArr.push(className)
      el.className = classArr.join(' ')
    }
    
    // 检查元素el是否已经包含名为className的样式类
    export function hasClass (el, className) {
      // 使用一个正则判断
      // (^|\s):直接开头或前面是空格;(\s|$):后面是空格或者直接结尾
      // 多出的一个反斜杠用于转义
      let reg = new RegExp(`(^|\\s)${className}(\\s|$)`)
      return reg.test(el.className)
    }
    
    // 获取指定dom上的属性值(第三个参数val,存在表示设置,不存在表示获取)
    export function getData (el, name, val) {
      const prefix = 'data-'
      name = prefix + name
      if (val) {
        return el.setAttribute(name, val)
      } else {
        return el.getAttribute(name)
      }
    }
    
    let elementStyle = document.createElement('div').style
    
    // 定义vendor:供应商
    let vendor = (() => {
      let transformName = {
        webkit: 'webkitTransform',
        Moz: 'MozTransform',
        O: 'OTransform',
        ms: 'msTransform',
        standard: 'transform'
      }
      // 循环遍历transformName,如果element的style支持其中一个,就返回(内核标志)
      for (let key in transformName) {
        if (elementStyle[transformName[key]] !== undefined) {
          return key
        }
      }
    
      // 如果都不满足,说明该浏览器有毛病,return false
      return false
    })()
    
    // 为样式style拼接一个能够支持它的浏览器内核前缀
    export function prefixStyle (style) {
      if (vendor === false) {
        return false
      }
      if (vendor === 'standard') {
        return style
      }
      // 然后就做拼接,内核缩写 + 属性名首字母大写 + 剩余部分
      // eg. 'webkit' + 'T' + 'ransform' = 'webkitTransform'
      return vendor + style.charAt(0).toUpperCase() + style.substr(1)
    }
    

    三、调用示例

    import {addClass, getData, prefixStyle} from 'common/js/dom'
    
    // 为元素el添加.slider-item
    addClass(el, 'slider-item')
    
    // 获取绑在元素el标签上的'data-index'属性值
    let index = getData(el, 'index')
    
    // 在元素el的标签上绑定一个'data-name'属性,值为'abc'
    getData(el, 'name', 'abc')
    
    // 为transform/backdrop-filter拼接一个能够支持它们的浏览器内核前缀
    // 以确保它们能被正确执行
    let transform = prefixStyle('transform')
    let filter = prefixStyle('backdrop-filter')
    
    this.$refs.bgImage.style[transform] = `scale(${scale})`
    this.$refs.filter.style[filter] = `blur(${blur}px)`
    

    相关文章

      网友评论

        本文标题:【三】封装DOM操作

        本文链接:https://www.haomeiwen.com/subject/pdszqhtx.html