javascript - 变换比例时如何检查元素是否在视口(viewport)之外

标签 javascript jquery html css

我知道 getBoundingClientRect() 获取 View 中的边界,但我发现如果 View 具有变换比例,这将不起作用。您的任何解决方案。

var bounding = elem.getBoundingClientRect();

// Check if it's out of the viewport on each side
var out = {};
out.top = bounding.top >= 0;
out.left = bounding.left >= 0;
out.bottom = (bounding.bottom) > ((window.innerHeight) || (document.documentElement.clientHeight));
out.right = (bounding.right) > ((window.innerWidth) || (document.documentElement.clientWidth));

最佳答案

请拖动正方形,它有变换比例和旋转。

$.fn.isOnScreen = function(partial){

    //let's be sure we're checking only one element (in case function is called on set)
    var t = $(this).first();

    //we're using getBoundingClientRect to get position of element relative to viewport
    //so we dont need to care about scroll position
    var box = t[0].getBoundingClientRect();

    //let's save window size
    var win = {
        h : $(window).height(),
        w : $(window).width()
    };

    //now we check against edges of element

    //firstly we check one axis
    //for example we check if left edge of element is between left and right edge of scree (still might be above/below)
    var topEdgeInRange = box.top >= 0 && box.top <= win.h;
    var bottomEdgeInRange = box.bottom >= 0 && box.bottom <= win.h;

    var leftEdgeInRange = box.left >= 0 && box.left <= win.w;
    var rightEdgeInRange = box.right >= 0 && box.right <= win.w;


    //here we check if element is bigger then window and 'covers' the screen in given axis
    var coverScreenHorizontally = box.left <= 0 && box.right >= win.w;
    var coverScreenVertically = box.top <= 0 && box.bottom >= win.h;

    //now we check 2nd axis
    var topEdgeInScreen = topEdgeInRange && ( leftEdgeInRange || rightEdgeInRange || coverScreenHorizontally );
    var bottomEdgeInScreen = bottomEdgeInRange && ( leftEdgeInRange || rightEdgeInRange || coverScreenHorizontally );

    var leftEdgeInScreen = leftEdgeInRange && ( topEdgeInRange || bottomEdgeInRange || coverScreenVertically );
    var rightEdgeInScreen = rightEdgeInRange && ( topEdgeInRange || bottomEdgeInRange || coverScreenVertically );

    //now knowing presence of each edge on screen, we check if element is partially or entirely present on screen
    var isPartiallyOnScreen = topEdgeInScreen || bottomEdgeInScreen || leftEdgeInScreen || rightEdgeInScreen;
    var isEntirelyOnScreen = topEdgeInScreen && bottomEdgeInScreen && leftEdgeInScreen && rightEdgeInScreen;

    return partial ? isPartiallyOnScreen : isEntirelyOnScreen;

};

$.expr.filters.onscreen = function(elem) {
  return $(elem).isOnScreen(true);
};

$.expr.filters.entireonscreen = function(elem) {
  return $(elem).isOnScreen(true);
};

$(function(){

$('#circle1').draggable({   drag: function() {
if ($("#circle1").isOnScreen()) $('.indicator').html('yes its on screen');
else $('.indicator').html('its off screen');
      },});


});
.circle{
width: 50px;
height: 50px;
background-color: red;
top: 50%;
left: 50%;
}

.circle.big{
transform: scale(2,2) rotate(20deg);

}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.1/jquery.min.js"></script>
<script
  src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"
  integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU="
  crossorigin="anonymous"></script>
  
<div class="circle big" id="circle1">drag me</div>

<div class="indicator"></div>
Press to enlarge

关于javascript - 变换比例时如何检查元素是否在视口(viewport)之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58537879/

相关文章:

javascript - 使用 span 代替 div 来显示省略号

javascript - 点之间的空间和从上到下的动画

javascript - JavaScript 中未知大小的多维数组

javascript - 如何检查对象是否存在于多个数组中

javascript - CSS - 自动高度 div

javascript - 访问 :before pseudo selector 上的样式属性 "content"

ide - 任何好的、可视化的 HTML5 编辑器或 IDE?

jquery - jquery Parallax 的跨浏览器滚动问题

javascript - jQuery - 如何在事件触发后暂时禁用 onclick 事件监听器?

javascript - jQuery UI - 动态设置可调整大小元素的 minHeight