Reputation: 249
When a scrollable container is an a
tag with a href
attribute the scrollbar cannot be selected instead the whole container drags. This only occurs in Firefox. Edge, Chrome & IE11 seem okay.
a {
display: block;
width: 150px;
height: 200px;
overflow-y: auto;
/* Demo CSS */
background: #ddd;
float: left;
margin-right: 20px;
margin-bottom: 20px;
}
/* Demo CSS */
h3 {
float: left;
width: 150px;
margin: 0px 20px 0px 0px;
}
h4 {
float: left;
width: 150px;
margin: 15px 20px 15px 0px;
}
* {
font-family: Arial, sans-serif;
}
<!-- Demo HTML: -->
<p>
When a scrollable container is an <code><a></code> tag with a <code>href</code> attribute then the scrollbar cannot be selected. Instead the whole container drags. This only occurs in <strong>Firefox</strong>. Edge, Chrome & IE11 seem okay.
</p>
<p>
<strong>Note: </strong>Using the mouse wheel to scroll still works.
</p>
<h4>href="#"</h4>
<h4><small>href="javascript:void(0);"</small></h4>
<h4>No href</h4>
<br clear="all" />
<!-- Buggy HTML: -->
<a href="#">
<div>
<div>Row 1</div>
<div>Row 2</div>
<div>Row 3</div>
<div>Row 4</div>
<div>Row 5</div>
<div>Row 6</div>
<div>Row 7</div>
<div>Row 8</div>
<div>Row 9</div>
<div>Row 10</div>
<div>Row 11</div>
<div>Row 12</div>
<div>Row 13</div>
<div>Row 14</div>
<div>Row 15</div>
<div>Row 16</div>
<div>Row 17</div>
<div>Row 18</div>
<div>Row 19</div>
<div>Row 20</div>
<div>Row 21</div>
<div>Row 22</div>
<div>Row 23</div>
<div>Row 24</div>
<div>Row 25</div>
<div>Row 26</div>
<div>Row 27</div>
<div>Row 28</div>
<div>Row 29</div>
<div>Row 30</div>
<div>Row 31</div>
<div>Row 32</div>
<div>Row 33</div>
<div>Row 34</div>
<div>Row 35</div>
<div>Row 36</div>
<div>Row 37</div>
<div>Row 38</div>
<div>Row 39</div>
<div>Row 40</div>
<div>Row 41</div>
<div>Row 42</div>
<div>Row 43</div>
<div>Row 44</div>
<div>Row 45</div>
<div>Row 46</div>
<div>Row 47</div>
<div>Row 48</div>
<div>Row 49</div>
<div>Row 50</div>
</div>
</a>
<a href="javascript:void(0);">
<div>
<div>Row 1</div>
<div>Row 2</div>
<div>Row 3</div>
<div>Row 4</div>
<div>Row 5</div>
<div>Row 6</div>
<div>Row 7</div>
<div>Row 8</div>
<div>Row 9</div>
<div>Row 10</div>
<div>Row 11</div>
<div>Row 12</div>
<div>Row 13</div>
<div>Row 14</div>
<div>Row 15</div>
<div>Row 16</div>
<div>Row 17</div>
<div>Row 18</div>
<div>Row 19</div>
<div>Row 20</div>
<div>Row 21</div>
<div>Row 22</div>
<div>Row 23</div>
<div>Row 24</div>
<div>Row 25</div>
<div>Row 26</div>
<div>Row 27</div>
<div>Row 28</div>
<div>Row 29</div>
<div>Row 30</div>
<div>Row 31</div>
<div>Row 32</div>
<div>Row 33</div>
<div>Row 34</div>
<div>Row 35</div>
<div>Row 36</div>
<div>Row 37</div>
<div>Row 38</div>
<div>Row 39</div>
<div>Row 40</div>
<div>Row 41</div>
<div>Row 42</div>
<div>Row 43</div>
<div>Row 44</div>
<div>Row 45</div>
<div>Row 46</div>
<div>Row 47</div>
<div>Row 48</div>
<div>Row 49</div>
<div>Row 50</div>
</div>
</a>
<a>
<div>
<div>Row 1</div>
<div>Row 2</div>
<div>Row 3</div>
<div>Row 4</div>
<div>Row 5</div>
<div>Row 6</div>
<div>Row 7</div>
<div>Row 8</div>
<div>Row 9</div>
<div>Row 10</div>
<div>Row 11</div>
<div>Row 12</div>
<div>Row 13</div>
<div>Row 14</div>
<div>Row 15</div>
<div>Row 16</div>
<div>Row 17</div>
<div>Row 18</div>
<div>Row 19</div>
<div>Row 20</div>
<div>Row 21</div>
<div>Row 22</div>
<div>Row 23</div>
<div>Row 24</div>
<div>Row 25</div>
<div>Row 26</div>
<div>Row 27</div>
<div>Row 28</div>
<div>Row 29</div>
<div>Row 30</div>
<div>Row 31</div>
<div>Row 32</div>
<div>Row 33</div>
<div>Row 34</div>
<div>Row 35</div>
<div>Row 36</div>
<div>Row 37</div>
<div>Row 38</div>
<div>Row 39</div>
<div>Row 40</div>
<div>Row 41</div>
<div>Row 42</div>
<div>Row 43</div>
<div>Row 44</div>
<div>Row 45</div>
<div>Row 46</div>
<div>Row 47</div>
<div>Row 48</div>
<div>Row 49</div>
<div>Row 50</div>
</div>
</a>
<!-- Demo HTML: -->
<br clear="all" />
<h3 style="color : red;">✘ Broken</h3>
<h3 style="color : red;">✘ Broken</h3>
<h3 style="color : green;">✔ Works</h3>
Removing the href
fixes the issue. Is this a Firefox bug?
See 3 examples here: Fiddle
P.S. I'm aware that a
tags are strictly inline
elements so aren't really meant to have inner block
elements, but I believe there are scenarios that require this and I'm curious to why this issue is occurring.
Upvotes: 4
Views: 130
Reputation: 14173
The crux of the issue is that you are showing a scrollbar on a clickable element and Firefox does not handle this in the same way as Chrome and IE.
Bug 367028 has been open for almost 10 years so I don't think this is going to be addressed any time soon.
By rearranging the HTML slightly so that the overflow is applied to a div
instead the scrollbar will function as expected in Firefox.
.container {
width: 200px;
height: 200px;
overflow-y: auto;
/* Demo CSS */
background: #ddd;
float: left;
margin-right: 20px;
margin-bottom: 20px;
}
/* Demo CSS */
h3 {
float: left;
width: 200px;
margin: 0px 20px 0px 0px;
}
h4 {
float: left;
width: 200px;
margin: 15px 20px 15px 0px;
}
* {
font-family: Arial, sans-serif;
}
<!-- Demo HTML: -->
<p>
When a scrollable container is an <code><a></code> tag with a <code>href</code> attribute then the scrollbar cannot be selected. Instead the whole container drags. This only occurs in <strong>Firefox</strong>. Edge, Chrome & IE11 seem okay.
</p>
<p>
<strong>Note: </strong>Using the mouse wheel to scroll still works.
</p>
<h4>href="#"</h4>
<h4>href="javascript:void(0);"</h4>
<h4>No href</h4>
<br clear="all" />
<!-- Buggy HTML: -->
<div class="container">
<a href="#">
<div>Row 1</div>
<div>Row 2</div>
<div>Row 3</div>
<div>Row 4</div>
<div>Row 5</div>
<div>Row 6</div>
<div>Row 7</div>
<div>Row 8</div>
<div>Row 9</div>
<div>Row 10</div>
<div>Row 11</div>
<div>Row 12</div>
<div>Row 13</div>
<div>Row 14</div>
<div>Row 15</div>
<div>Row 16</div>
<div>Row 17</div>
<div>Row 18</div>
<div>Row 19</div>
<div>Row 20</div>
<div>Row 21</div>
<div>Row 22</div>
<div>Row 23</div>
<div>Row 24</div>
<div>Row 25</div>
<div>Row 26</div>
<div>Row 27</div>
<div>Row 28</div>
<div>Row 29</div>
<div>Row 30</div>
<div>Row 31</div>
<div>Row 32</div>
<div>Row 33</div>
<div>Row 34</div>
<div>Row 35</div>
<div>Row 36</div>
<div>Row 37</div>
<div>Row 38</div>
<div>Row 39</div>
<div>Row 40</div>
<div>Row 41</div>
<div>Row 42</div>
<div>Row 43</div>
<div>Row 44</div>
<div>Row 45</div>
<div>Row 46</div>
<div>Row 47</div>
<div>Row 48</div>
<div>Row 49</div>
<div>Row 50</div>
</a>
</div>
<div class="container">
<a href="javascript:void(0);">
<div>Row 1</div>
<div>Row 2</div>
<div>Row 3</div>
<div>Row 4</div>
<div>Row 5</div>
<div>Row 6</div>
<div>Row 7</div>
<div>Row 8</div>
<div>Row 9</div>
<div>Row 10</div>
<div>Row 11</div>
<div>Row 12</div>
<div>Row 13</div>
<div>Row 14</div>
<div>Row 15</div>
<div>Row 16</div>
<div>Row 17</div>
<div>Row 18</div>
<div>Row 19</div>
<div>Row 20</div>
<div>Row 21</div>
<div>Row 22</div>
<div>Row 23</div>
<div>Row 24</div>
<div>Row 25</div>
<div>Row 26</div>
<div>Row 27</div>
<div>Row 28</div>
<div>Row 29</div>
<div>Row 30</div>
<div>Row 31</div>
<div>Row 32</div>
<div>Row 33</div>
<div>Row 34</div>
<div>Row 35</div>
<div>Row 36</div>
<div>Row 37</div>
<div>Row 38</div>
<div>Row 39</div>
<div>Row 40</div>
<div>Row 41</div>
<div>Row 42</div>
<div>Row 43</div>
<div>Row 44</div>
<div>Row 45</div>
<div>Row 46</div>
<div>Row 47</div>
<div>Row 48</div>
<div>Row 49</div>
<div>Row 50</div>
</a>
</div>
<div class="container">
<a>
<div>Row 1</div>
<div>Row 2</div>
<div>Row 3</div>
<div>Row 4</div>
<div>Row 5</div>
<div>Row 6</div>
<div>Row 7</div>
<div>Row 8</div>
<div>Row 9</div>
<div>Row 10</div>
<div>Row 11</div>
<div>Row 12</div>
<div>Row 13</div>
<div>Row 14</div>
<div>Row 15</div>
<div>Row 16</div>
<div>Row 17</div>
<div>Row 18</div>
<div>Row 19</div>
<div>Row 20</div>
<div>Row 21</div>
<div>Row 22</div>
<div>Row 23</div>
<div>Row 24</div>
<div>Row 25</div>
<div>Row 26</div>
<div>Row 27</div>
<div>Row 28</div>
<div>Row 29</div>
<div>Row 30</div>
<div>Row 31</div>
<div>Row 32</div>
<div>Row 33</div>
<div>Row 34</div>
<div>Row 35</div>
<div>Row 36</div>
<div>Row 37</div>
<div>Row 38</div>
<div>Row 39</div>
<div>Row 40</div>
<div>Row 41</div>
<div>Row 42</div>
<div>Row 43</div>
<div>Row 44</div>
<div>Row 45</div>
<div>Row 46</div>
<div>Row 47</div>
<div>Row 48</div>
<div>Row 49</div>
<div>Row 50</div>
</a>
</div>
<!-- Demo HTML: -->
<br clear="all" />
<h3 style="color : red;">✘ Broken</h3>
<h3 style="color : red;">✘ Broken</h3>
<h3 style="color : green;">✔ Works</h3>
Upvotes: 1