主頁 > 前端設計 > tailwindcss 官網(八)定制:插件、預設(presets、合并配置)

tailwindcss 官網(八)定制:插件、預設(presets、合并配置)

2021-09-15 09:38:18 前端設計

tailwindcss 官網(八)定制:插件、預設(presets、合并配置)

文章目錄

  • tailwindcss 官網(八)定制:插件、預設(presets、合并配置)
    • 1. 插件
      • 概述
      • 添加功能類
        • 前綴 和 important 參考
        • 變體
      • 增加組件
        • 前綴 和 important 參考
        • 變體
      • 添加基礎樣式
      • 轉義類名
      • 手動給選擇器加前綴
      • 參考用戶配置
      • 暴露選項
        • 提供默認選項
      • CSS-in-JS 語法
      • Adding variants
      • 增加變體
      • Basic variants
      • 基本變體
        • 復雜變體
        • Using custom variants
        • 使用自定義變體
    • 2. 預設(presets)
      • 創建預設
      • 如何合并配置
        • 主題
        • 變體
        • 預設
        • 插件
        • 核心插件
      • 擴展多個預設
      • 禁用默認配置

官網:安裝 - Tailwind CSS 中文檔案

  • Tailwind 是一個構建定制用戶界面的框架,所以從開始設計時便考慮了定制,
  • !important
    • 這個屬性可以讓瀏覽器優選執行這個陳述句,加上!importanrt可以覆寫父級的樣式

1. 插件

使用可復用的第三方插件擴展 Tailwind,

概述

插件讓您注冊新的樣式,讓 Tailwind 使用 JavaScript 代替 CSS 注入用戶的樣式表,

要開始您的第一個插件,先從 tailwindcss/plugin 匯入 Tailwind 的 plugin 函式,然后在您的 plugins 陣列中,呼叫這個函式,用一個匿名函式作為其第一個引數,

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  plugins: [
    plugin(function({ addUtilities, addComponents, e, prefix, config }) {
      // Add your custom styles here
    }),
  ]
}

插件函式接收一個單一的物件引數,可以 destructured 成幾個幫助函式,

  • addUtilities(), for registering new utility styles
  • addComponents(), for registering new component styles
  • addBase(), for registering new base styles
  • addVariant(), for registering custom variants
  • e(), for escaping strings meant to be used in class names
  • prefix(), for manually applying the user’s configured prefix to parts of a selector
  • theme(), for looking up values in the user’s theme configuration
  • variants(), for looking up values in the user’s variants configuration
  • config(), for looking up values in the user’s Tailwind configuration
  • postcss, for doing low-level manipulation with PostCSS directly

添加功能類

addUtilities 函式允許您在 Tailwind 的 utilities 層注冊新的樣式,

插件功能類的輸出順序是按照其注冊的順序,在內置的功能類之后,所以如果一個插件的作用目標是任何一個與內置功能類相同的屬性,插件功能類將優先,

要從插件中添加新的功能類,呼叫 addUtilities,使用 CSS-in-JS 語法 傳遞您的樣式,

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  plugins: [
    plugin(function({ addUtilities }) {
      const newUtilities = {
        '.skew-10deg': {
          transform: 'skewY(-10deg)',
        },
        '.skew-15deg': {
          transform: 'skewY(-15deg)',
        },
      }

      addUtilities(newUtilities)
    })
  ]
}

前綴 和 important 參考

默認情況下,插件功能類會自動遵守用戶的 prefiximportant 偏好,

也就是說,如果給出這樣的 Tailwind 配置:

// tailwind.config.js
module.exports = {
  prefix: 'tw-',
  important: true,
  // ...
}

…上面的示例插件會生成以下CSS:

.tw-skew-10deg {
  transform: skewY(-10deg) !important;
}
.tw-skew-15deg {
  transform: skewY(-15deg) !important;
}

如果有必要,您可以通過向 addUtilities 傳遞一個選項物件作為第二個引數來選擇不使用這種行為,

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  plugins: [
    plugin(function({ addUtilities }) {
      const newUtilities = {
        // ...
      }

      addUtilities(newUtilities, {
        respectPrefix: false,
        respectImportant: false,
      })
    })
  ]
}

變體

