2013-12-08 10 views
5

Sto usando l'elemento <a href> insieme al selettore :target per mostrare uno <div> che per impostazione predefinita è impostato su display:none. Il problema è che quando faccio clic sul link per mostrare che <div>, si sta scorrendo automaticamente verso il basso verso il mio sito verso lo <div>.Previene lo spostamento dello schermo quando si fa clic su <a href=></a>

C'è un modo per fermare il movimento dello schermo?

Sfortunatamente non sono ancora esperto in nulla oltre a CSS e HTML.

+0

Penso che avrai bisogno di JS per quello che hai 2 possibilità: 1. Evita lo scorrimento di JS 2. usa un elemento diverso da un ancoraggio, ma poi non avrai: funzionalità di destinazione e dovrai mostrare il tuo obiettivo element by js –

+0

Come ho già detto, non conosco ancora js (ho iniziato a impararlo a malapena una settimana fa).Ho il sospetto che ci sia un modo abbastanza semplice per fare ciò che è difficile da fare qui con CSS e HTML nudi, quindi mentre sono grato per tutte le idee JS (li salvo per dopo), la soluzione migliore sarebbe tale che è limitato css e html (anche se ce ne sono). – Czulu

risposta

0

Questo è un po 'di un hack, ma è possibile utilizzare un lavoro css di base intorno:

CSS only Example

#div1 { 
    height: 0; 
    overflow:hidden; 
} 
#div1:target { 
    height: auto; 
    margin-top: -110px; 
    padding-top: 110px; 
} 
#div2 { 
    background:red; 
} 

<a href="#div1">Click to show</a> 

<div id="div1"> 
    <div id="div2">Content</div> 
</div> 

se ne avete bisogno di essere un po' più flessibile è possibile aggiungi un po 'di js ...

More Flexible Example with JS

$('a').click(function() { 
    $('#div1').css({ 
     'margin-top': 0 - $('#div1').position().top + $(window).scrollTop(), 
      'padding-top': $('#div1').position().top - $(window).scrollTop() 
    }); 
}); 

In sostanza si sta tirando la parte superiore della div1 con il margine negativo e poi spingendo div2 indietro verso il basso con l'imbottitura, in modo che la parte superiore div1 riposa nella parte superiore della finestra ... Come ho detto è un hack ma fa il trucco.

4

nel link immettere:

<a href="javascript:void();">Link here</a> 
+1

La domanda afferma che il punto è di innescare un cambiamento di ': target'. Non puoi cambiare dove i punti "href" senza spezzarli. – Quentin

-1

Questi collegamenti sono anchor-link e per impostazione predefinita fatta per quei salti :) Si potrebbe usare JS per evitare che il comportamento predefinito in qualche modo. Ad esempio, utilizzando jQuery:

$('a').click(function(e){e.preventDefault();}); 

o per difetto aggiungere return false; ai collegamenti

+1

Ciò impedirà il seguito del collegamento. Se il collegamento non viene seguito, l'ID del frammento nell'URL non cambierà, il che distruggerebbe l'oggetto. – Quentin

+0

potresti ancora farlo da js se ne hai bisogno. Ma se non vuole il salto di solito non uso nemmeno i collegamenti :) –

+0

@Quentin: hai una soluzione personalizzata se non ti piacciono quelle fornite? –

7

È possibile utilizzare event.preventDefault() per evitare questo. Qualcosa di simile a questo:

$('a.yourclass').click(function(e) 
{ 
    //your code 
    e.preventDefault(); 
}); 

O:

<a href="javascript:void(0)" onclick="somefunction(); return false;">link</a> 
+1

Ciò impedirà il seguito del collegamento. Se il collegamento non viene seguito, l'ID del frammento nell'URL non cambierà, il che distruggerebbe l'oggetto. – Quentin

+0

@Quentin: - E che dire di questo: anchor

+1

E cosa farebbe 'somefunction()'? Imposta 'location.hash'? Questo ci riporta direttamente a dove abbiamo iniziato, ma con un codice molto più brutto e una dipendenza da JavaScript. – Quentin

0

Avrete bisogno di JS comunque:

// (in jQuery) 
$el.on('click', function(e) { 
    // find current scroll position 
    var pos = document.body.scrollTop || document.documentElement.scrollTop; 

    // let normal action propagate etc 

    // in the next available frame (async, hence setTimeout), reset scroll posiion 
    setTimeout(function() { 
    window.scrollTo(0, pos); 
    }, 1); 
}) 

Non so se questo sarà uno sfarfallio dello schermo. Potrebbe. In ogni caso è un attacco orribile.

Nel mio Chrome, non c'è nessuna luce intermittente: http://jsfiddle.net/rudiedirkx/LEwNd/1/show/

+0

Se si effettua una soluzione del genere, salverei anche la posizione x. Nel caso fosse lì :) –

0

Evitare l'uso di: bersaglio tutti insieme e basta usare evento onclick.

function myFunction() 
{ 
    document.getElementById('hiddenDiv').style.display = 'block'; 
    return false; 
} 

<a href="#" onclick="myFunction()"></a> 
Problemi correlati