2016-06-10 7 views
1

Ich mache einen vertikalen Scroll-Selektor für einen Timer. Grundsätzlich ist es eine Reihe von Listen, die vertikal mit einem Überlauf-y scrollen: scroll und ist innerhalb eines Maskierungselements von Überlauf: versteckt.So beenden Sie den Bildlauf, wenn der Benutzerfinger aus dem Überlauf-y kommt: Bildlaufelement?

jsfiddle hier: https://jsfiddle.net/qdjnr8po/1/

HTML:

<div class="viewport-mask"> 
    <div class="number-viewport"> 
     <ul class="minutes-top"> 
      <li class="first-copy"> 
       <ul> 
        <li>00</li> 
        <li>01</li> 
        <li>02</li> 
        <li>03</li> 
        <li>04</li> 
        <li>05</li> 
        <li>06</li> 
        <li>07</li> 
        <li>08</li> 
        <li>09</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>21</li> 
        <li>22</li> 
        <li>23</li> 
        <li>24</li> 
        <li>25</li> 
        <li>26</li> 
        <li>27</li> 
        <li>28</li> 
        <li>29</li> 
        <li>30</li> 
        <li>31</li> 
        <li>32</li> 
        <li>33</li> 
        <li>34</li> 
        <li>35</li> 
        <li>36</li> 
        <li>37</li> 
        <li>38</li> 
        <li>39</li> 
        <li>40</li> 
        <li>41</li> 
        <li>42</li> 
        <li>43</li> 
        <li>44</li> 
        <li>45</li> 
        <li>46</li> 
        <li>47</li> 
        <li>48</li> 
        <li>49</li> 
        <li>50</li> 
        <li>51</li> 
        <li>52</li> 
        <li>53</li> 
        <li>54</li> 
        <li>55</li> 
        <li>56</li> 
        <li>57</li> 
        <li>58</li> 
        <li>59</li> 
       </ul> 
      </li> 
      <li class="second-copy"> 
       <ul> 
        <li>00</li> 
        <li>01</li> 
        <li>02</li> 
        <li>03</li> 
        <li>04</li> 
        <li>05</li> 
        <li>06</li> 
        <li>07</li> 
        <li>08</li> 
        <li>09</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>21</li> 
        <li>22</li> 
        <li>23</li> 
        <li>24</li> 
        <li>25</li> 
        <li>26</li> 
        <li>27</li> 
        <li>28</li> 
        <li>29</li> 
        <li>30</li> 
        <li>31</li> 
        <li>32</li> 
        <li>33</li> 
        <li>34</li> 
        <li>35</li> 
        <li>36</li> 
        <li>37</li> 
        <li>38</li> 
        <li>39</li> 
        <li>40</li> 
        <li>41</li> 
        <li>42</li> 
        <li>43</li> 
        <li>44</li> 
        <li>45</li> 
        <li>46</li> 
        <li>47</li> 
        <li>48</li> 
        <li>49</li> 
        <li>50</li> 
        <li>51</li> 
        <li>52</li> 
        <li>53</li> 
        <li>54</li> 
        <li>55</li> 
        <li>56</li> 
        <li>57</li> 
        <li>58</li> 
        <li>59</li> 
       </ul> 
      </li> 

     </ul> 
     <ul class="minutes-1"> 
      <li class="first-copy"> 
       <ul> 
        <li>00</li> 
        <li>01</li> 
        <li>02</li> 
        <li>03</li> 
        <li>04</li> 
        <li>05</li> 
        <li>06</li> 
        <li>07</li> 
        <li>08</li> 
        <li>09</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>21</li> 
        <li>22</li> 
        <li>23</li> 
        <li>24</li> 
        <li>25</li> 
        <li>26</li> 
        <li>27</li> 
        <li>28</li> 
        <li>29</li> 
        <li>30</li> 
        <li>31</li> 
        <li>32</li> 
        <li>33</li> 
        <li>34</li> 
        <li>35</li> 
        <li>36</li> 
        <li>37</li> 
        <li>38</li> 
        <li>39</li> 
        <li>40</li> 
        <li>41</li> 
        <li>42</li> 
        <li>43</li> 
        <li>44</li> 
        <li>45</li> 
        <li>46</li> 
        <li>47</li> 
        <li>48</li> 
        <li>49</li> 
        <li>50</li> 
        <li>51</li> 
        <li>52</li> 
        <li>53</li> 
        <li>54</li> 
        <li>55</li> 
        <li>56</li> 
        <li>57</li> 
        <li>58</li> 
        <li>59</li> 
       </ul> 
      </li> 
      <li class="second-copy"> 
       <ul> 
        <li>00</li> 
        <li>01</li> 
        <li>02</li> 
        <li>03</li> 
        <li>04</li> 
        <li>05</li> 
        <li>06</li> 
        <li>07</li> 
        <li>08</li> 
        <li>09</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>21</li> 
        <li>22</li> 
        <li>23</li> 
        <li>24</li> 
        <li>25</li> 
        <li>26</li> 
        <li>27</li> 
        <li>28</li> 
        <li>29</li> 
        <li>30</li> 
        <li>31</li> 
        <li>32</li> 
        <li>33</li> 
        <li>34</li> 
        <li>35</li> 
        <li>36</li> 
        <li>37</li> 
        <li>38</li> 
        <li>39</li> 
        <li>40</li> 
        <li>41</li> 
        <li>42</li> 
        <li>43</li> 
        <li>44</li> 
        <li>45</li> 
        <li>46</li> 
        <li>47</li> 
        <li>48</li> 
        <li>49</li> 
        <li>50</li> 
        <li>51</li> 
        <li>52</li> 
        <li>53</li> 
        <li>54</li> 
        <li>55</li> 
        <li>56</li> 
        <li>57</li> 
        <li>58</li> 
        <li>59</li> 
       </ul> 
      </li> 
     </ul> 
     <ul class="minutes-2"> 
      <li class="first-copy"> 
       <ul> 
        <li>00</li> 
        <li>01</li> 
        <li>02</li> 
        <li>03</li> 
        <li>04</li> 
        <li>05</li> 
        <li>06</li> 
        <li>07</li> 
        <li>08</li> 
        <li>09</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>21</li> 
        <li>22</li> 
        <li>23</li> 
        <li>24</li> 
        <li>25</li> 
        <li>26</li> 
        <li>27</li> 
        <li>28</li> 
        <li>29</li> 
        <li>30</li> 
        <li>31</li> 
        <li>32</li> 
        <li>33</li> 
        <li>34</li> 
        <li>35</li> 
        <li>36</li> 
        <li>37</li> 
        <li>38</li> 
        <li>39</li> 
        <li>40</li> 
        <li>41</li> 
        <li>42</li> 
        <li>43</li> 
        <li>44</li> 
        <li>45</li> 
        <li>46</li> 
        <li>47</li> 
        <li>48</li> 
        <li>49</li> 
        <li>50</li> 
        <li>51</li> 
        <li>52</li> 
        <li>53</li> 
        <li>54</li> 
        <li>55</li> 
        <li>56</li> 
        <li>57</li> 
        <li>58</li> 
        <li>59</li> 
       </ul> 
      </li> 
      <li class="second-copy"> 
       <ul> 
        <li>00</li> 
        <li>01</li> 
        <li>02</li> 
        <li>03</li> 
        <li>04</li> 
        <li>05</li> 
        <li>06</li> 
        <li>07</li> 
        <li>08</li> 
        <li>09</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>21</li> 
        <li>22</li> 
        <li>23</li> 
        <li>24</li> 
        <li>25</li> 
        <li>26</li> 
        <li>27</li> 
        <li>28</li> 
        <li>29</li> 
        <li>30</li> 
        <li>31</li> 
        <li>32</li> 
        <li>33</li> 
        <li>34</li> 
        <li>35</li> 
        <li>36</li> 
        <li>37</li> 
        <li>38</li> 
        <li>39</li> 
        <li>40</li> 
        <li>41</li> 
        <li>42</li> 
        <li>43</li> 
        <li>44</li> 
        <li>45</li> 
        <li>46</li> 
        <li>47</li> 
        <li>48</li> 
        <li>49</li> 
        <li>50</li> 
        <li>51</li> 
        <li>52</li> 
        <li>53</li> 
        <li>54</li> 
        <li>55</li> 
        <li>56</li> 
        <li>57</li> 
        <li>58</li> 
        <li>59</li> 
       </ul> 
      </li> 
     </ul> 
     <ul class="minutes-3"> 
      <li class="first-copy"> 
       <ul> 
        <li>00</li> 
        <li>01</li> 
        <li>02</li> 
        <li>03</li> 
        <li>04</li> 
        <li>05</li> 
        <li>06</li> 
        <li>07</li> 
        <li>08</li> 
        <li>09</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>21</li> 
        <li>22</li> 
        <li>23</li> 
        <li>24</li> 
        <li>25</li> 
        <li>26</li> 
        <li>27</li> 
        <li>28</li> 
        <li>29</li> 
        <li>30</li> 
        <li>31</li> 
        <li>32</li> 
        <li>33</li> 
        <li>34</li> 
        <li>35</li> 
        <li>36</li> 
        <li>37</li> 
        <li>38</li> 
        <li>39</li> 
        <li>40</li> 
        <li>41</li> 
        <li>42</li> 
        <li>43</li> 
        <li>44</li> 
        <li>45</li> 
        <li>46</li> 
        <li>47</li> 
        <li>48</li> 
        <li>49</li> 
        <li>50</li> 
        <li>51</li> 
        <li>52</li> 
        <li>53</li> 
        <li>54</li> 
        <li>55</li> 
        <li>56</li> 
        <li>57</li> 
        <li>58</li> 
        <li>59</li> 
       </ul> 
      </li> 
      <li class="second-copy"> 
       <ul> 
        <li>00</li> 
        <li>01</li> 
        <li>02</li> 
        <li>03</li> 
        <li>04</li> 
        <li>05</li> 
        <li>06</li> 
        <li>07</li> 
        <li>08</li> 
        <li>09</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>21</li> 
        <li>22</li> 
        <li>23</li> 
        <li>24</li> 
        <li>25</li> 
        <li>26</li> 
        <li>27</li> 
        <li>28</li> 
        <li>29</li> 
        <li>30</li> 
        <li>31</li> 
        <li>32</li> 
        <li>33</li> 
        <li>34</li> 
        <li>35</li> 
        <li>36</li> 
        <li>37</li> 
        <li>38</li> 
        <li>39</li> 
        <li>40</li> 
        <li>41</li> 
        <li>42</li> 
        <li>43</li> 
        <li>44</li> 
        <li>45</li> 
        <li>46</li> 
        <li>47</li> 
        <li>48</li> 
        <li>49</li> 
        <li>50</li> 
        <li>51</li> 
        <li>52</li> 
        <li>53</li> 
        <li>54</li> 
        <li>55</li> 
        <li>56</li> 
        <li>57</li> 
        <li>58</li> 
        <li>59</li> 
       </ul> 
      </li> 
     </ul> 
    </div> 