要生成 responsive、hover、focus、active 或樣式的其它變體,請使用 variants 選項指定您想生成的變體,

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  plugins: [
    plugin(function({ addUtilities }) {
      const newUtilities = {
        // ...
      }

      addUtilities(newUtilities, {
        variants: ['responsive', 'hover'],
      })
    })
  ]
}

如果您只需要指定變體,而不需要選擇不使用默認的前綴或 important 選項,您也可以直接將變體陣列作為第二個引數傳遞,

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  plugins: [
    plugin(function({ addUtilities }) {
      const newUtilities = {
        // ...
      }

      addUtilities(newUtilities, ['responsive', 'hover'])
    })
  ]
}

如果您希望用戶在他們的 tailwind.config.js 檔案中的 variants 部分提供自己的變體,您可以使用 variants() 函式來獲取他們配置的變體,

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  variants: {
    customPlugin: ['responsive', 'hover'],
  },
  plugins: [
    plugin(function({ addUtilities, variants }) {
      const newUtilities = {
        // ...
      }

      addUtilities(newUtilities, variants('customPlugin'))
    })
  ]
}

增加組件

addComponents 函式允許您在 Tailwind 的 components 層注冊新的樣式,

用它來添加更個性化、更復雜的類,比如按鈕、表單控制元件、警告等;就是您在其他框架中經常看到的您可能需要使用功能類覆寫的那種預建組件,

要從插件中添加新的組件樣式,呼叫 addComponents ,使用 CSS-in-JS 語法 傳遞您的樣式,

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  plugins: [
    plugin(function({ addComponents }) {
      const buttons = {
        '.btn': {
          padding: '.5rem 1rem',
          borderRadius: '.25rem',
          fontWeight: '600',
        },
        '.btn-blue': {
          backgroundColor: '#3490dc',
          color: '#fff',
          '&:hover': {
            backgroundColor: '#2779bd'
          },
        },
        '.btn-red': {
          backgroundColor: '#e3342f',
          color: '#fff',
          '&:hover': {
            backgroundColor: '#cc1f1a'
          },
        },
      }

      addComponents(buttons)
    })
  ]
}

前綴 和 important 參考

默認情況下,組件類自動遵守用戶的 prefix 偏好,但不受用戶的 important 偏好的影響

這意味著如果有以下 Tailwind 配置:

// tailwind.config.js
module.exports = {
  prefix: 'tw-',
  important: true,
  // ...
}

…上面的示例插件將生成以下 CSS:

.tw-btn {
  padding: .5rem 1rem;
  border-radius: .25rem;
  font-weight: 600;
}
.tw-btn-blue {
  background-color: #3490dc;
  color: #fff;
}
.tw-btn-blue:hover {
  background-color: #2779bd;
}
.tw-btn-blue {
  background-color: #e3342f;
  color: #fff;
}
.tw-btn-blue:hover {
  background-color: #cc1f1a;
}

雖然很少有一個很好的理由讓組件宣告 important,但如果您真的需要這樣做,您可以手動添加 !important

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  plugins: [
    plugin(function({ addComponents }) {
      const buttons = {
        '.btn': {
          padding: '.5rem 1rem !important',
          borderRadius: '.25rem !important',
          fontWeight: '600 !important',
        },
        // ...
      }

      addComponents(buttons)
    })
  ]
}

選擇器中的所有類都會默認添加前綴,所以如果您添加一個更復雜的樣式,比如:

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  prefix: 'tw-',
  plugins: [
    plugin(function({ addComponents }) {
      const components = {
        // ...
        '.navbar-inverse a.nav-link': {
            color: '#fff',
        }
      }

      addComponents(components)
    })
  ]
}

…將生成以下的 CSS:

.tw-navbar-inverse a.tw-nav-link {
    color: #fff;
}

要選擇不使用前綴,可以傳遞一個 options 物件作為第二個引數給 addComponents

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  prefix: 'tw-',
  plugins: [
    plugin(function({ addComponents }) {
      const components = {
        // ...
      }

      addComponents(components, {
        respectPrefix: false
      })
    })
  ]
}

變體

要生成組件的 responsive、hover、focus、active或其他變體,請使用 variants 選項指定您想生成的變體,

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  plugins: [
    plugin(function({ addComponents }) {
      const newComponents = {
        // ...
      }

      addComponents(newComponents, {
        variants: ['responsive', 'hover'],
      })
    })
  ]
}

