覆盖/忽略活动主题中的css,以免干扰我的自定义css

时间:2020-03-14 作者:icolumbro

我正在编写一个简单的插件,在页面/帖子上显示一个具有自定义样式的表单,用于输入字段、复选框、按钮等。。。通过短代码。当用户在页面中编写短代码时,它会生成一些CSS、一些HTML和一些JavaScript,但由于活动主题CSS,结果并没有按我所想的那样呈现。事实上,如果我在一个简单的HTML文件中编写了相同的CSS、HTML和JavaScript组合,那么呈现效果是完美的,如果在WordPress中,我更改了主题,呈现效果就会改变。。。

如何通过将控件呈现为插入简单的HTML页面,防止活动主题干扰插件?

EDIT, added code:

  <div class="chatbox-container">
    <button class="chatbox-open">
        <i class="fa fa-comment fa-2x" aria-hidden="true"></i>
      </button>
    <button class="chatbox-close">
        <i class="fa fa-close fa-2x" aria-hidden="true"></i>
      </button>
    <section class="chatbox-popup">
      <header class="chatbox-popup__header">
        <aside style="flex:3">
          <i class="fa fa-user-circle fa-4x chatbox-popup__avatar" aria-hidden="true"></i>
        </aside>
        <aside style="flex:8">
          <h1>Tal Dei Tal</h1> Seller (Online)
        </aside>
        <aside style="flex:1">
          <button class="chatbox-maximize"><i class="fa fa-window-maximize" aria-hidden="true"></i></button>
        </aside>
      </header>
      <main class="chatbox-popup__main">
        Some sample text, here GDPR terms...
      </main>
      <footer class="chatbox-popup__footer">
        <aside style="flex:1;color:#888;text-align:center;">
          <i class="fa fa-camera" aria-hidden="true"></i>
        </aside>
        <aside style="flex:10">
          <textarea type="text" placeholder="Type your message here..." autofocus></textarea>
        </aside>
        <aside style="flex:1;color:#888;text-align:center;">
          <i class="fa fa-paper-plane" aria-hidden="true"></i>
        </aside>
      </footer>
    </section>
    <section class="chatbox-panel">
      <header class="chatbox-panel__header">
        <aside style="flex:3">
          <i class="fa fa-user-circle fa-3x chatbox-popup__avatar" aria-hidden="true"></i>
        </aside>
        <aside style="flex:6">
          <h1>Tal Dei Tali</h1> Seller (Online)
        </aside>
        <aside style="flex:3;text-align:right;">
          <button class="chatbox-minimize"><i class="fa fa-window-restore" aria-hidden="true"></i></button>
          <button class="chatbox-panel-close"><i class="fa fa-close" aria-hidden="true"></i></button>
        </aside>
      </header>
      <main class="chatbox-panel__main" style="flex:1">
        Some sample text, here GDPR terms...
      </main>
      <footer class="chatbox-panel__footer">
        <aside style="flex:1;color:#888;text-align:center;">
          <i class="fa fa-camera" aria-hidden="true"></i>
        </aside>
        <aside style="flex:10">
          <textarea type="text" placeholder="Type your message here..." autofocus></textarea>
        </aside>
        <aside style="flex:1;color:#888;text-align:center;">
          <i class="fa fa-paper-plane" aria-hidden="true"></i>
        </aside>
      </footer>
    </section>
  </div>

<style type="text/css">
.chatbox-container {
  all: initial;
  font-family: "Lato", sans-serif;
}

.chatbox-container h1 {
  margin: 0;
  font-size: 16px;
  line-height: 1;
}

.chatbox-container button {
  color: inherit;
  background-color: transparent;
  border: 0;
  outline: 0 !important;
  cursor: pointer;
}
.chatbox-container button.chatbox-open {
  position: fixed;
  bottom: 0;
  right: 0;
  width: 52px;
  height: 52px;
  color: #fff;
  background-color: #0360a5;
  background-position: center center;
  background-repeat: no-repeat;
  box-shadow: 12px 15px 20px 0 rgba(46, 61, 73, 0.15);
  border: 0;
  border-radius: 50%;
  cursor: pointer;
  margin: 16px;
}
.chatbox-container button.chatbox-close {
  position: fixed;
  bottom: 0;
  right: 0;
  width: 52px;
  height: 52px;
  color: #fff;
  background-color: #0360a5;
  background-position: center center;
  background-repeat: no-repeat;
  box-shadow: 12px 15px 20px 0 rgba(46, 61, 73, 0.15);
  border: 0;
  border-radius: 50%;
  cursor: pointer;
  display: none;
  margin: 16px calc(2 * 16px + 52px) 16px 16px;
}

