Щебетать в бутстрапе href= "#"
Я использую вкладки TW Bootstrap для перехода по контенту на мой сайт клиентов. Я установил HTML-разметку для удаления "переключения данных" "поскольку мне нужно инсталлировать библиотеку jScrollpane при нажатии.
У меня есть это, чтобы работать. Однако, когда вы нажимаете один из значков навигации, страница перескакивает вниз.
Как мне избежать этого?
Моя разметка выглядит следующим образом:
HTML
<ul class="nav nav-tabs">
<li class="home_tab active"><a href="#home"></a></li>
<li class="about_tab"><a href="#about"></a></li>
<li class="services_tab"><a href="#services"></a></li>
<li class="cases_tab"><a href="#case_studies"></a></li>
<li class="contact_tab"><a href="#contact_us"></a></li>
<li class="news_tab"><a href="#news"></a></li>
</ul>
<div class="tab-content">
<div id="home" class="tab-pane active scroll_tab">
<?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>
<h2>
<?php the_title(); ?>
</h2>
<?php the_content(); ?>
<?php endwhile; ?>
</div>
<div id="about" class="tab-pane">
<?php
$page_id = 9;
$page_data = get_page( $page_id );
echo '<h2>'. $page_data->post_title .'</h2>';// echo the title
echo apply_filters('the_content', $page_data->post_content); // echo the content and retain Wordpress filters such as paragraph tags.
?>
</div>
<div id="services" class="tab-pane">
<div class="signs">
<ul class="nav-tabs sub_tabs">
<li class="roll_labels"><a data-toggle="tab" href="#roll_labels"></a></li>
<li class="sheeted_labels"><a data-toggle="tab" href="#page1"></a></li>
<li class="fanfold_labels"><a data-toggle="tab" href="#page1"></a></li>
<li class="printers"><a data-toggle="tab" href="#page1"></a></li>
</ul>
</div>
<?php
$page_id = 11;
$page_data = get_page( $page_id );
echo '<h2>'. $page_data->post_title .'</h2>';// echo the title
echo apply_filters('the_content', $page_data->post_content); // echo the content and retain Wordpress filters such as paragraph tags.
?>
</div>
<div id="case_studies" class="tab-pane">
<?php
$page_id = 13;
$page_data = get_page( $page_id );
echo '<h2>'. $page_data->post_title .'</h2>';// echo the title
echo apply_filters('the_content', $page_data->post_content); // echo the content and retain Wordpress filters such as paragraph tags.
?>
</div>
<div id="contact_us" class="tab-pane">
<?php
$page_id = 15;
$page_data = get_page( $page_id );
echo '<h2>'. $page_data->post_title .'</h2>';// echo the title
echo apply_filters('the_content', $page_data->post_content); // echo the content and retain Wordpress filters such as paragraph tags.
?>
</div>
<div id="news" class="tab-pane">
<?php
$page_id = 144;
$page_data = get_page( $page_id );
echo '<h2>'. $page_data->post_title .'</h2>';// echo the title
?>
<?php
// Load Latest Blog - Limited to 2 items
$recent = new WP_Query("tags=blog&showposts=2"); while($recent->have_posts()) : $recent->the_post();?>
<div class="news_excerpt">
<h3><?php the_title(); ?></h3>
<p><?php echo limit_words(get_the_excerpt(), '40'); ?> ...</p>
<a data-toggle="modal" href="#newsModal-<? the_ID(); ?>" id="newspopup">
<img src="<?php bloginfo( 'template_url' ); ?>/assets/img/content/team_read_more.png" alt="Read More" style="border:none;">
</a>
<div class="modal hide fade" id="newsModal-<? the_ID(); ?>">
<div class="modal-header">
<button data-dismiss="modal" class="close">×</button>
<h3><?php the_title(); ?></h3>
</div>
<div class="modal-body">
<p><?php the_post_thumbnail('news_image'); ?></p>
<p><?php the_content(); ?></p>
</div>
</div>
<?php endwhile; ?>
</div>
</div>
<div id="roll_labels" class="tab-pane">
<?php
$page_id = 109;
$page_data = get_page( $page_id );
echo '<h2>'. $page_data->post_title .'</h2>';// echo the title
echo apply_filters('the_content', $page_data->post_content); // echo the content and retain Wordpress filters such as paragraph tags.
?>
</div>
</div>
JQuery
$('.nav-tabs li a').click(function (e) {
$(this).tab('show');
$('.tab-content > .tab-pane.active').jScrollPane();
});
Как я уже сказал, как я могу препятствовать тому, чтобы содержимое страницы "прыгало" на якорь? Большое спасибо..
Ответы
Ответ 1
$('.nav-tabs li a').click(function (e) {
e.preventDefault();
$(this).tab('show');
$('.tab-content > .tab-pane.active').jScrollPane();
});
Используйте e.preventDefault()
. Он предотвращает действие по умолчанию (в этом случае "Навигация" на #)
Ответ 2
Использование целевого объекта данных вместо href, похоже, работает с загрузочными 3 таблетками и вкладками. Если курсор мыши не изменяется из-за того, что атрибут href отсутствует, вы можете добавить немного css
EDIT:
Код, добавленный в соответствии с запросом ниже, обратите внимание на отсутствие цели на href и добавление data-target = "#...
<ul class="nav nav-tabs" >
<li class="active"><a href="#" data-target="#tab_id_1" data-toggle="tab"> Tab Name 1</a></li>
<li><a href="#" data-target="#tab_id_2" data-toggle="tab"> Tab Name 2 </a></li>
</ul>
<div class="tab-content">
<div id="tab_id_1" class="tab-pane active">
CONTENT 1
</div>
<div id="tab_id_2" class="tab-pane">
CONTENT 2
</div>
</div>
Ответ 3
Я нашел очень простое решение. Я просто добавляю еще # в вкладках href:
<ul class="nav nav-tabs">
<li class="home_tab active"><a href="##home"></a></li>
<li class="about_tab"><a href="##about"></a></li>
<li class="services_tab"><a href="##services"></a></li>
...
</ul>
Я не знаю, лучшее ли это решение, но наверняка это быстро и просто.
В моем случае это работает на Chrome и IE 10, и для моих требований это достаточно.
Ответ 4
Определите ссылку на табуляцию следующим образом:
<a data-target="#step1" data-toggle="tab">
и ваша вкладка будет выглядеть следующим образом:
<div class="tab-pane" id="step1">
Ответ 5
Выбранный ответ от @paulslater19 не работал у меня. Следующий код сделал трюк:
<script>
$(document).ready(function() {
var hash = window.location.hash;
var link = $('a');
$('.nav-tabs > li > a').click(function (e) {
e.preventDefault();
hash = link.attr("href");
window.location = hash;
});
})
</script>
Также см. SO вопрос 14185974.
Ответ 6
Ответ от @paulslater19 не помог мне. Но, следующий код сделал:
$('.nav-tabs li a').click( function(e) {
history.pushState( null, null, $(this).attr('href') );
});
Протестировано на Bootstrap 3.2.0.
У меня есть этот код из Twitter Bootstrap: как предотвратить прыжок, когда вкладки Нажал.
UPDATE
Полная функция для bootstrap 3.2.0:
$().ready(function () {
// store the currently selected tab in the hash value
$("ul.nav-tabs > li > a").click(function (e) {
$(this).tab('show');
history.pushState(null, null, $(e.target).attr("href"));
});
// on load of the page: switch to the currently selected tab
$('ul.nav-tabs a[href="' + window.location.hash + '"]').tab('show');
});
Ответ 7
Выбранный ответ действительно сработал у меня, но я также обнаружил другое решение. Просто удалите атрибут href, как в примере ниже...
<ul class="nav nav-tabs">
<li class="home_tab active"><a></a></li>
<li class="about_tab"><a></a></li>
<li class="services_tab"><a></a></li>
...
Поскольку проблема заключается в том, что <a> -tag имеет "приоритет" над действием jQuery, достаточно просто удалить атрибут href. (<a> -tags без атрибута href допускаются кстати.)
В моем случае исходной проблемой было сложно найти, поскольку она проявлялась только в производственной среде, а не в разработке (идентичный код). Не удалось найти разницу между страницами в html или в связанных ресурсах... Во всяком случае, это решило его.
Ответ 8
Вы можете использовать <a data-target="#home">
вместо <a href="#home">
См. здесь пример: jsfiddle DEMO
Ответ 9
Я обнаружил, что вкладки будут прыгать, если высоты панели табуляции будут разными.
Я закончил стандартизацию высот, по какой-то причине даже в сетке flexbox вертикальное позиционирование имеет гремлины
function tabs_normalize() {
var tabs = $('.tab-content .tab-pane'),
heights = [],
tallest;
// check for tabs and create heights array
if (tabs.length) {
function set_heights() {
tabs.each(function() {
heights.push($(this).height());
});
tallest = Math.max.apply(null, heights);
tabs.each(function() {
$(this).css('min-height',tallest + 'px');
});
};
set_heights();
// detect resize and rerun etc..
$(window).on('resize orientationchange', function () {
tallest = 0, heights.length = 0;
tabs.each(function() {
$(this).css('min-height','0');
});
set_heights();
});
}
}
tabs_normalize();