You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

545 lines
18 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
/**
* Tabs区块模板
* 支持自定义器设置和短代码调用
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
// 获取短代码参数(如果通过短代码调用)
global $tabs_shortcode_atts;
$is_shortcode = !empty($tabs_shortcode_atts) && is_array($tabs_shortcode_atts);
// 获取容器设置
$container_id = $is_shortcode ? $tabs_shortcode_atts['id'] : 'nenghui-tabs';
$container_class = $is_shortcode ? $tabs_shortcode_atts['class'] : '';
$show_animation = $is_shortcode ? $tabs_shortcode_atts['show_animation'] : 'true';
// 获取选项卡数量设置
$tabs_count = $is_shortcode && !empty($tabs_shortcode_atts['tabs_count']) ?
intval($tabs_shortcode_atts['tabs_count']) :
get_theme_mod('tabs_count', 3);
// 获取实际有效的选项卡(只有设置了标题的才算有效)
$valid_tabs = array();
$max_check = max($tabs_count, 5); // 检查范围扩大到5或设定数量
for ($i = 1; $i <= $max_check; $i++) {
// 使用自定义器中设置的默认值
$tab_title = get_theme_mod('tab_title_' . $i, "选项卡 {$i}");
if (!empty(trim($tab_title))) {
$valid_tabs[] = $i;
}
}
// 如果简码指定了数量则只取前N个有效选项卡
if ($is_shortcode && !empty($tabs_shortcode_atts['tabs_count'])) {
$valid_tabs = array_slice($valid_tabs, 0, $tabs_count);
} else {
// 否则取设定数量的有效选项卡
$valid_tabs = array_slice($valid_tabs, 0, $tabs_count);
}
$first_tab_id = '';
$first_tab_title = '';
$first_tab_image = '';
$first_tab_image_alt = '';
$first_tab_button_text = '';
$first_tab_button_url = '';
// 获取第一个有效选项卡的信息作为默认显示
$default_placeholder = get_template_directory_uri() . '/assets/images/NaN-img.png';
if (!empty($valid_tabs)) {
$first_tab_index = $valid_tabs[0];
$first_tab_id = get_theme_mod('tab_id_' . $first_tab_index, "tab-{$first_tab_index}");
$first_tab_title = get_theme_mod('tab_main_title_' . $first_tab_index, "这是选项卡 {$first_tab_index} 的主要内容标题");
$first_tab_image = get_theme_mod('tab_image_' . $first_tab_index, $default_placeholder);
$first_tab_image_alt = get_theme_mod('tab_image_alt_' . $first_tab_index, "选项卡 {$first_tab_index} 图片");
$first_tab_button_text = get_theme_mod('tab_button_text_' . $first_tab_index, '了解更多');
$first_tab_button_url = get_theme_mod('tab_button_url_' . $first_tab_index, '#');
// 如果没有设置图片,使用默认占位图片
if (empty($first_tab_image)) {
$first_tab_image = $default_placeholder;
}
} else {
// 如果没有有效选项卡,使用第一个选项卡的默认值
$first_tab_id = 'tab-1';
$first_tab_title = '这是选项卡 1 的主要内容标题';
$first_tab_image = $default_placeholder;
$first_tab_image_alt = '选项卡 1 图片';
$first_tab_button_text = '了解更多';
$first_tab_button_url = '#';
// 确保至少有一个默认选项卡
$valid_tabs = array(1);
}
?>
<style>
/* Tabs区块样式 - 使用更具体的选择器避免冲突 */
#<?php echo esc_attr($container_id); ?>.nenghui-container,
.nenghui-container {
max-width: 1200px;
margin: 0 auto;
padding: 40px 20px;
font-family: 'NotoSans', Arial, sans-serif;
}
#<?php echo esc_attr($container_id); ?> .nenghui-tabs,
.nenghui-container .nenghui-tabs {
display: flex;
justify-content: center;
margin-bottom: 40px;
gap: 10px;
}
#<?php echo esc_attr($container_id); ?> .nenghui-tab,
.nenghui-container .nenghui-tab {
padding: 12px 24px;
background-color: #e8e8e8;
border: none;
border-radius: 25px;
cursor: pointer;
font-size: 20px;
margin-right: 15px;
color: #666;
display: flex;
align-items: center;
gap: 8px;
font-weight: 500;
transition: all 0.3s ease;
}
#<?php echo esc_attr($container_id); ?> .nenghui-tab:hover,
.nenghui-container .nenghui-tab:hover {
background-color: #d0d0d0;
}
#<?php echo esc_attr($container_id); ?> .nenghui-tab.active,
.nenghui-container .nenghui-tab.active {
background-color: #1e5a96;
color: white;
}
#<?php echo esc_attr($container_id); ?> .nenghui-tab.active:hover,
.nenghui-container .nenghui-tab.active:hover {
background-color: #1e5a96;
}
#<?php echo esc_attr($container_id); ?> .main-content,
.nenghui-container .main-content {
display: flex;
align-items: center;
gap: 60px;
border-radius: 20px;
padding: 10px;
background: #ffffff;
margin-top: 20px;
}
#<?php echo esc_attr($container_id); ?> .content-left,
.nenghui-container .content-left {
flex: 1;
max-width: 50%;
}
#<?php echo esc_attr($container_id); ?> .content-right,
.nenghui-container .content-right {
flex: 1;
max-width: 50%;
}
#<?php echo esc_attr($container_id); ?> .main-title,
.nenghui-container .main-title {
font-size: 48px;
font-weight: bold;
color: #333;
line-height: 1.2;
margin-bottom: 30px;
transition: all 0.5s ease;
}
#<?php echo esc_attr($container_id); ?> .main-title .highlight,
.nenghui-container .main-title .highlight {
color: #1e5a96;
}
#<?php echo esc_attr($container_id); ?> .learn-more-btn,
.nenghui-container .learn-more-btn {
background-color: #1e5a96;
color: white;
padding: 15px 30px;
border: none;
border-radius: 25px;
font-size: 16px;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 10px;
text-decoration: none;
transition: all 0.5s ease;
}
#<?php echo esc_attr($container_id); ?> .learn-more-btn:hover,
.nenghui-container .learn-more-btn:hover {
background-color: #164a7a;
text-decoration: none;
}
#<?php echo esc_attr($container_id); ?> .learn-more-btn .arrow,
.nenghui-container .learn-more-btn .arrow {
font-size: 14px;
transition: transform 0.3s ease;
}
#<?php echo esc_attr($container_id); ?> .learn-more-btn:hover .arrow,
.nenghui-container .learn-more-btn:hover .arrow {
transform: translateX(3px);
}
#<?php echo esc_attr($container_id); ?> .tab-image,
.nenghui-container .tab-image {
width: 100%;
height: 300px;
border-radius: 15px;
position: relative;
overflow: hidden;
background: linear-gradient(135deg, #f0f0f0 0%, #e0e0e0 100%);
display: flex;
align-items: center;
justify-content: center;
}
#<?php echo esc_attr($container_id); ?> .tab-image img,
.nenghui-container .tab-image img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 15px;
transition: all 0.5s ease;
}
/* 当没有图片时的占位样式 */
#<?php echo esc_attr($container_id); ?> .tab-image:empty::before,
.nenghui-container .tab-image:empty::before {
content: "暂无图片";
color: #999;
font-size: 16px;
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
}
/* 动画效果类 */
#<?php echo esc_attr($container_id); ?> .fade-out,
.nenghui-container .fade-out {
opacity: 0;
transform: translateY(20px);
}
#<?php echo esc_attr($container_id); ?> .fade-in,
.nenghui-container .fade-in {
opacity: 1;
transform: translateY(0);
}
#<?php echo esc_attr($container_id); ?> .content-left,
.nenghui-container .content-left {
transition: opacity 0.5s ease, transform 0.5s ease;
}
#<?php echo esc_attr($container_id); ?> .content-right,
.nenghui-container .content-right {
transition: opacity 0.5s ease, transform 0.5s ease;
}
/* 响应式设计 */
@media (max-width: 1024px) {
#<?php echo esc_attr($container_id); ?>.nenghui-container,
.nenghui-container {
max-width: 95%;
padding: 40px 15px;
border-radius: 20px;
}
#<?php echo esc_attr($container_id); ?> .main-content,
.nenghui-container .main-content {
gap: 40px;
padding: 40px;
}
}
@media (max-width: 768px) {
#<?php echo esc_attr($container_id); ?>.nenghui-container,
.nenghui-container {
padding: 30px 15px;
border-radius: 15px;
max-width: 90%; /* Increase max-width for mobile */
}
#<?php echo esc_attr($container_id); ?> .main-content,
.nenghui-container .main-content {
flex-direction: column;
padding: 30px 20px;
gap: 30px;
align-items: stretch;
}
#<?php echo esc_attr($container_id); ?> .content-left,
.nenghui-container .content-left,
#<?php echo esc_attr($container_id); ?> .content-right,
.nenghui-container .content-right {
width: 100%;
max-width: 100%;
}
#<?php echo esc_attr($container_id); ?> .main-title,
.nenghui-container .main-title {
font-size: 32px;
text-align: center;
margin-bottom: 20px;
}
#<?php echo esc_attr($container_id); ?> .nenghui-tabs,
.nenghui-container .nenghui-tabs {
flex-wrap: wrap;
gap: 8px;
margin-bottom: 30px;
}
#<?php echo esc_attr($container_id); ?> .nenghui-tab,
.nenghui-container .nenghui-tab {
font-size: 13px;
padding: 10px 18px;
}
#<?php echo esc_attr($container_id); ?> .tab-image,
.nenghui-container .tab-image {
height: auto;
width: 100%;
max-width: 80%;
margin: 0 auto;
}
#<?php echo esc_attr($container_id); ?> .tab-image img,
.nenghui-container .tab-image img {
width: 100%;
height: auto;
object-fit: contain;
}
}
@media (max-width: 480px) {
#<?php echo esc_attr($container_id); ?>.nenghui-container,
.nenghui-container {
padding: 20px 10px;
}
#<?php echo esc_attr($container_id); ?> .main-content,
.nenghui-container .main-content {
padding: 20px 15px;
}
#<?php echo esc_attr($container_id); ?> .main-title,
.nenghui-container .main-title {
font-size: 28px;
}
#<?php echo esc_attr($container_id); ?> .nenghui-tab,
.nenghui-container .nenghui-tab {
font-size: 12px;
padding: 8px 16px;
}
#<?php echo esc_attr($container_id); ?> .learn-more-btn,
.nenghui-container .learn-more-btn {
padding: 12px 24px;
font-size: 14px;
margin: 0 auto;
display: inline-flex;
}
#<?php echo esc_attr($container_id); ?> .content-left,
.nenghui-container .content-left {
text-align: center;
}
#<?php echo esc_attr($container_id); ?> .tab-image,
.nenghui-container .tab-image {
max-width: 90%;
}
}
</style>
<div id="<?php echo esc_attr($container_id); ?>" class="nenghui-container <?php echo esc_attr($container_class); ?>" data-aos="fade-up">
<!-- 选项卡导航 -->
<div class="nenghui-tabs" data-aos="fade-up" data-aos-delay="200">
<?php
if (is_array($valid_tabs) && !empty($valid_tabs)) {
foreach ($valid_tabs as $index => $i) {
$tab_title = get_theme_mod('tab_title_' . $i, "选项卡 {$i}");
$tab_id = get_theme_mod('tab_id_' . $i, "tab-{$i}");
if (!empty($tab_title)) {
$active_class = ($index == 0) ? ' active' : '';
echo '<button class="nenghui-tab' . $active_class . '" data-nenghui-tab="' . esc_attr($tab_id) . '">';
echo esc_html($tab_title);
echo '</button>';
}
}
} else {
// 如果没有有效选项卡,显示提示信息
echo '<div style="text-align: center; padding: 20px; color: #666;">请在自定义器中设置选项卡内容</div>';
}
?>
</div>
<!-- 主要内容区域 -->
<div class="main-content" data-aos="fade-up" data-aos-delay="400">
<div class="content-left" data-aos="fade-up" data-aos-delay="600">
<h1 class="main-title">
<?php echo wp_kses_post($first_tab_title); ?>
</h1>
<?php if (!empty($first_tab_button_text)) : ?>
<a href="<?php echo esc_url($first_tab_button_url); ?>" class="learn-more-btn">
<span><?php echo esc_html($first_tab_button_text); ?></span>
</a>
<?php endif; ?>
</div>
<div class="content-right" data-aos="fade-up" data-aos-delay="800">
<div class="tab-image">
<img src="<?php echo esc_url($first_tab_image); ?>" alt="<?php echo esc_attr($first_tab_image_alt); ?>">
</div>
</div>
</div>
</div>
<script>
/**
* 选项卡切换功能
* 处理用户鼠标移入不同选项卡时的交互
*/
function initNenghuiTabs() {
const container = document.getElementById('<?php echo esc_js($container_id); ?>');
if (!container) return;
const nenghuiTabs = container.querySelectorAll('.nenghui-tab');
nenghuiTabs.forEach(nenghuiTab => {
nenghuiTab.addEventListener('mouseenter', function () {
// 移除所有选项卡的活动状态
nenghuiTabs.forEach(t => t.classList.remove('active'));
// 为当前鼠标移入的选项卡添加活动状态
this.classList.add('active');
// 获取选项卡类型
const nenghuiTabType = this.getAttribute('data-nenghui-tab');
// 根据选项卡类型更新内容
updateContent(nenghuiTabType, container);
});
});
}
/**
* 根据选项卡类型更新页面内容
* @param {string} nenghuiTabType - 选项卡类型
*/
function updateContent(nenghuiTabType, container) {
// 获取PHP传递的选项卡数据
const tabsData = <?php
$tabs_data = array();
if (is_array($valid_tabs) && !empty($valid_tabs)) {
foreach ($valid_tabs as $i) {
// 使用自定义器中设置的默认值
$tab_title = get_theme_mod('tab_title_' . $i, "选项卡 {$i}");
if (!empty($tab_title)) {
$tab_id = get_theme_mod('tab_id_' . $i, "tab-{$i}");
$tab_main_title = get_theme_mod('tab_main_title_' . $i, "这是选项卡 {$i} 的主要内容标题");
$tab_image = get_theme_mod('tab_image_' . $i, $default_placeholder);
$tab_image_alt = get_theme_mod('tab_image_alt_' . $i, "选项卡 {$i} 图片");
$tab_button_text = get_theme_mod('tab_button_text_' . $i, '了解更多');
$tab_button_url = get_theme_mod('tab_button_url_' . $i, '#');
// 如果没有设置图片,使用默认占位图片
if (empty($tab_image)) {
$tab_image = $default_placeholder;
}
$tabs_data[$tab_id] = array(
'title' => wp_kses_post($tab_main_title),
'image' => $tab_image,
'imageAlt' => $tab_image_alt,
'buttonText' => $tab_button_text,
'buttonUrl' => $tab_button_url
);
}
}
}
echo json_encode($tabs_data, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP);
?>;
// 更新内容
if (tabsData[nenghuiTabType]) {
const data = tabsData[nenghuiTabType];
const contentLeft = container.querySelector('.content-left');
const contentRight = container.querySelector('.content-right');
const title = container.querySelector('.main-title');
const button = container.querySelector('.learn-more-btn');
const image = container.querySelector('.tab-image img');
// 添加淡出效果
contentLeft.classList.add('fade-out');
contentRight.classList.add('fade-out');
// 延迟更新内容,等待淡出动画完成
setTimeout(() => {
// 更新标题
if (title && data.title) {
title.innerHTML = data.title;
}
// 更新按钮
if (button && data.buttonText) {
button.href = data.buttonUrl;
const textSpan = button.querySelector('span:not(.arrow)');
if (textSpan) {
textSpan.textContent = data.buttonText;
} else {
button.innerHTML = '<span>' + data.buttonText + '</span><span class="arrow">→</span>';
}
}
// 更新图片
if (image && data.image) {
image.src = data.image;
image.alt = data.imageAlt;
}
// 移除淡出效果,添加淡入效果
contentLeft.classList.remove('fade-out');
contentRight.classList.remove('fade-out');
contentLeft.classList.add('fade-in');
contentRight.classList.add('fade-in');
// 清理动画类
setTimeout(() => {
contentLeft.classList.remove('fade-in');
contentRight.classList.remove('fade-in');
}, 500);
}, 250); // 等待一半的过渡时间
}
}
// 页面加载完成后初始化功能
document.addEventListener('DOMContentLoaded', function () {
initNenghuiTabs();
// 如果存在initLearnMoreButton函数则调用
if (typeof initLearnMoreButton === 'function') {
initLearnMoreButton();
}
});
</script>