Limit the scope of bootstrap styles

后端 未结 9 2259
情歌与酒
情歌与酒 2020-11-27 02:56

How do I limit Bootstrap to just the scope of a div? I need to nest the Bootstrap stylesheet inside an ExtJS app for especific divs and both are clashing since they need the

9条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-11-27 03:50

    If you want a pure JavaScript solution with no outside libraries involved, you could go this route: The general idea is to load the raw css, then parse it line by line adding in your scoped selector where necessary.

    function scopeCSS(scopeSelector, rawCSS) {
      return rawCSS.split('\n').map(line => {
        var trimmedLine = line.trim()
        if (trimmedLine.startsWith('*') || trimmedLine.startsWith('/*') || trimmedLine.startsWith('@media') || trimmedLine === '' || trimmedLine.endsWith(';') || trimmedLine.endsWith('}')) {
          return line
        }
        return line.split(',').map(selector => selector.trim()).map(selector => selector === '' ? selector : `${scopeSelector} ${selector}`).join(',');
      }).join('\n')
    }
    const rawCSS = document.querySelector('#before').textContent // just as an example, you'd probably use a raw loader with webpack
    document.querySelector('#after').textContent = scopeCSS('.bootstrap-scope', rawCSS)
    #grid {
      display: grid;
      width: 100%;
      grid-template-columns: 1fr 1fr;
    }
    /*!
     * Bootstrap Grid v5.0.0-alpha1 (https://getbootstrap.com/)
     * Copyright 2011-2020 The Bootstrap Authors
     * Copyright 2011-2020 Twitter, Inc.
     * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
     */
    .container,
    .container-fluid,
    .container-sm,
    .container-md,
    .container-lg,
    .container-xl,
    .container-xxl {
      width: 100%;
      padding-right: 1rem;
      padding-left: 1rem;
      margin-right: auto;
      margin-left: auto;
    }
    
    @media (min-width: 576px) {
      .container, .container-sm {
        max-width: 540px;
      }
    }
    
    @media (min-width: 768px) {
      .container, .container-sm, .container-md {
        max-width: 720px;
      }
    }
    
    @media (min-width: 992px) {
      .container, .container-sm, .container-md, .container-lg {
        max-width: 960px;
      }
    }
    
    @media (min-width: 1200px) {
      .container, .container-sm, .container-md, .container-lg, .container-xl {
        max-width: 1140px;
      }
    }
    
    @media (min-width: 1400px) {
      .container, .container-sm, .container-md, .container-lg, .container-xl, .container-xxl {
        max-width: 1320px;
      }
    }
    
    .row {
      --bs-gutter-x: 1.5rem;
      --bs-gutter-y: 0;
      display: flex;
      flex: 1 0 100%;
      flex-wrap: wrap;
      margin-top: calc(var(--bs-gutter-y) * -1);
      margin-right: calc(var(--bs-gutter-x) / -2);
      margin-left: calc(var(--bs-gutter-x) / -2);
    }
    
    .row > * {
      box-sizing: border-box;
      flex-shrink: 0;
      width: 100%;
      max-width: 100%;
      padding-right: calc(var(--bs-gutter-x) / 2);
      padding-left: calc(var(--bs-gutter-x) / 2);
      margin-top: var(--bs-gutter-y);
    }
    
    .col {
      flex: 1 0 0%;
    }
    /*# sourceMappingURL=bootstrap-grid.css.map */
    
      

提交回复
热议问题