定制器:实时预览中同一元素上的多个CSS样式

时间:2017-11-17 作者:Troy Templeman

我有一个粘性标题,它有一个初始背景色和一个不同的滚动背景色。我的javascript添加了.navbar-scroll 滚动时,将类设置为以下导航栏:

<nav id="nav" class="navbar navbar-fixed-top">
    ...
</nav>
css如下所示:

.navbar {
    background-color: #000;
}

.navbar-scroll {
    background-color: #fff;
}
我在customizer中有以下代码。php:

// Header Background Color
$wp_customize->add_setting( \'header_background_color\', array(
    \'default\'           => \'#000\',
    \'transport\'         => \'postMessage\'
) ); 
$wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, \'header_background_color\', array(
    \'label\'             => __( \'Header Background Color\', \'my-theme\' ),
    \'section\'           => \'title_tagline\',
    \'settings\'          => \'header_background_color\',
) ) );

// Sticky Header Background Color
$wp_customize->add_setting( \'sticky_header_background_color\', array(
    \'default\'           => \'#fff\',
    \'transport\'         => \'postMessage\'
) ); 
$wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, \'sticky_header_background_color\', array(
    \'label\'             => __( \'Sticky Header Background Color\', \'my-theme\' ),
    \'section\'           => \'title_tagline\',
    \'settings\'          => \'sticky_header_background_color\',
) ) );

function header_output() {
    <style type="text/css">
    .navbar { 
        background-color: <?php echo get_theme_mod( \'header_background_color\' , \'#000\' ); ?>;
    }
    .navbar-scroll { 
        background-color: <?php echo get_theme_mod( \'sticky_header_background_color\' , \'#fff\' ); ?>;
    }
    </style>
} 
function generate_css( $selector, $style, $mod_name, $prefix=\'\', $postfix=\'\', $echo=true ) {
    ... // I\'ll omit this code here
}
add_action( \'wp_head\' , \'header_output\' );
我在customizer中有以下代码。js公司:

// Background Color
wp.customize( \'header_background_color\', function( value ) {
    value.bind( function( newval ) {
        $(\'.navbar\').css( \'background-color\', newval );
    } );
} );

// Sticky Background Color
wp.customize( \'sticky_header_background_color\', function( value ) {
    value.bind( function( newval ) {
        $(\'.navbar-scroll\').css( \'background-color\', newval );
    } );
} );
我遇到的问题是在Customizer Live预览中。当用户更改任一颜色时,它会在该元素上注入css样式,并覆盖该元素上的现有样式。因此,用户一次只能看到一种颜色。例如,如果更改了初始标题背景颜色,则该颜色仍将显示在滚动上。如果更改了粘性标题的背景颜色,无论用户是否滚动,都只会看到该颜色。一旦保存,它将在前端正常工作,但我不想向用户解释这个bug。

有没有办法保持这两种样式都处于活动状态?也许在头部为每个类注入css,而不是内联?

1 个回复
最合适的回答,由SO网友:Weston Ruter 整理而成

是,而不是更新内联style 对于直接的元素,应该使用样式表。您可以创建一个在JS和PHP中都使用的样式表模板。这是在216主题中完成的,实际上我只是在standalone example plugin 对于另一个answer.

注意stylesheet_template 该模板字符串由PHP在wp_print_styles 措施:

/**
 * Print styles.
 */
public function print_styles() {
    echo \'<style id="wpse-286268" type="text/css">\';
    $css = $this->stylesheet_template;
    $tpl_vars = array();
    foreach ( $this->device_configs as $slug => $params ) {
        $tpl_vars[ \'{{outline_color_\' . $slug . \'}}\' ] = get_theme_mod( "outline_color_{$slug}", $params[\'default\'] );
    }
    echo esc_html( str_replace(
        array_keys( $tpl_vars ),
        array_values( $tpl_vars ),
        $css
    ) );
    echo \'</style>\';
}
然后由JS渲染出来in the customizer preview:

/**
 * Update preview.
 *
 * @returns {void}
 */
component.updatePreview = function updatePreview() {
    var css = component.stylesheetTemplate;
    _.each( component.deviceSettings, function( setting ) {
        css = css.replace( \'{{\' + setting.id + \'}}\', setting.get() );
    } );
    component.style.text( css );
};

结束