【问题标题】:How to apply css to vertically centered element (wordpress)?如何将css应用于垂直居中的元素(wordpress)?
【发布时间】:2019-04-27 02:17:36
【问题描述】:

我首先要说我对 css 很陌生,如果我的问题的答案很明显,请原谅我。我正在寻找对屏幕最中心的元素应用效果。我希望用户向下滚动并让照片从灰度中饱和。

这是我希望效果发生的页面:

http://evanscottpierce.com/portfolio/

当前的桌面行为是在悬停时饱和,但显然这不适用于移动设备,所以我希望通过滚动来触发饱和。正如您在下面看到的,我只是将灰度效果应用到桌面,直到我可以在移动设备上获得所需的行为。

这是我目前的代码:

@media only screen and (min-width:768px){
    .gray-scale-img .rl-gallery {
      overflow: hidden;
      -webkit-backface-visibility: hidden;
    }
    .gray-scale-img .rl-gallery .rl-gallery-link {
      -webkit-filter: grayscale(100%);
              filter: grayscale(100%);
      -webkit-transition: .3s ease-in-out;
              transition: .3s ease-in-out;
      will-change: filter;
    }
    .gray-scale-img .rl-gallery .rl-gallery-link:hover {
      -webkit-filter: grayscale(0);
              filter: grayscale(0);
    }
}

提前谢谢你!

【问题讨论】:

  • Evan,我会使用 jQuery 的 .is(':visible') 作为检测元素是否可见的方法。基本上,在触发 window.on('scroll' 事件时检查所有目标元素,并根据该可见性检查切换效果类。我正在制定一个实现这个想法的示例答案,但你也应该采取措施在它。
  • 检查 - .is(':visible') 没有解决问题 - 使用来自stackoverflow.com/questions/487073/…的辅助方法查看下面的答案

标签: css wordpress mobile responsive


【解决方案1】:

最简单的方法是使用css3 flexbox:

<div class="flex-container">
   <div>One</div>
   <div>Two</div>
   <div>Three</div>
   <div>Four</div>
   <div>Five</div>
   <div>Six</div>
   <div>Seven</div>
   <div>Eight</div>
   <div>Nine</div>
</div>

<style type="text/css">
.flex-container {
   display:flex;
   height: 200px;
   align-items: center;
}
</style>

【讨论】:

    【解决方案2】:

    使用辅助方法来选择是否应应用 css,然后将 css 与类一起应用非常干净。

    // loop to add sample images
    let imageCount = 0;
    while (imageCount++ < 10) {
      $('body').append('<p><img src="https://picsum.photos/200/100?image=' + imageCount + '" alt="sample image" class="gray-scale-img" ></p>');
    }
    
    // helper function to check for vertical centering
    function isScrolledIntoCenter(elem)
    {
        var docViewCenter = $(window).scrollTop() + $(window).height() / 2;
    
        var elemTop = $(elem).offset().top;
        var elemBottom = elemTop + $(elem).height();
    
        return ((elemBottom >= docViewCenter) && (elemTop <= docViewCenter));
    }
    
    // function to toggle .in-color based on visibility
    function toggleInColor() {
      const images = $('img.gray-scale-img');
    
      images.each(function() {
        $(this).toggleClass('in-color',isScrolledIntoCenter(this));
      });
    }
    
    toggleInColor();
    
    $(window).on('scroll', toggleInColor);
    .gray-scale-img {
      -webkit-backface-visibility: hidden;
      -webkit-filter: grayscale(100%);
      filter: grayscale(100%);
      -webkit-transition: .3s ease-in-out;
      transition: .3s ease-in-out;
      will-change: filter;
    }
    
    .gray-scale-img.in-color {
      -webkit-filter: grayscale(0);
      filter: grayscale(0);
    }
    &lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

    【讨论】:

    • 嘿杰森!感谢您的快速回复。这个脚本看起来几乎完成了我想要保存的一些差异。我想让中心图像饱和,而不是视图中的任何图像。以下对“isScrolledIntoView”的更改会解决这个问题吗? var docViewCenter = docViewTop + ($(window).height()/2); return ((elemBottom &gt;= docViewCenter) &amp;&amp; (elemTop &lt;= docViewCenter)); 我对 javascript 非常缺乏经验,需要一点说明。我如何将画廊元素传递给“toggleInColor”?很抱歉造成混乱!
    • 很高兴我们在正确的轨道上。此示例中的 toggleInColor 函数将过滤所有图像并根据帮助函数返回的值添加或删除 .in-color 类 - 我将使用我的滚动到中心版本而不是滚动到视图和我们会看看我们做得如何
    • 更改了辅助函数以确保只有跨越窗口垂直中心的水平线的图像才会被着色。
    • 完美!它完全按照测试图像的预期工作。但是,我无法使用“toggleInColor”功能获得画廊图像。似乎“const images = $('img.gray-scale-img');”没有在图库中注册图像。还有另一种方法可以在页面上创建一组图像以传递给函数吗? evanscottpierce.com/portfolio-test
    • 当然,看起来 $( '.rl-gallery-link' ) 或 $( '.rl-gallery-item' ) 应该可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    相关资源
    最近更新 更多