如果您只需要指定變體,而不需要選擇不使用默認的前綴或 important 選項,您也可以直接將變體陣列作為第二個引數傳遞,

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  plugins: [
    plugin(function({ addComponents }) {
      const newComponents = {
        // ...
      }

      addComponents(newComponents, ['responsive', 'hover'])
    })
  ]
}

如果您希望用戶在他們的 tailwind.config.js 檔案中的 variants 部分提供自己的變體,您可以使用 variants() 函式來獲取他們配置的變體,

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  variants: {
    customPlugin: ['responsive', 'hover'],
  },
  plugins: [
    plugin(function({ addComponents, variants }) {
      const newComponents = {
        // ...
      }

      addComponents(newComponents, variants('customPlugin'))
    })
  ]
}

添加基礎樣式

addBase 函式允許您在 Tailwind 的 base 層注冊新的樣式,

使用它來添加諸如基本的排版樣式、個性化的全域重置或 @font-face 規則,

要從插件中添加新的基礎樣式,呼叫 addBase,使用 CSS-in-JS 語法 傳遞您的樣式,

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  plugins: [
    plugin(function({ addBase, config }) {
      addBase({
        'h1': { fontSize: config('theme.fontSize.2xl') },
        'h2': { fontSize: config('theme.fontSize.xl') },
        'h3': { fontSize: config('theme.fontSize.lg') },
      })
    })
  ]
}

由于基本樣式是針對 divh1 等裸選擇器的,所以它們不遵從用戶的 prefiximportant 配置,


轉義類名

如果您的插件生成的類中包含用戶提供的字串,您可以使用 e 函式來轉義這些類名,以確保非標準字符被正確地自動處理,

例如,這個插件生成了一組 .rotate-{angle} 功能類,其中 {angle} 是用戶提供的字串,e 函式用于轉義連接的類名,以確保像 .rotate-1/4 這樣的類能按預期作業,

// tailwind.config.js
const _ = require('lodash')
const plugin = require('tailwindcss/plugin')

module.exports = {
  theme: {
    rotate: {
      '1/4': '90deg',
      '1/2': '180deg',
      '3/4': '270deg',
    }
  },
  plugins: [
    plugin(function({ addUtilities, config, e }) {
      const rotateUtilities = _.map(config('theme.rotate'), (value, key) => {
        return {
          [`.${e(`rotate-${key}`)}`]: {
            transform: `rotate(${value})`
          }
        }
      })

      addUtilities(rotateUtilities)
    })
  ]
}

這個插件會生成以下CSS:

.rotate-1\/4 {
  transform: rotate(90deg);
}
.rotate-1\/2 {
  transform: rotate(180deg);
}
.rotate-3\/4 {
  transform: rotate(270deg);
}

注意只轉義您真正想轉義的內容;不要在類名中傳遞前導的 . 或在 :hover:focus 等偽類的開頭傳遞 :,否則這些字符將被轉義,

此外,因為 CSS 有關于類名的規則(類名不能以數字開頭,但可以包含數字),所以最好是轉義完整的類名(不只是用戶提供的部分),否則您可能會得到不必要的轉義序列,

// Will unnecessarily escape `1`
`.rotate-${e('1/4')}`
// => '.rotate-\31 \/4'

// Won't escape `1` because it's not the first character
`.${e('rotate-1/4')}`
// => '.rotate-1\/4'

手動給選擇器加前綴

如果您正在寫一些復雜的東西,您只想給某些類加前綴,您可以使用 prefix 函式來精細控制何時應用用戶配置的前綴,

例如,如果您正在創建一個插件,以便在一組內部專案中重復使用,在其選擇器中包含現有的類,您可能只想給新的類加上前綴,

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  prefix: 'tw-',
  plugins: [
    plugin(function({ addComponents, prefix }) {
      addComponents({
        [`.existing-class > ${prefix('.new-class')}`]: {
          backgroundColor: '#fff',
        }
      })
    })
  ]
}

這將生成以下CSS:

.existing-class > .tw-new-class {
  background-color: #fff;
}

prefix 函式會給選擇器中的所有類加前綴,而忽略不是類的選擇器,所以傳遞像這樣復雜的選擇器是完全安全的,

prefix('.btn-blue .w-1\/4 > h1.text-xl + a .bar')
// => '.tw-btn-blue .tw-w-1\/4 > h1.tw-text-xl + a .tw-bar'

