You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

引入自定义样式表后Bootstrap样式失效问题求助

解决Bootstrap与自定义样式共存的问题

咱们一步步来搞定这个问题,你其实已经快成功了,只是几个拼写错误和加载方式冲突的小问题在拖后腿!

首先,先修正代码里的拼写错误(这些是关键坑)

  • application.html.erb里的拼写错误:把data-turbolineks-track改成data-turbolinks-track(注意是turbolinks不是turbolineks),修正后的代码片段:
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
    
  • application.scss里的拼写错误:把@import "boostrap";改成@import "bootstrap";(少了一个t),正确的导入:
    @import "bootstrap-sprockets";
    @import "bootstrap";
    
  • application.js里的冗余内容:把//= require_tree . here里的here删掉,改成//= require_tree .,这行的作用是加载所有同目录下的JS文件,不需要额外的文字。

接下来,选择一种Bootstrap加载方式(二选一,避免冲突)

你现在的核心问题是同时用了CDN的Bootstrap和本地Sprockets导入的Bootstrap,两者会互相冲突,所以得选一种方式:

方案一:用本地导入的Bootstrap(推荐,方便自定义)

这种方式下,我们移除HTML里的CDN链接,完全通过Rails的资产管道加载Bootstrap和自定义样式:

修正后的application.html.erb:

<head>
  <title>Software & Cia.</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
  <%= csrf_meta_tags %>
</head>

然后在application.scss里,你可以直接在Bootstrap导入之后写自定义样式,这样你的样式会覆盖Bootstrap的默认样式:

@import "bootstrap-sprockets";
@import "bootstrap";

/* 在这里写你的自定义样式,比如: */
.navbar-custom {
  background-color: #2c3e50;
}

.btn-primary-custom {
  background-color: #e74c3c;
  border-color: #e74c3c;
}

application.js保持修正后的样子即可:

//= require jquery
//= require jquery_ujs
//= require bootstrap-sprockets
//= require turbolinks
//= require_tree .

方案二:用CDN加载Bootstrap + 自定义样式

如果你更倾向于用CDN的Bootstrap,那我们移除本地的Bootstrap导入,只保留自定义样式:

application.html.erb保留CDN链接:

<head>
  <title>Software & Cia.</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
  <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
  <%= csrf_meta_tags %>
</head>

然后application.scss里移除Bootstrap导入,只写自定义样式:

/* 你的自定义样式,会在CDN的Bootstrap之后加载,自动覆盖默认样式 */
.card-shadow {
  box-shadow: 0 4px 12px rgba(0,0,0,0.15);
}

application.js里可以移除//= require bootstrap-sprockets,因为已经用CDN加载了Bootstrap的JS:

//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree .

为什么这样能解决问题?

  • 拼写错误导致本地的Bootstrap没有被正确导入,所以之前保留stylesheet_link_tag时,Bootstrap没生效,反而可能和CDN的版本冲突。
  • 同时加载CDN和本地的Bootstrap会导致样式/JS冲突,选一种方式就能避免这个问题。
  • 自定义样式放在Bootstrap之后加载(不管是本地导入后写,还是CDN之后加载application.css),就能正确覆盖Bootstrap的默认样式。

内容的提问来源于stack exchange,提问作者Italo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:04:24