當點擊一個標簽時(對于一個單選按鈕,它被有意地隱藏在屏幕之外),瀏覽器會意外地跳到頁面的頂部。
注意:這個問題在不同的瀏覽器中是不一致的——它發生在safari和chrome中,而不會發生在firefox或opera中
問題: 如何防止瀏覽器在單擊單選按鈕的標簽時跳轉到頁面頂部?
示例代碼: JS小提琴 HTML
<div class="rdbut">
<label class="colour">
<input id="option-AVGANT1Y2PC" type="radio" name="Multi-licence" value="1 Year 2 PC|+23.99|0" checked="checked" />
<span>£24.99</span></label>
</div>
<div class="rdbut">
<label class="colour">
<input id="option-AVGANT2Y2PC" type="radio" name="Multi-licence" value="2 Year 2 PC|+34.00|0" checked="checked" />
<span>£35.00</span></label>
</div>
CSS
.rdbut {
margin: 0px;
}
.rdbut label {
float: left;
width: 65px;
margin: 4px;
background-color: #EFEFEF;
box-shadow: 0px 1px 3px rgba(50, 50, 50, 0.25);
border: none;
overflow: auto;
display: inline;
}
.rdbut label span {
text-align: center;
font-size: 12px;
padding: 3px 8px;
display: block;
}
.rdbut label input {
position: absolute;
top: -9999px;
left: -9999px;
}
.rdbut input:checked+span {
background-color: #404040;
color: #F7F7F7;
}
.rdbut .colour {
background-color: #FF8E22;
color: #ffffff;
}
有意思。我不知道它為什么會這樣,但是修復不需要的行為很容易:將radio輸入的CSS top和left值交換為visibility: hidden。
像這樣:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Demo</title>
<style>
#content {
width: 500px;
}
.rdbut {
margin:0px;
}
.rdbut label {
float:left;
width:65px;
margin:4px;
background-color:#EFEFEF;
border:none;
overflow:auto;
display:inline;
}
.rdbut label span {
text-align:center;
font-size: 12px;
padding:3px 8px;
display:block;
}
.rdbut label input {
position:absolute;
t/op: -9999px;
l/eft: -9999px;
visibility: hidden;
}
.rdbut input:checked + span {
background-color:#404040;
color:#F7F7F7;
}
.rdbut .colour {
background-color:#FF8E22;
color:#ffffff;
}
</style>
</head>
<body>
<div id="content">
<p>"Lorem ipsum" goes here.
</p>
<div class="rdbut">
<label class="colour"><input id="option-AVGANT1Y2PC" type="radio" name="Multi-licence" value="1 Year 2 PC|+23.99|0" checked="checked" />
<span>£24.99</span></label>
</div>
<div class="rdbut">
<label class="colour"><input id="option-AVGANT2Y2PC" type="radio" name="Multi-licence" value="2 Year 2 PC|+34.00|0" checked="checked" />
<span>£35.00</span></label>
</div>
<div class="rdbut">
<label class="colour"><input id="option-AVGANT1Y2PC" type="radio" name="Multi-licence" value="1 Year 2 PC|+23.99|0" checked="checked" />
<span>£24.99</span></label>
</div>
</div>
</body>
</html>
此處更新js fiddle:http://jsfiddle.net/XkQ7T/1/.
。 順便說一下,在每個單選按鈕上設置checked是沒有用的——實際上只有最后一個被選中。它會使你的代碼失效。此外,在無線電輸入組周圍需要表單標記。
我也有同樣的問題,我用的是@Frank Conijn的解決方案,但是如果電臺設置能見度:隱藏;或者顯示:none,標簽(for="#id ")在IE8中不起作用,最后,我這樣修復它:
.rdbut label input {
position:absolute;
left: -9999px;
}
不要設置最高值
接受的答案不可訪問:可見性:隱藏;將對屏幕閱讀器隱藏您的內容。不管怎樣,問題就在這里:
.rdbut label input {
position: absolute;
top: -9999px;
left: -9999px;
}
具體來說,最上面:-9999;導致瀏覽器試圖到達那個點。
我喜歡用下面的參數設置一個類來隱藏這樣的東西。然后你可以把它貼在任何地方:
.visually-hidden {
position: absolute;
left: -9999px;
top: auto;
width: 1px;
height: 1px;
overflow: hidden;
}
注意頂部:auto這應該可以阻止跳躍。
這就是我所做的,它工作得很好,并且仍然允許可訪問性。
.hiddenInput {
opacity: 0;
height: 0;
width: 0;
margin: 0;
padding: 0;
position: fixed;
top: 0;
}
這樣,輸入總是在“視圖”中,所以標簽不必強行滾動到它。 “top: 0”是可選的,對我來說,它默認在屏幕的中間,我只是明確地把它放在某個地方。
只需添加& quot顯示:無& quot至單選按鈕。
input[type="radio"]{display:none;}
如果你自定義你的單選按鈕,不要用display:none隱藏它,也不要用big left:-9999px。
最好使用不透明度:0,寬度:1px,高度:1px,讓單選按鈕靠近你的假單選按鈕
<style>
.radio-button__container{
position: relative
}
.radio-button{
position: absolute;
width: 1px;
height: 1px;
opacity: 0;
bottom: 0;
left: 0;
}
</style>
瀏覽器之所以會跳轉,是因為輸入(單選或復選框)和它的標簽相距很遠,當你點擊可見標簽時,輸入獲得焦點,所以瀏覽器就去輸入(焦點)所在的地方。
更改布局:將輸入、標簽和標簽的::before元素放在一個網格中。網格固定了位置,因此您可以當場隱藏輸入。這樣,標簽和輸入就不會分開,所以焦點不會出現問題:
<style>
div {
display: grid;
grid-template-columns: auto;
}
input {
display: none;
grid-column: 1 / 2;
}
label {
grid-column: 1 / 2;
display: grid;
grid-template-columns: auto auto;
}
label::before {
grid-column: 1 / 2;
content: "";
/* all necessary styling for the fancy input*/
}
</style>
<html>
<div>
<input type="radio" id="a"><label for="a">Label text</label>
</div>
</html>
顯示:無;或可見性:隱藏-& gt;不會幫助你,如果你需要一個平易近人:( 這將解決一個頁面滾動的問題,但會給屏幕閱讀器帶來一個問題。
這種變體對我很有效(謝謝@James Hang!):
input{
opacity: 0;
height: 0;
width: 0;
margin: 0;
padding: 0;
position: fixed;
top: 0;
}