參考用戶配置

configthemevariants 函式允許您使用點符號從用戶的 Tailwind 配置中獲取一個值,如果該路徑不存在,則提供一個默認值,

例如,這個簡化版的內置 容器 插件使用 theme 函式來獲取用戶配置的斷點,

// tailwind.config.js
const _ = require('lodash')
const plugin = require('tailwindcss/plugin')

module.exports = {
  plugins: [
    plugin(function({ addComponents, theme }) {
      const screens = theme('screens', {})

      const mediaQueries = _.map(screens, width => {
        return {
          [`@media (min-width: ${width})`]: {
            '.container': {
              'max-width': width,
            },
          },
        }
      })

      addComponents([
        { '.container': { width: '100%' } },
        ...mediaQueries,
      ])
    })
  ]
}

請注意,theme 函式實際上只是使用 config 函式訪問用戶配置的主題部分的一個快捷方式,

// These are equivalent
config('theme.screens')
theme('screens')

如果您想參考用戶的 variants 配置,建議您使用 variants() 函式而不是 config 函式,

不要使用 config 函式來查找變體

addUtilities(newUtilities, config('variants.customPlugin'))

使用 variants 函式代替

addUtilities(newUtilities, variants('customPlugin'))

由于 variants 可以簡單地成為一個全域的變體串列,為整個專案中的每一個插件進行配置,所以使用 variants() 函式可以讓您很容易地遵從用戶的配置,而不是自己重新實作這個邏輯,

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  variants: ['responsive', 'hover', 'focus'],
  plugins: [
    plugin(function ({ config, variants }) {
      config('variants.customPlugin')
      // => undefined

      variants('customPlugin')
      // => ['reponsive', 'hover', 'focus']
    })
  ]
}

暴露選項

通常情況下,一個插件暴露自己的選項是有意義的,用戶可以配置這些選項來定制插件的行為,

最好的方法是在用戶的 themevariants 配置中定義自己的鍵,并要求他們在那里提供任何選項,這樣您就可以通過 themevariants 函式訪問它們,

例如,這里有一個插件*(提取到自己的模塊)*,用于創建簡單的漸變功能類,接受要生成的漸變值和變體做為選項,

// ./plugins/gradients.js
const _ = require('lodash')
const plugin = require('tailwindcss/plugin')

module.exports = plugin(function({ addUtilities, e, theme, variants }) {
  const gradients = theme('gradients', {})
  const gradientVariants = variants('gradients', [])

  const utilities = _.map(gradients, ([start, end], name) => ({
    [`.${e(`bg-gradient-${name}`)}`]: {
      backgroundImage: `linear-gradient(to right, ${start}, ${end})`
    }
  }))

  addUtilities(utilities, gradientVariants)
})

要使用它,您需要在您的插件串列中 require 它,在 themevariants 中的 gradients 鍵下指定您的配置,

// tailwind.config.js
module.exports = {
  theme: {
    gradients: theme => ({
      'blue-green': [theme('colors.blue.500'), theme('colors.green.500')],
      'purple-blue': [theme('colors.purple.500'), theme('colors.blue.500')],
      // ...
    })
  },
  variants: {
    gradients: ['responsive', 'hover'],
  },
  plugins: [
    require('./plugins/gradients')
  ],
}

提供默認選項

要為您的插件提供默認的 themevariants 選項,請向 Tailwind 的 plugin 函式傳遞包含默認值的第二個引數,,

// ./plugins/gradients.js
const _ = require('lodash')
const plugin = require('tailwindcss/plugin')

module.exports = plugin(function({ addUtilities, e, theme, variants }) {
  // ...
}, {
  theme: {
    gradients: theme => ({
      'blue-green': [theme('colors.blue.500'), theme('colors.green.500')],
      'purple-blue': [theme('colors.purple.500'), theme('colors.blue.500')],
      // ...
    })
  },
  variants: {
    gradients: ['responsive', 'hover'],
  }
})

這個物件只是另一個 Tailwind 配置物件,并具有與 tailwind.config.js 中使用的配置物件相同的所有屬性和功能,

通過以這種方式提供您的默認值,最終用戶將能夠 覆寫 和 擴展 您的默認值,就像他們可以覆寫和擴展 Tailwind 的內置樣式一樣,


CSS-in-JS 語法

