ver ventanas ventana seleccionar puedo modelo ingles grafica dibujo crear comando aparece javascript jquery html css viewport

javascript - ventanas - Compruebe si el elemento está entre el 30% y el 60% de la ventana gráfica



no se ve el modelo en autocad (5)

  1. Use el controlador de eventos de scroll en la window
  2. Pase por todos los elementos li para verificar si el elemento está en la ventana gráfica interesada
  3. Obtenga la posición li desde top y verifique si está en la sección de la vista interesada.

Demo:

Cambió la altura de li para fines de demostración.

Vea los comentarios en línea en el código.

$(document).ready(function() { // Get viewport height, gridTop and gridBottom var windowHeight = $(window).height(), gridTop = windowHeight * .3, gridBottom = windowHeight * .6; $(window).on(''scroll'', function() { // On each scroll check if `li` is in interested viewport $(''ul li'').each(function() { var thisTop = $(this).offset().top - $(window).scrollTop(); // Get the `top` of this `li` // Check if this element is in the interested viewport if (thisTop >= gridTop && (thisTop + $(this).height()) <= gridBottom) { $(this).css(''background'', ''red''); } else { $(this).css(''background'', ''gray''); } }); }); });

ul { margin: 0; list-style-type: none; padding: 0; } ul li { width: 50px; height: 30px; background: #f5f5f5; float: left; margin: 10px; text-align: center; padding-top: 10px } ul li.middleviewport { background: red; }

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script> <ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> <li>7</li> <li>8</li> <li>9</li> <li>10</li> <li>11</li> <li>12</li> <li>13</li> <li>14</li> <li>15</li> <li>16</li> <li>17</li> <li>18</li> <li>19</li> <li>20</li> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> <li>7</li> <li>8</li> <li>9</li> <li>10</li> <li>11</li> <li>12</li> <li>13</li> <li>14</li> <li>15</li> <li>16</li> <li>17</li> <li>18</li> <li>19</li> <li>20</li> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> <li>7</li> <li>8</li> <li>9</li> <li>10</li> <li>11</li> <li>12</li> <li>13</li> <li>14</li> <li>15</li> <li>16</li> <li>17</li> <li>18</li> <li>19</li> <li>20</li> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> <li>7</li> <li>8</li> <li>9</li> <li>10</li> <li>11</li> <li>12</li> <li>13</li> <li>14</li> <li>15</li> <li>16</li> <li>17</li> <li>18</li> <li>19</li> <li>20</li> </ul>

Estoy tratando de cambiar el color de los elementos <li> cuando están entre el 30% y el 60% de la ventana gráfica.

Así que tengo esta cuadrícula de elementos apilados lado a lado de esta manera:

Me encontré con algunos complementos como Waypoints, Viewport Checker y algunos otros, pero nada bueno.

¿Alguna idea?

Estoy usando una estructura bastante simple:

JSFIDDLE

HTML

<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title></title> <meta name="description" content=""> <meta name="author" content=""> <link rel="stylesheet" href="css/reset.css"> <link rel="stylesheet" href="css/styles.css"> <script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script> <script src="js/main.js"></script> <!--[if lt IE 9]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> </head> <body> <ul> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> </ul> </body> </html>

CSS:

ul { margin: auto; } ul li { width: 300px; height: 200px; background: #f5f5f5; float: left; margin: 10px; } ul li.middleviewport{ background:red; }


Cree un ancho de división ancho width:100% y height:100% que represente la ventana gráfica. Dentro de este div coloca su sistema de cuadrícula.

De lo que necesita usar jquery .position() jquery position

var grid = $( "griddiv''s" ); var position = grid.position(); var height = $(''parentdiv'').height(); lower = 0.3 * height; upper = 0.6 * height; if(grid.top >= lower && grid.top <= upper){ $(''gridcell'').css(''background'',''red''); }

No lo probé pero espero que funcione


Era libre de crear un complemento para esto. Dentro de las opciones, puede establecer porcentajes, clase css, evento desencadenante y retraso de ejecución (css cambiado a sensible solo para presentación):

jQuery.fn.extend({ markInViewport: function (options) { var that = this; this.defaults = { percentTop: 30, percentBottom: 40, cssClass: ''middleviewport'', event: ''scroll resize'', delay: 10 }; this.options = $.extend(that.defaults, options); this.win = $(window); this.delayChecking = null; this.items = []; this.checkItems = function (items) { clearTimeout(that.delayChecking); that.delayChecking = setTimeout(function () { var thisWindowHeight = that.win.height(); var thisWindowScrollTop = that.win.scrollTop(); that.items.each(function (j) { var thisItem = $(this); var thisItemHeight = thisItem.outerHeight(); var thisItemPositionTop = thisItem.offset().top; var currentPercentTop = (thisItemPositionTop - thisWindowScrollTop) / thisWindowHeight * 100; var currentPercentBottom = (thisWindowScrollTop + thisWindowHeight - thisItemPositionTop - thisItemHeight) / thisWindowHeight * 100; thisItem.toggleClass(that.options.cssClass, currentPercentTop >= that.options.percentTop && currentPercentBottom >= that.options.percentBottom); }); }, that.options.delay); }; return this.each(function () { that.items = that.children(); $(window).on(that.options.event, that.checkItems); that.checkItems(); }); } }); $(''.check_viewport'').markInViewport();

ul { margin: 0 auto; padding: 0; } ul li { width: 32.73%; height: 0; padding-bottom: 3.5%; /* responsive height */ background: #f5f5f5; float: left; margin: .3%; list-style:none; } ul li.middleviewport { background:red; }

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <body> <ul class="check_viewport"> <li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li><li></li> </ul> </body>

Violín aquí


La solución mejorada de @ Tushar para que funcione incluso después de cambiar el tamaño de la ventana (es necesario volver a calcular la ventana gráfica cada vez, no solo al principio), y para que comience ya resaltada, sin necesidad de desplazarse.

También se mejoró un poco el gráfico del ejemplo para resaltar el área interesada.

Ejecutando demo

$(document).ready(function() { $(window).on(''scroll'', function() { var windowHeight = $(window).height(), gridTop = windowHeight * .3, gridBottom = windowHeight * .6; $(''ul li'').each(function() { var thisTop = $(this).offset().top - $(window).scrollTop(); if (thisTop > gridTop && (thisTop + $(this).height()) < gridBottom) { $(this).css(''background'', ''red''); } else { $(this).css(''background'', ''silver''); } }); }); $(window).trigger(''scroll''); });

ul { margin: auto; } ul li { width: 300px; height: 10px; background: silver; float: left; margin: 10px; list-style: none; } ul li.middleviewport { background: red; } #viewportMask { position: fixed; top: 30%; bottom: 40%; left: 0; right: 0; background: red; opacity: 0.2; }

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <div id="viewportMask"></div> <ul> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> </ul>


[[Este ejemplo verifica si CUALQUIER parte del elemento está dentro de la región especificada]]

Cuando tiene las coordenadas superior e inferior de dos cuadros, puede verificar si los dos cuadros se superponen marcando:

box1.top < box2.bottom && box1.bottom > box2.top

En el siguiente ejemplo, box1 es la porción del 30% -60% de la ventana, mientras que box2 es cada elemento de la lista. Agregue la función antirrebote y tenemos:

var timeout; $(window).on("load scroll resize", function() { if (timeout) { clearTimeout(timeout); } timeout = setTimeout(function() { var $window = $(window), hitbox_top = $window.scrollTop() + $window.height() * .3, hitbox_bottom = $window.scrollTop() + $window.height() * .6; $("li").each(function() { var $element = $(this), element_top = $element.offset().top, element_bottom = $element.offset().top + $element.height(); $element.toggleClass("middle-viewport", hitbox_top < element_bottom && hitbox_bottom > element_top); }); }, 200); });

#overlay { position: fixed; left: 0; top: 30%; width: 100%; height: 30%; background-color: rgba(0, 192, 255, .5); } ul { padding: 0; text-align: center; } li { display: inline-block; margin: 10px; width: 200px; height: 200px; background-color: #F5F5F5; } li.middle-viewport { background-color: #FF0000; }

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <div id="overlay"></div> <ul> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> </ul>