14.05.2011, 17:35
|
Интересующийся
|
|
Регистрация: 18.11.2010
Сообщений: 12
|
|
Кнопка и ее 3 основных состояния
Должен был сделать панель меню с кнопками имеющими 3 состояния link,hover,visited(active) -как в обычном html, но background'ом-спрайтом, т.е. для всех кнопок один файл фона, потому и пришлось пользоваться jQuery. Вот сделать 2 состояния - я смог, но как обработать клик по кнопке и в случае ее нажатия перевести ее в состояние active(оставить кнопку в состояние hover, пока не будет нажата другая)?
Два состояния делал так:
$("#logo1").hover(
function () {
$("#logo1").css('background-position', '-150px 0px');
}, function () {
$("#logo1").css('background-position', '0px 0px');
});
П.С. Только начал изучать JQuery, вижу не так много русскоязычного материала, потому и сам не могу понять как справится с такой задачей, ибо пока не знаю всех возможностей...
|
|
14.05.2011, 17:52
|
|
Пионэр
|
|
Регистрация: 16.11.2009
Сообщений: 1,322
|
|
Псевдоклассы css :active и :hover могут применяться и не только к ссылкам. Если Вам особо не нужен IE6, с jQuery можно даже не заморачиваться.
<style type="text/css">
/* обычное состояние */
button {background: lightgrey; border: none 0px;}
/* фокус на элементе */
button:focus {background: aliceblue}
/* курсор наведен */
button:hover {background: yellow}
/* кнопка вжата */
button:active {background: orange}
</style>
<button>Я кнопка</button>
|
|
14.05.2011, 17:53
|
|
prodigy
|
|
Регистрация: 01.11.2010
Сообщений: 503
|
|
<style type = "text/css">
button{
border: 1px solid gray;
}
button:hover{
border-color: red;
}
.hovered{
border-color: red;
}
</style>
<button id = "#button">button</button>
<script type = "text/javascript">
var button = document.getElementById("#button");
button.onclick = function(){
this.className = this.className == "" ? "hovered" : "";
}
</script>
UPD
ой я кажется не совсем понял что автор хотел, прошу прощения заранее
__________________
readOnly
Последний раз редактировалось poorking, 14.05.2011 в 17:55.
|
|
14.05.2011, 17:59
|
Интересующийся
|
|
Регистрация: 18.11.2010
Сообщений: 12
|
|
subzey,
poorking,
О таких типах решения я знаю,
но если есть время и знания, хотел бы узнать решение именно моей задачи(т.е. с использованием sprite для фона кнопок).
|
|
14.05.2011, 18:05
|
|
prodigy
|
|
Регистрация: 01.11.2010
Сообщений: 503
|
|
john1992on,
Ну и что? суть в том что вы будете менять класс, а в классе свой background-position
<style type = "text/css">
button{
border: 1px solid lime;
background: url("http://javascript.ru/forum/images/ca_serenity/misc/logo.gif");
color: white;
cursor: pointer;
}
button:hover{
border-color: red;
background-position: center center;
}
.hovered{
border-color: red;
background-position: center center;
}
</style>
<button id = "#button">button</button>
<script type = "text/javascript">
var button = document.getElementById("#button");
button.onclick = function(){
this.className = this.className == "" ? "hovered" : "";
}
</script>
__________________
readOnly
Последний раз редактировалось poorking, 14.05.2011 в 18:09.
|
|
14.05.2011, 19:35
|
Интересующийся
|
|
Регистрация: 18.11.2010
Сообщений: 12
|
|
poorking,
А что если кнопок 3...? При изменение класса первой и нажатие на вторую - первая останется с измененным class.
Понимаю, что у вас позиция - не использовать jQuery, но все же... может поможете с ответом на именно мой вопрос?
|
|
14.05.2011, 19:50
|
|
prodigy
|
|
Регистрация: 01.11.2010
Сообщений: 503
|
|
john1992on,
Вот набыдлокодил вам по-быстренькому
<div id = "#wrapper"></div>
<style type = "text/css">
.normal{
color: gray;
}
.hvr{
color: green;
}
.act{
color: red;
}
</style>
<script type = "text/javascript">
function Tumbler(elem, quantity, pacific, hovered, active){
if(!elem) return;
quantity || (quantity = 1);
pacific || (pacific = "");
hovered || (hovered = "");
active || (active = "");
var elems = this.elems = [];
function makeHovered(){
if(!(this.className == active)){
this.className = hovered;
}
}
function removeHovered(){
if(!(this.className == active)){
this.className = pacific;
}
}
function makeActive(){
this.className = this.className == hovered ? active : hovered;
for(var i = 0, l = elems.length; i < l; i ++){
if(elems[i] === this){
continue;
}
if(elems[i].className == active){
elems[i].className = pacific;
}
}
}
for(var i = 0; i < quantity; i ++){
this.elems[i] = document.createElement(elem);
this.elems[i].className = pacific;
this.elems[i].onmouseover = makeHovered;
this.elems[i].onmouseout = removeHovered;
this.elems[i].onclick = makeActive;
}
}
Tumbler.prototype.getAll = function(){
var f = document.createDocumentFragment();
for(var i = 0, l = this.elems.length; i < l; i ++){
f.appendChild(this.elems[i]);
}
return f;
}
var buttons = new Tumbler("BUTTON", 5, "normal", "hvr", "act");
for(var i = 0, l = buttons.elems.length; i < l; i ++){
buttons.elems[i].innerHTML = "button " +i;
}
function byId(id){
return document.getElementById(id);
}
byId("#wrapper").appendChild(buttons.getAll());
</script>
можете наполнить протитип методами какими вдумается, css-классы свои нарисуйте, а лучше вообще по-своему сделайте, я просто набросал не подумав, если js будет выключен то кнопок не будет) ну или переделайте конструктор чтобы он ел узел или выборку.
И да про JQuery, у меня нет никакого принципа типа Jquery плохо, я считаю это гениальным изобретением, но пользоваться ей не вижу смысла(может, пока-что), и не хочу повторить судьбу тех, кто блестяще запомнил все методы и плюшки в ней, но нативных методов не знает и вообще не представляет как работает все в JS, или задает потом вопросы, а как мне в Jquery Регулярное выражение использовать?,
Вот когда смогу сам такую написать, то буду пользоваться, и то своей.
И наконец )) не знаю я Jquery, так что простите
__________________
readOnly
Последний раз редактировалось poorking, 14.05.2011 в 20:02.
|
|
14.05.2011, 20:12
|
Интересующийся
|
|
Регистрация: 18.11.2010
Сообщений: 12
|
|
poorking,
Лано, спасибо за труд!, Вы действительно профессионал по JS, но думаю, я сделаю по-своему, т.е. на фреймворке jQuery(потому и написал в именно в эту ветку форума), т.к. Ваш вариант можно переделать под мои нужды(использование sprite для фона кнопок), но это лично мне не под силу, да и нет(точнее совсем нет) желания морочить Вам с этим голову.
Если есть человек, хорошо знающий именно jQuery - просьба отозватся, есть пара моментов, которые хотел спросить...
|
|
14.05.2011, 20:56
|
|
prodigy
|
|
Регистрация: 01.11.2010
Сообщений: 503
|
|
<script type = "text/javascript" src = "http://code.jquery.com/jquery-1.6.1.min.js"></script>
<style type = "text/css">
.mymegabutton{
color: gray;
}
.hvr{
color: green;
}
.act{
color: red !important;
}
</style>
<button class = "mymegabutton">button 1</button>
<button class = "mymegabutton">button 2</button>
<button class = "mymegabutton">button 3</button>
<button class = "mymegabutton">button 4</button>
<button class = "mymegabutton">button 5</button>
<button class = "mymegabutton">button 6</button>
<script type = "text/javascript">
$(".mymegabutton").each(function(i, a){
$(this).hover(function(){
$(this).addClass("hvr");
}).mouseout(function(){
$(this).removeClass("hvr");
}).click(function(){
var that = this;
$(".mymegabutton").each(function(){
if(this === that){
$(this).toggleClass("act");
return;
}
$(this).removeClass("act");
})
})
})
</script>
ну вот jquery, принцип тот же, цсс классы тебе все равно надо написать самому, просто вместо "hvr", "act" свои классы подставь
__________________
readOnly
Последний раз редактировалось poorking, 14.05.2011 в 21:10.
|
|
14.05.2011, 21:15
|
Интересующийся
|
|
Регистрация: 18.11.2010
Сообщений: 12
|
|
poorking,
Я не могу задать всем класы, т.к. у меня для каждой кнопки отдельный стиль изменения позиции фона:
.mymegabutton {
width:150px;
height:150px;
background-image:url(images/book-logo.png);
margin-top:20px;
}
#mymegabutton1 {
background-position: 0 0;
}
#mymegabutton2 {
background-position: -300px 0;
}
#mymegabutton3 {
background-position: -600px 0;
}
а для act:
$("#mymegabutton1").css('background-position', '-150px 0px');
$("#mymegabutton2").css('background-position', '-450px 0px');
$("#mymegabutton3").css('background-position', '-750px 0px');
т.е. для каждой кнопки - параметр css другой, кнопок всего 3.
Но с вашего кода, я уже вроде начал понимать кое какие непонятные моменты...
П.С. я Ваш должник
|
|
|
|