</div> 

CSS:

li li { 
     list-style-type: none; 
     border: 0; margin: 0; padding: 0; 
     width: 30px; 
     height: 30px; 
     line-height: 30px; 
     text-align: center; 
    } 
    ul { 
     border: 0; padding: 0; margin: 0; 
     list-style-type: none; 
    } 
    ul ul { 
     width: 40px; 
    } 
    .viewport-mask { 
     width: 30px; 
     overflow: hidden; 
     border: 1px solid black; 
    } 
    .number-viewport { 
     height: 90px; 
     width: 45px; 
     overflow: scroll; 
     overflow-x: hidden; 
     position: relative; 
    } 
    .minutes-1, .minutes-2, .minutes-3 { 
     position: absolute; 
     height: 30px; 
     z-index: 10; 
     top: 0; 
     left: 0; 
     overflow-y: scroll; 
     overflow-x: hidden; 
     color: #999; 
     font-size: 16px; 
     background-color: white; 
    } 
    .minutes-2 { 
     height: 60px; 
     z-index: 8; 
     color: #333; 
     font-size: 22px; 
    } 
    .minutes-3 { 
     height: 90px; 
     z-index: 6; 
    } 

    .minutes-top { 
     z-index: 20; 
     height: 90px; 
     overflow: scroll; 
     overflow-x: hidden; 
     width: 50px; 
     padding-left: 49px; 
     position: absolute; 
     top: 0; 
     left: 0; 
    } 