每一個 addUtilitiesaddComponentsaddBase 都期望 CSS 規則寫成 JavaScript 物件,Tailwind 使用的語法,您可能會從 CSS-in-JS 庫中識別出來,如 Emotion,并由 postcss-js 提供支持,

考慮這個簡單的CSS規則:

.card {
  background-color: #fff;
  border-radius: .25rem;
  box-shadow: 0 2px 4px rgba(0,0,0,0.2);
}

將其翻譯成 CSS-in-JS 物件,就像這樣:

addComponents({
  '.card': {
    'background-color': '#fff',
    'border-radius': '.25rem',
    'box-shadow': '0 2px 4px rgba(0,0,0,0.2)',
  }
})

為方便起見,屬性名也可以用 camelCase 書寫,并會自動翻譯成 dash-case:

addComponents({
  '.card': {
    backgroundColor: '#fff',
    borderRadius: '.25rem',
    boxShadow: '0 2px 4px rgba(0,0,0,0.2)',
  }
})

也支持嵌套(由 postcss-nested 提供支持),使用您可能熟悉的 Sass 或 Less 的相同語法,

addComponents({
  '.card': {
    backgroundColor: '#fff',
    borderRadius: '.25rem',
    boxShadow: '0 2px 4px rgba(0,0,0,0.2)',
    '&:hover': {
      boxShadow: '0 10px 15px rgba(0,0,0,0.2)',
    },
    '@media (min-width: 500px)': {
      borderRadius: '.5rem',
    }
  }
})

同一物件中可以定義多個規則:

addComponents({
  '.btn': {
    padding: '.5rem 1rem',
    borderRadius: '.25rem',
    fontWeight: '600',
  },
  '.btn-blue': {
    backgroundColor: '#3490dc',
    color: '#fff',
    '&:hover': {
      backgroundColor: '#2779bd'
    },
  },
  '.btn-red': {
    backgroundColor: '#e3342f',
    color: '#fff',
    '&:hover': {
      backgroundColor: '#cc1f1a'
    },
  },
})

…或者作為一個物件陣列,以備您需要重復使用同一個鍵:

addComponents([
  {
    '@media (min-width: 500px)': {
      // ...
    }
  },
  {
    '@media (min-width: 500px)': {
      // ...
    }
  },
  {
    '@media (min-width: 500px)': {
      // ...
    }
  },
])

Adding variants

增加變體

addVariant 函式允許您注冊自己的自定義 變體,這些變體可以像內置的 hover、hover、hover 等變體一樣使用,

要添加一個新的變數,呼叫 addVariant 函式,傳入您的自定義變數的名稱,以及一個回呼,根據需要修改受影響的 CSS 規則,

const plugin = require('tailwindcss/plugin')

module.exports = {
  plugins: [
    plugin(function({ addVariant, e }) {
      addVariant('disabled', ({ modifySelectors, separator }) => {
        modifySelectors(({ className }) => {
          return `.${e(`disabled${separator}${className}`)}:disabled`
        })
      })
    })
  ]
}

回呼收到的物件可以被反構為以下部分:

  • modifySelectors, a helper function to simplify adding basic variants
  • separator, the user’s configured separator string
  • container, a PostCSS Container containing all of the rules the variant is being applied to, for creating complex variants

Basic variants

基本變體

如果您想添加一個簡單的變數,只需要改變選擇器,使用 modifySelectors 助手,

modifySelectors 助手接受一個函式,該函式接收一個物件,該物件可以被重構為以下部分:

  • selector, the complete unmodified selector for the current rule
  • className, the class name of the current rule with the leading dot removed

您傳遞給 modifySelectors 的函式應該簡單地回傳修改后的選擇器,

例如,一個 first-child 的變體插件可以這樣寫:

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  plugins: [
    plugin(function({ addVariant, e }) {
      addVariant('first-child', ({ modifySelectors, separator }) => {
        modifySelectors(({ className }) => {
          return `.${e(`first-child${separator}${className}`)}:first-child`
        })
      })
    })
  ]
}

復雜變體

如果您需要做的事情不僅僅是簡單地修改選擇器(比如改變實際的規則宣告,或者將規則包裝在另一個 at-rule 中),您將需要使用 container 實體,

使用 container 實體,您可以在給定的模塊或 @variants 塊中遍歷所有的規則,并使用標準的 PostCSS API 隨意操作它們,