.chatbox-container textarea {
  box-sizing: border-box;
  width: 100%;
  margin: 0;
  height: calc(16px + 16px / 2);
  padding: 0 calc(16px / 2);
  font-family: inherit;
  font-size: 16px;
  line-height: calc(16px + 16px / 2);
  color: #888;
  background-color: none;
  border: 0;
  outline: 0 !important;
  resize: none;
  overflow: hidden;
}
.chatbox-container textarea::-webkit-input-placeholder {
  color: #888;
}
.chatbox-container textarea::-moz-placeholder {
  color: #888;
}
.chatbox-container textarea:-ms-input-placeholder {
  color: #888;
}
.chatbox-container textarea::-ms-input-placeholder {
  color: #888;
}
.chatbox-container textarea::placeholder {
  color: #888;
}

.chatbox-container .chatbox-popup {
  display: -webkit-box;
  display: flex;
  position: fixed;
  box-shadow: 5px 5px 25px 0 rgba(46, 61, 73, 0.2);
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
          flex-direction: column;
  display: none;
  bottom: calc(2 * 16px + 52px);
  right: 16px;
  width: 377px;
  height: auto;
  background-color: #fff;
  border-radius: 16px;
}
.chatbox-container .chatbox-popup .chatbox-popup__header {
  box-sizing: border-box;
  display: -webkit-box;
  display: flex;
  width: 100%;
  padding: 16px;
  color: #fff;
  background-color: #0360a5;
  -webkit-box-align: center;
          align-items: center;
  justify-content: space-around;
  border-top-right-radius: 12px;
  border-top-left-radius: 12px;
}
.chatbox-container .chatbox-popup .chatbox-popup__header .chatbox-popup__avatar {
  margin-top: -32px;
  background-color: #0360a5;
  border: 5px solid rgba(0, 0, 0, 0.1);
  border-radius: 50%;
}
.chat-container .chatbox-popup .chatbox-popup__main {
  box-sizing: border-box;
  width: 100%;
  padding: calc(2 * 16px) 16px;
  line-height: calc(16px + 16px / 2);
  color: #888;
  text-align: center;
}
.chatbox-container .chatbox-popup .chatbox-popup__footer {
  box-sizing: border-box;
  display: -webkit-box;
  display: flex;
  width: 100%;
  padding: 16px;
  border-top: 1px solid #ddd;
  -webkit-box-align: center;
          align-items: center;
  justify-content: space-around;
  border-bottom-right-radius: 12px;
  border-bottom-left-radius: 12px;
}

.chatbox-container .chatbox-panel {
  display: -webkit-box;
  display: flex;
  position: fixed;
  box-shadow: 5px 5px 25px 0 rgba(46, 61, 73, 0.2);
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
          flex-direction: column;
  display: none;
  top: 0;
  right: 0;
  bottom: 0;
  width: 377px;
  background-color: #fff;
}
.chatbox-container .chatbox-panel .chatbox-panel__header {
  box-sizing: border-box;
  display: -webkit-box;
  display: flex;
  width: 100%;
  padding: 16px;
  color: #fff;
  background-color: #0360a5;
  -webkit-box-align: center;
          align-items: center;
  justify-content: space-around;
  -webkit-box-flex: 0;
          flex: 0 0 auto;
}
.chatbox-container .chatbox-panel .chatbox-panel__main {
  box-sizing: border-box;
  width: 100%;
  padding: calc(2 * 16px) 16px;
  line-height: calc(16px + 16px / 2);
  color: #888;
  text-align: center;
  -webkit-box-flex: 1;
          flex: 1 1 auto;
}
.chatbox-container .chatbox-panel .chatbox-panel__footer {
  box-sizing: border-box;
  display: -webkit-box;
  display: flex;
  width: 100%;
  padding: 16px;
  border-top: 1px solid #ddd;
  -webkit-box-align: center;
          align-items: center;
  justify-content: space-around;
  -webkit-box-flex: 0;
          flex: 0 0 auto;
}
</style>