JS:

$(document).ready(function(){ 
     var timeoutId = null; 
     var $controlList = $('.minutes-top'); 
     $controlList.on('scroll', function(e){ 
      $('.minutes-1, .minutes-2, .minutes-3').scrollTop($(this).scrollTop()); 
      clearTimeout(timeoutId); 
      timeoutId = setTimeout(function(){ 
       var scroll = $controlList.scrollTop(); 
       if ($controlList.scrollTop() % 30 !== 0) { 
        $controlList.scrollTop(roundToNearest30($controlList.scrollTop())); 
       } 
       if (scroll > 2700) { 
        $controlList.animate({scrollTop: (scroll - 1800)}, 0); 
       } else if (scroll < 900) { 
        $controlList.animate({scrollTop: (scroll + 1800)}, 0); 
       } 
      }, 80); 
     }); 

     $('.minutes-top').scrollTop(30 * 60); 

     var roundToNearest30 = function(val){ 
      var newVal = val % 30; 
      if(newVal < 15) { 
       return val - newVal; 
      } else { 
       return val + (30 - newVal); 
      } 
     } 
    }); 

Wenn diese auf einem Gerät touch (die Sie emulieren durch Klicken und Ziehen), wenn ein Benutzer den Zeitgeberstreifen berührt und nach unten zieht und sein Finger außerhalb des Sichtfensters bleibt, scrollt der Zeitgeber weiter. Für meinen Anwendungsfall ist dies nicht akzeptabel. Wie kann ich das Scroll-Ereignis abbrechen, wenn der Finger des Benutzers außerhalb der Box ist?

Ich dachte darüber nach, die Ereigniskoordinaten zu überprüfen und einen Standardfehler zu vermeiden, wenn das X außerhalb des korrekten Bereichs lag, aber ich war mir nicht sicher, ob dies der beste Weg war.

Bearbeitet, um funktionierende jsfiddle hinzuzufügen.

Antwort

0

Scroll-Ereignisse selbst können nicht abgebrochen werden. Sie können jedoch die Überlaufeigenschaft bearbeiten, um das Scrollen zu verhindern. Ich habe meine Elemente überlaufen zu: versteckt, dann erstellt eine ‚scrollbaren‘ Klasse mit dem folgenden CSS:

.scrollable { 
    overflow-y: scroll; 
    -webkit-overflow-scrolling: touch; 
} 

.scrollable automatisch auf Elemente angewandt wurde, und wurde auch auf Elemente auf Touch-Ende hinzugefügt. Die einzige Zeit, zu der es entfernt wird, ist, wenn ein Benutzer außerhalb der Koordinaten des übergeordneten Containers scrollt, wodurch das Scrollen effektiv beendet wird. Dadurch konnte es auf meinen Zielgeräten funktionieren (Surface: Edge, iPhone).