使用 CSS 旋转阴影效果

路西法63

问题几乎与相同:如何使用CSS旋转阴影效果?

但我的问题有点复杂:我使用“过滤器:阴影”,因为我想要具有阴影效果的对象是复合的 - 它由两个原始图形组成。

用 JS达到了预期的效果 - 只需旋转主要对象,然后计算阴影方向。但是阴影在重新渲染时会闪烁,至少在 Chrome 中是可见的。

(function() {
    const RAD_TO_DEG = 180/Math.PI,
          DEG_TO_RAD = Math.PI/180;

    var arrow = document.getElementsByClassName('arrow')[0],
        arrow_shadow_color = 'rgba(50,50,50,0.25)',
        previous_x = 0,
        previous_y = 0,
        shadow_angle = -45,
        shadow_blur_radius = 5,
        shadow_offset = 15,
        shadow_string_right = 'px ' + shadow_blur_radius + 'px ' + arrow_shadow_color + ')',
        amount_of_attempts_to_skip = 10,
        n = 0;
  
    dropShadow(180);
    document.addEventListener('mousemove', mouseMove);

    function mouseMove(e) {
        n++;
        if (n%amount_of_attempts_to_skip === 0) {
            var angle =  Math.atan2( previous_y - e.pageY, e.pageX - previous_x ) * RAD_TO_DEG;

            arrow.style.transform = 'rotate(' + (180 - ~~angle) + 'deg)';
            dropShadow(angle);

            previous_x = e.pageX;
            previous_y = e.pageY;
        }
    }
  
    function dropShadow(angle) {
        angle = 180 - shadow_angle + angle;

        var x = ( shadow_offset * Math.cos( angle * DEG_TO_RAD) ).toFixed(2),
            y = ( shadow_offset * Math.sin( angle * DEG_TO_RAD) ).toFixed(2);

        arrow.style.filter = 'drop-shadow(' + x + 'px ' + y + shadow_string_right;
    }
})();
html, body {
    width: 100%;
    height: 100%;
    box-sizing: border-box;
}
* {
    margin: 0;
    border: 0;
    padding: 0;
    position: relative;
    box-sizing: inherit;
}
.container {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-100%, -50%);
}
.arrow {
    width: 75px;
    height: 20px;
    background: #2ECC40;
    transform-origin: right;
    transition: all 0.15s ease;
}
.arrow:before {
    content: "";
    position: absolute;
    border-bottom: 15px solid transparent;
    border-right: 20px solid #2ECC40;
    border-top: 15px solid transparent;
    height: 0px;
    width: 0px;
    margin-left: -20px;
    margin-top: -5px;
}
<div class="container"><div class="arrow"></div></div>

所以问题是:是否可以用 CSS 为复合对象创建阴影效果,然后旋转它,使其保持与 CSS 的绝对角度?

或者至少可以使用 JS,但可以通过其他方式手动设置 x 和 y 过滤器偏移量。

UPD:我刚刚意识到不需要动态应用阴影样式 - 它可以应用于容器:不会有重新渲染闪烁,不需要应用一些技术来平滑阴影移动,不需要手动计算阴影偏移,就是这样。我回答了我自己的问题,因为这很愚蠢。

路西法63

我刚刚意识到不需要动态应用阴影样式 - 它可以应用于容器:不会有重新渲染闪烁,不需要应用一些技术来平滑阴影移动,不需要手动计算阴影抵消,就是这样。所有这些都将自动呈现。

那么“是否可以用 CSS 为复合对象创建阴影效果,然后旋转它以使其保持与 CSS 的绝对角度”的答案是的,这是可能的:只适用于下拉阴影过滤器,你想有一个阴影效果的元素的容器。

Stackoverflow,抱歉问了一些愚蠢的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章