例如,該插件通過在類前加上感嘆號,并將每個宣告修改為 important,為每個受影響的功能創建一個 important 版本,

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  plugins: [
    plugin(function({ addVariant }) {
      addVariant('important', ({ container }) => {
        container.walkRules(rule => {
          rule.selector = `.\\!${rule.selector.slice(1)}`
          rule.walkDecls(decl => {
            decl.important = true
          })
        })
      })
    })
  ]
}

這個插件將容器內的所有規則,用 @supports (display: grid) at-rule 包裝起來,并在每個規則前加上 supports-grid

// tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  plugins: [
    plugin(function({ addVariant, e, postcss }) {
      addVariant('supports-grid', ({ container, separator }) => {
        const supportsRule = postcss.atRule({ name: 'supports', params: '(display: grid)' })
        supportsRule.append(container.nodes)
        container.append(supportsRule)
        supportsRule.walkRules(rule => {
          rule.selector = `.${e(`supports-grid${separator}${rule.selector.slice(1)}`)}`
        })
      })
    })
  ]
}

要了解更多關于直接使用 PostCSS 的資訊,請查看 PostCSS API 檔案,

Using custom variants

使用自定義變體

使用自定義變體與使用 Tailwind 的內置變體沒有什么不同,

要使定制的變體與 Tailwind 的核心插件一起使用,將它們添加到您的組態檔的 variants 部分,

// tailwind.config.js
modules.exports = {
  variants: {
    borderWidths: ['responsive', 'hover', 'focus', 'first-child', 'disabled'],
  }
}

要在您自己的CSS中使自定義變體和自定義功能類一起使用,請使用 variants at-rule,

@variants hover, first-child {
  .bg-cover-image {
    background-image: url('/path/to/image.jpg');
  }
}

2. 預設(presets)

創建自己的可復用配置預設,

默認情況下,您的 tailwind.config.js 檔案中添加的任何配置將被智能的與 默認配置 合并,您自己的配置則作為一組覆寫與擴展,

presets 選項允許您指定一個不同的配置來用作您的基本配置,這使得打包一組跨專案復用的配置非常簡單,

// tailwind.config.js
module.exports = {
  presets: [
    require('@acmecorp/tailwind-base')
  ],
  // ...
}

這對于為同一品牌管理多個 Tailwind 專案的團隊來說是非常有用的,他們希望有一個單一的顏色、字體和其他通用定制的源,


創建預設

預設就是常規的 Tailwind 配置物件,與您的 tailwind.config.js 檔案里添加的配置毫無二致,

// Example preset
module.exports = {
  theme: {
    colors: {
      blue: {
        light: '#85d7ff',
        DEFAULT: '#1fb6ff',
        dark: '#009eeb',
      },
      pink: {
        light: '#ff7ce5',
        DEFAULT: '#ff49db',
        dark: '#ff16d1',
      },
      gray: {
        darkest: '#1f2d3d',
        dark: '#3c4858',
        DEFAULT: '#c0ccda',
        light: '#e0e6ed',
        lightest: '#f9fafc',
      }
    },
    fontFamily: {
      sans: ['Graphik', 'sans-serif'],
    },
    extend: {
      flexGrow: {
        2: '2'
        3: '3'
      },
      zIndex: {
        60: '60'
        70: '70'
        80: '80'
        90: '90'
        100: '100'
      },
    }
  },
  plugins: [
    require('@tailwindcss/typography')
    require('@tailwindcss/aspect-ratio')
  ],
}

如您所見,預設可以包含您習慣使用的所有配置選項,包括主題覆寫和擴展、添加插件、配置前綴等等,閱讀 如何合并配置 了解更多資訊,

假設此預設保存在 ./tailwind-preset.js,您可以通過將其添加到您實際專案中的 tailwind.config.js 檔案中的 presets 鍵下來使用它:

// tailwind.config.js
module.exports = {
  presets: [
    require('./tailwind-preset.js')
  ],
  // Customizations specific to this project would go here
  theme: {
    extend: {
      minHeight: {
        48: '12rem',
      }
    }
  },
  variants: {
    extend: {
      backgroundColor: ['active']
    },
  },
}

默認情況下,預設本身會擴展 Tailwind 的 默認配置,就像您自己的配置一樣,如果您想創建一個預設來完全代替默認配置,在預設本身中包含一個空的 presets 鍵,

