【问题标题】:SASS Applies style to the whole website despite only imported into a single pageSASS 将样式应用于整个网站,尽管仅导入到单个页面中
【发布时间】:2023-03-30 02:52:01
【问题描述】:

我正在尝试在单个 js 页面上应用 SASS 文件,但导入会在整个网站上进行。

这是我的 partner.sass 文件:

html,
body,


.media article,img p
  animation-name: fade-in
  animation-fill-mode: both
  animation-duration: 1.5s


@for $i from 1 to 60
  .media article:nth-child(#{$i})  
      animation-delay: $i * 0.1s

@keyframes fade-in
    0%
        opacity: 0
    100%
        opacity: 1

这是我的 partner.js 文件:

import React from 'react'
import PropTypes from 'prop-types'
import { graphql } from 'gatsby'
import Layout from '../components/Layout'
import Content, { HTMLContent } from '../components/Content'
import '../components/partner.sass'

export const PartnerPageTemplate = ({ title, content, contentComponent }) => {
  const PageContent = contentComponent || Content

  return (
    <section className="section section--gradient">
      <div className="container">
        <div className="columns">
          <div className="column is-10 is-offset-1">
            <div className="section">
              <h2 className="title is-size-3 has-text-weight-bold is-bold-light">
                {title}
              </h2>
              <PageContent className="content" content={content} />
              
            </div>
          </div>
        </div>
      </div>
    </section>
  )
}

PartnerPageTemplate.propTypes = {
  title: PropTypes.string.isRequired,
  content: PropTypes.string,
  contentComponent: PropTypes.func,
}

const PartnerPage = ({ data }) => {
  const { markdownRemark: post } = data

  return (
    <Layout>
      <PartnerPageTemplate
        contentComponent={HTMLContent}
        title={post.frontmatter.title}
        content={post.html}
      />
    </Layout>
  )
}

PartnerPage.propTypes = {
  data: PropTypes.object.isRequired,
}

export default PartnerPage

export const partnerPageQuery = graphql`
  query PartnerPage($id: String!) {
    markdownRemark(id: { eq: $id }) {
      html
      frontmatter {
        title
      }
    }
  }

每当我刷新或尝试切换到另一个页面时,所有内容(我相信这是由于我的 sass 文件中的 html 和 body 标签造成的)都在消失(尽管我只是希望我的 markdown 页面中的文章淡入) 无论如何,SASS 可以只应用和处理一个 js 页面而不是我的所有组件吗?

谢谢

【问题讨论】:

    标签: javascript css sass graphql gatsby


    【解决方案1】:

    只需使用 DOCS https://www.gatsbyjs.com/docs/how-to/styling/css-modules/ 中所述的 CSS 模块,其余的都是全局的,继续使用全局 css。

    示例:

    1. 将您的样式文件重命名为 partner.module.sass 并按原样导入
    2. 将带有双破折号 (section--gradient) 的规则重命名为 camelCase (sectionGradient)
    ...
    import * as styles from '../components/partner.module.sass'
    
    export const PartnerPageTemplate = ({ title, content, contentComponent }) => {
      ...
      return (
        <section className={`${styles.section} ${styles.sectionGradient}}`}>
           ...
        </section>
      )
    }
    

    【讨论】:

    • 谢谢!为我工作。抱歉,我似乎没有正确阅读文档。
    【解决方案2】:

    当然,这是使用您的方法的正常行为。请记住,React 组件或页面是代码的独立部分,最终在生成构建输出时由 webpack 编译和捆绑在一起(gatsby buildgatsby develop)。

    在您的情况下(正如您所说),您正在导入一个 SASS 文件,这会影响网站的其余样式,因为它指向 htmlbody 标签。

    在您的情况下,由于您的输出是.section section--gradient class,您可能希望使用:

    .media article,img p
      animation-name: fade-in
      animation-fill-mode: both
      animation-duration: 1.5s
    
    
    @for $i from 1 to 60
      .media article:nth-child(#{$i})  
          animation-delay: $i * 0.1s
    
    @keyframes fade-in
        0%
            opacity: 0
        100%
            opacity: 1
    

    注意:如有必要,请将其包装在 .section section--gradient 内,以便仅将规则应用于 .section section--gradient 的后代

    避免不必要的htmlbody 标签(我认为您不想对所有htmlbody 应用淡入)。每个 SASS 规则应仅应用文件中导入的元素。

    或者,如果要添加general styles,为了避免通过组件进行不必要的重复请求,只需在gatsby-browser.js中添加以下行:

    import "./src/styles/global.css" // change it to your path to global.sass
    

    【讨论】:

    • 谢谢,我也试过了,效果很好
    猜你喜欢
    • 2016-09-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2012-05-27
    • 2017-04-09
    • 1970-01-01
    • 2014-02-05
    相关资源
    最近更新 更多