4 个回复
SO网友:RiddleMeThis

您可以确保您的CSSenqueued 在你的主题的CSS之后,还要确保你的CSS使用的规则更加具体。这将有助于使CSS覆盖主题的CSS。

您可以添加更糟糕的情况!如果你很难覆盖你的主题,一些CSS规则很重要。

当您使用wp_enqueue_style 您应该使用wp_enqueue_scripts 钩子,它提供了一个优先级参数。这里有一个例子。

function wpse_my_plugin_styles() {
    $plugin_url = plugin_dir_url( __FILE__ );
    wp_enqueue_style( \'my_styles\',  $plugin_url . "/css/style.css");
}

add_action(\'wp_enqueue_scripts\', \'wpse_my_plugin_styles\', 999); 
您还可以创建child theme. 这将允许您根据自己的需要自定义CSS,而不必担心插件更新时CSS会被删除。

SO网友:Tom J Nowell

只有两种方法可以实现这一点,WordPress也没有:

1。使用iframe使您的短代码显示一个iframe,该iframe的URL指向呈现HTML的实际位置

2。构建Web组件内部DOM与页面的其余部分分离并隔离,允许您安全地加载样式,因为它们只应用于那些DOM元素。

这些解决方案都不是基于WordPress的,也不需要WordPress知识。这些是针对一般web开发问题的一般web开发解决方案

SO网友:Tony Djukic

CSS中的特殊性是这里最合理的解决方案,因为它是针对“插件”的,所以它的编码应该像它可以在任何站点上成功应用和使用一样,而不管主题如何。是的,在这个例子中,你可以写一个子主题,或者如果你控制主题,编辑主题CSS本身,或者添加一堆!CSS对您来说很重要,但这些都不是真正的WP最佳实践。

因此,首先要确保插件的样式表已正确排队:

function yrplugin_enqueue_frontend() {
    //I organize my plugins with a lot of sub-directories so I put my stylesheets into a CSS folder
    //I also always include version numbers
    wp_enqueue_style( \'yrplugin-frnt-css\' , plugins_url( \'css/style.css\', __DIR__ ), array(), \'version-number-here\' );
    //In case you want to enqueue some javascript...
    //wp_enqueue_script( \'yrplugin-frnt-js\', plugins_url( \'js/frontend.js\', __DIR__ ), array( \'jquery\' ), \'version-number-here\', true );
}
add_action( \'wp_enqueue_scripts\', \'yrplugin_enqueue_frontend\', 100 );
对于您的短代码,如果您还没有这样做,请将输出的内容包装成这样。如果您计划在一篇文章中使用多个短代码,那么您可以切换到一个类,这样您就不会有重复的ID。

<div id="yrplugin_container">
    <!-- The rest of your HMTL -->
</div>
最后,对于CSS,您需要寻找更具体的选择器:

#yrplugin_container input[type=text]{
    /* your css rules */
}
#yrplugin_container input[type=submit]{
    /* your css rules */
}
如果您使用这种特殊性,那么如果主主题的样式表有任何干扰,您应该不会得到太多。

如果您仍然遇到问题,那么可以简单地将CSS内联到shortcode输出的实际元素中,如:

<input type="text" style="put your overriding css here" />
这应该够了,如果你需要更多信息,请告诉我。

SO网友:Davood Denavi

如果你想从你的主题中忽略CSS,我建议你考虑使用自定义主题,然后使用插件来获得你的主题提供的功能。这里有一篇文章可以帮助您在不使用任何代码的情况下完成此操作:https://www.wpbeginner.com/wp-themes/how-to-easily-create-a-custom-wordpress-theme/

如果您只想覆盖某些css元素的属性,那么另一个选项是使用标记!重要的但是,使用!不鼓励使用重要标签。