// Example preset
module.exports = {
  presets: [],
  theme: {
    // ...
  },
  plugins: [
    // ...
  ],
}

了解更多資訊,閱讀 禁用默認配置,


如何合并配置

專案特定的配置(那些在您的 tailwind.config.js 檔案中找到的配置)與預設配置合并的方式與默認配置合并的方式相同,

tailwind.config.js 中的以下選項只是替換了預設中存在的相同選項:

  • purge
  • darkMode
  • prefix
  • important
  • variantOrder
  • separator

其余的選項都是以該選項最合理的方式仔細合并的,接下來詳細解釋,

主題

theme 物件被淺合并,tailwind.config.js 中的頂層鍵替換了任何預設中相同的頂層鍵,唯一的例外是 extend 鍵,它在所有配置中被收集,并應用在主題配置的其余部分之上,

在 主題配置檔案 中了解更多關于 theme 選項如何作業的資訊,

變體

variants 物件和 theme 物件一樣,是淺合并的,用頂層鍵替換任何預設中的相同頂層鍵,extend 鍵是唯一的例外,和 theme 一樣,在所有配置中收集,

在 variants 配置檔案 中了解更多關于 variants 選項如何作業的內容,

預設

presets 陣列是跨配置合并的,允許預設引入自己的預設,被引入的預設也可以引入自己的預設,

插件

plugins 陣列在不同的配置中被合并,使預設可以注冊插件,同時也允許您添加額外的專案級插件,

這意味著不可能禁用一個預設所添加的插件,如果您發現自己想要禁用預設中的某個插件,這說明您可能應該將該插件從預設中移除,并逐個專案地將其參考,或者 把預設拆分為兩個,

核心插件

corePlugins 選項根據您是將其配置為物件還是陣列而表現不同,

如果您把 corePlugins 配置為一個物件,那么它就會被跨配置合并,

// ./example-preset.js
module.exports = {
  // ...
  corePlugins: {
    float: false,
  },
}

// tailwind.config.js
module.exports = {
  presets: [
    require('./example-preset.js'),
  ],
  // This configuration will be merged
  corePlugins: {
    cursor: false
  }
}

如果您把 corePlugins 配置為一個陣列,它就會取代您配置的預設所提供的任何 corePlugins 配置,

// ./example-preset.js
module.exports = {
  // ...
  corePlugins: {
    float: false,
  },
}

// tailwind.config.js
module.exports = {
  presets: [
    require('./example-preset.js'),
  ],
  // This will replace the configuration in the preset
  corePlugins: ['float', 'padding', 'margin']
}

擴展多個預設

presets 選項是一個陣列,可以接受多個預設,如果您想把您的可重復使用的定制拆分成可以獨立匯入的組合塊,這很有用,

// tailwind.config.js
module.exports = {
  presets: [
    require('@acmecorp/tailwind-colors'),
    require('@acmecorp/tailwind-fonts'),
    require('@acmecorp/tailwind-spacing'),
  ]
}

在添加多個預設時,需要注意的是,如果它們以任何方式重疊,它們的決議方式和您自己的自定義與預設的決議方式是一樣的,最后的配置獲勝,

例如,如果這兩個配置都提供了一個自定義調色板(并且沒有使用 extend),則會使用 configuration-b 的調色板,

// tailwind.config.js
module.exports = {
  presets: [
    require('@acmecorp/configuration-a'),
    require('@acmecorp/configuration-b'),
  ]
}

禁用默認配置

如果您想完全禁用默認配置并且不使用任何基礎配置,請將 presets 設定為一個空陣列,

// tailwind.config.js
module.exports = {
  presets: [],
  // ...
}

這將完全禁用所有 Tailwind 的默認設定,因此根本不會生成顏色、字體系列、字體大小、間距值等,

如果您想讓您的預設提供一個完整的設計系統,而不是擴展 Tailwind 的默認值,您也可以在預設中這樣做,

// ./example-preset.js
module.exports = {
  presets: [],
  // ...
}

// tailwind.config.js
module.exports = {
  presets: [
    require('./example-preset.js')
  ],
  // ...
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/300256.html

標籤:其他

上一篇:關于js實作哥德巴赫猜想

下一篇:node.js案例,寫一個簡單的get請求,請求有50%的概率,要求資料在一個json檔案中

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more