这很不寻常,但我有一位客户想要更改滚动上的主要 Logo 。一个 Logo 位于顶部,第二个 Logo 位于滚动条上。
我成功地通过 CSS 实现了 Logo 的可见更改,方法是使用图像,然后在滚动时隐藏图像并使用::before 伪类(第二个 Logo 是基于文本的)。
但是问题是我需要根据类更改菜单 php 文件中的 url,因为两个 Logo 需要转到单独的 URL。
不幸的是我不知道如何编写 php。
我找到了相关的 php 文件并尝试将其编辑为:
$logoDiv = '<a href="https://www.link1.com" target="_blank" class="navbar-brand"' . $data_padding_shrink . ' data-minheight="'.(($LOGO->logo_min == "") ? "20" : esc_attr($LOGO->logo_min)).'">';
$logoDiv = '<a href="https://www.www.link2.com" target="_blank" class=".window-scrolled"' . $data_padding_shrink . ' data-minheight="'.(($LOGO->logo_min == "") ? "20" : esc_attr($LOGO->logo_min)).'">';
这不起作用,我认为它可能更像是一个“if/else”语句,但我现在不知道如何完成它。
编辑:为了澄清这一点,我正在尝试找出如何更改滚动图像的 href 目标。为了清楚起见,我想您可以将其视为同一张图像,因为一个是另一个的伪图像。
任何帮助都会很棒。
编辑 #2 输出 Logo 的主题文件中的 php 是这样的
$logoDiv = '<a href="'.esc_url( home_url( get_current_blog_id(), '/' ) ).'" class="navbar-brand"' . $data_padding_shrink . ' data-minheight="'.(($LOGO->logo_min == "") ? "20" : esc_attr($LOGO->logo_min)).'">';
$logoDiv = '<a href="https:url-1.com" target="_blank" class="navbar-brand"' . $data_padding_shrink . ' data-minheight="'.(($LOGO->logo_min == "") ? "20" : esc_attr($LOGO->logo_min)).'">';
我在滚动上隐藏图像,但显示一个带有文本内容的伪类(我需要显示的第二个 Logo 实际上只是文本) - 所以它的行为就像一个元素。我要么需要更改滚动上的 url,要么找到一种方法来添加 php 以添加 2 个 Logo ,然后在适当的滚动点隐藏每个 Logo 。
目前,这是我将 Logo 从图像更改为文本的方法:
.logo-image.logo-skinnable img {
opacity: 1;
transition: opacity 900ms;
}
.window-scrolled .logo-image.logo-skinnable img {
opacity: 0;
transition: opacity 900ms;
}
.logo-image.logo-skinnable::before {
font-size: 29px !important;
font-family: "Poppins";
content: 'word logo';
opacity: 0;
transition: opacity 700ms;
position: absolute;
top: 38px;
}
最佳答案
答案演示了如何根据 OP 要求实现所需的最终结果:
I either need to change the url on scroll OR, find a way to add php to add 2 logos, and then hide each one at the appropriate scroll points.
URL 被认为是 anchor 链接 ( <a href=""/>
),因为 OP 声明不希望更改 Logo 图像 url。
根据我的评论,我建议在页面上同时渲染两者,并使用 css 规则使用 display:none
隐藏第二个 Logo 。 。这将使其在初始加载时不可见。然后,您可以使用 jQuery 跟踪滚动位置并在两个 Logo 元素之间交换 css 规则,隐藏第一个并随后显示第二个。或者,您也可以根据需要使用绝对定位、z-index 和不透明度,以实现滚动过程中 Logo 过渡的淡入淡出效果。
方法A: 找到一种方法,通过php添加2个 Logo ,然后在适当的滚动点隐藏每个 Logo
您应该能够通过组合 PHP $logoDiv
中的元素来呈现模板中的两个 Logo 。变量。
$logoDiv = '<a href="https:url-1.com" target="_blank" class="navbar-brand"' . $data_padding_shrink . ' data-minheight="'.(($LOGO->logo_min == "") ? "20" : esc_attr($LOGO->logo_min)).'">Logo Text</a>
<a href="'.esc_url( home_url( get_current_blog_id(), '/' ) ).'" class="navbar-brand"' . $data_padding_shrink . ' data-minheight="'.(($LOGO->logo_min == "") ? "20" : esc_attr($LOGO->logo_min)).'">';
此方法的另一个好处是可以由浏览器预渲染,从而在 Logo 元素转换发生时防止较慢的系统出现延迟。
jQuery(function($) { //same as $(document).ready()
var logos = $('.scroll-logo');
$(window).on('scroll', function(e) {
if ($(this).scrollTop() === 0) {
$(logos[0]).addClass('hidden');
$(logos[1]).removeClass('hidden');
} else {
$(logos[1]).addClass('hidden');
$(logos[0]).removeClass('hidden');
}
});
});
.scroll-logo.hidden {
display: none;
}
/* below rules are for demo purposes only */
div {
position: fixed;
}
body{
height: 8000px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<div>
<!-- <?php echo $logoDiv; ?> -->
<a href="https:url-1.com" class="scroll-logo hidden">
Logo Text
</a>
<a href="//chrome.google.com" class="scroll-logo">
<img src="//www.google.com/chrome/static/images/chrome-logo.svg" alt="Google Chrome"/>
</a>
</div>
正如您所说,您想要更改元素的 href 属性,因此也可以使用类似的滚动技术来更改元素属性。允许您使用 data
属性以指定要更改为的 URL。
方法 B: 更改滚动时的 URL(使用 data-url
属性)
$logoDiv = '<a href="'.esc_url( home_url( get_current_blog_id(), '/' ) ).'" class="navbar-brand"' . $data_padding_shrink . ' data-minheight="'.(($LOGO->logo_min == "") ? "20" : esc_attr($LOGO->logo_min)).'" data-url="https:url-1.com">';
jQuery(function($) { //same as $(document).ready()
var logo = $('[data-url]');
var newHref = logo.data('url');
var originalHref = logo.attr('href');
$(window).on('scroll', function(e) {
if ($(this).scrollTop() === 0) {
logo.attr('href', originalHref)
.removeClass('hide_logo');
} else {
logo.attr('href', newHref)
.addClass('hide_logo');
}
});
});
a.hide_logo img {
display: none;
}
a.hide_logo:before {
content: "Logo Text";
}
/* below is for demo purposes only */
div {
position: fixed;
}
body {
height: 8000px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<div>
<!-- <?php echo $logoDiv; ?> -->
<a href="//chrome.google.com" data-url="https:url-1.com">
<img src="//www.google.com/chrome/static/images/chrome-logo.svg" alt="Google Chrome"/>
</a>
</div>
方法B + Scroll-Spy 类
作为滚动 spy 运行,监听类 window-scrolled
相反,您只需使用 hasClass
而不是检查 scrollTop
的位置。更改logo.hasClass
到添加了类的适当元素。
jQuery(function($) { //same as $(document).ready()
var logo = $('[data-url]');
var newHref = logo.data('url');
var originalHref = logo.attr('href');
var scrollSpy = null;
$(window).on('scroll', function(e) {
if (null !== scrollSpy) {
//cancel previous delay
window.clearTimeout(scrollSpy);
}
//delay scrollSpy to ensure class is not added after checking
scrollSpy = window.setTimeout(function() {
if (!logo.hasClass('window-scrolled')) {
logo.attr('href', originalHref);
} else {
logo.attr('href', newHref);
}
}, 250); //adjust timeout as desired
});
//--- demo purposes only (DO NOT USE BELOW) ---
$(window).on('scroll', function(e) {
if ($(this).scrollTop() === 0) {
logo.removeClass('window-scrolled');
} else {
logo.addClass('window-scrolled');
}
});
});
a.window-scrolled img {
display: none;
}
a.window-scrolled:before {
content: "Logo Text";
}
/* below is for demo purposes only */
div {
position: fixed;
}
body {
height: 8000px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<div>
<!-- <?php echo $logoDiv; ?> -->
<a href="//chrome.google.com" data-url="https:url-1.com">
<img src="//www.google.com/chrome/static/images/chrome-logo.svg" alt="Google Chrome"/>
</a>
</div>
或者您也可以使用$('.window-scrolled').length === 0
确定是否有任何元素具有该类,或指定 window-scrolled
的所需元素父级像这样$('[selector] .window-scrolled')
(将 [selector] 替换为所需的父元素选择器,即 div.wrapper
)。
关于javascript - 根据php中的类更改url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54415068/