Подтвердить что ты не робот

Jquery - css "transform: scale" влияет на .offset() "jquery

Я пытаюсь выполнить проверку в jQuery.

Он выдает ошибку после события blur, проверяя, является ли данный input пустым. Исходя из этого, он создаст <div class="errdiv"> рядом с тем input, который будет иметь конкретную ошибку. Я использую .offset, чтобы получить положение этого конкретного input для размещения там .errdiv.

CSS

.inpt {
    width:500px;
    height:50px;
    background:#eee;
    color:#444;
    border:2px solid #ddd;
    padding:5px;
    transition: all ease 1s;
    border-radius:5px;
    outline:none;
}
.inpt:focus {
    background:#fff;
    color:#222;
    border:2px solid #000;
}
.err {
    background:pink;
    border:2px solid #f00;
    color:#a00;
}
.errdiv {
    position:absolute;
    top:0px;
    left:0px;
    height:30px;
    display:inline-block;
    padding:5px;
    border-radius:5px;
    background:#a00;
    border:1px solid #a44;
    color:#fff;
    text-align:center;    
    font-weight:bolder;
    visibility:visible;
    opacity:0;
}

JS:

$(document).ready(function(){
    $(".inpt").blur(function(){
        // Check Input for validation.
        $(".errdiv").remove(); //Remove Any Previous Error.
        var vl=$(this).val();
        var vl1=vl.split(" ").join("");
        if(vl==""||vl1==""){
            // Input is Empty Mark It red.
            $(this).addClass("err");
        }
    });
    $(".inpt").focus(function(){
        //Check Whether Input is marked Red or Not (hasClass) err?
        $(".errdiv").remove(); //Remove Any Previous Error.
        if($(this).hasClass("err")){
        // Input is Marked!
        $(this).removeClass("err");
        var tp=$(this).offset().top+12;
        var lf=$(this).offset().left+$(this).width()+12;
         // Add Error Div and appropriate Message.
        $("body").append("<div class='errdiv' style='position:absolute;top:"+tp+"px;left:"+lf+"px;'>*This is Required.</div>");
        $(".errdiv").animate({
            "visibility":"visible",
            "opacity":"1"
        },1000); //Show What is The Error?
    });
});

HTML:

<center>Hello Every One!</center>
<hr>    
<center>
<input class="inpt" placeholder="name" type="text" /><br />
<input class="inpt" placeholder="email" type="text" /><br />
<input class="inpt" placeholder="password" type="password" /><br />
 </center>
 <center>
Just Try Focusing and Bluring the Inputs
</center>

И он отлично работает. Вы можете протестировать его здесь.

Как вы видите, это создает ошибку <div> и отображает ее следующим образом:

"Actual and Expected Output".


Актуальная проблема

Проблема возникает, когда я пытаюсь выполнить scale(zoom) мою страницу для людей с ослабленным зрением и/или для действительно больших экранных дисплеев, используя:

body{
    /*mozilla hack*/
    -moz-transform: scale(1.25,1.25);
    /* Chrome and Safari */
   -webkit-transform: scale(1.25,1.25);
    /*IE */
    -ms-transform:scale(1.25,1.25);
    /*Opera*/
    -o-transform:scale(1.25,1.25);
    /*Others*/
    transform:scale(1.25,1.25);
} 

Тогда я не знаю, что произойдет. Но все идет ужасно неправильно. .offset() не работает должным образом. Вы можете увидеть его здесь.

Ошибка div теперь позиционируется как: Error After Zoom


Может ли кто-нибудь сказать мне , как правильно позиционировать .errdiv даже после scaling страницы?

Что я делаю неправильно?

Любые предложения или идеи приветствуются. Надеюсь, вы все скоро мне поможете. Заранее спасибо:).


PS:
transform-origin: 0 0;

мне не помог. и Я не хочу использовать <table><td> или писать div ранее в HTML Я хочу добавить его динамически.

Изменить для Bounty

Решение, которое я принял, хорошо для части проверки, но теперь я пытаюсь реализовать ее с помощью ajax, где содержимое будет динамически добавляться в div, и я должен добавить transition:all ease 2.0s в body css, чтобы некоторые вещи выглядели потрясающе. Но после добавления trasition, который влияет на характер transform, который изменяется принятым решением (преобразование также становится анимированным). и это не решает проблему позиционирования. Так есть ли лучший способ удовлетворить эту потребность? Может ли кто-нибудь предоставить решение для перекрестного браузера?

4b9b3361

Ответ 1

Ваша проблема в том, что jquery не возвращает правильный размер вашего элемента ($(this).width()).

попробуйте использовать функцию getBoundingClientRect (см. this), чтобы получить объект прямоугольника, который окружает ваш элемент.

вы можете использовать его в своей функции таким образом

var lf=$(this).offset().left+$(this)[0].getBoundingClientRect().width+12;

попробуйте обходное решение

http://jsfiddle.net/H5sW9/10/

получить текущий масштаб в совпадениях [1] (scaleX) и совпадения [2] (scaleY)

var matrixRegex = /matrix\((-?\d*\.?\d+),\s*0,\s*0,\s*(-?\d*\.?\d+),\s*0,\s*0\)/;
var matches =$("body").css('transform').match(matrixRegex);

перед добавлением сохранить масштаб до 100%

$("body").css('transform', 'scale(' + '1' + ')');

после того, как вы добавили восстановление div на 125%

 $("body").css('transform', 'scale(' + matches[1] + ')');

Я использовал только преобразование, а не -webkit-переход, -moz-transform.... что вы должны использовать.

для масштабирования для разных факторов x и y вы должны использовать

$("body").css('transform', 'scale(' + '1' +','  +'1' + ')');

Ответ 2

здесь находится рабочее решение

CSS

.inpt:focus {
    background:#fff;
    color:#222;
    border:2px solid #000;
}
.err {
    background:pink;
    border:2px solid #f00;
    color:#a00;
}
.errdiv {
    position:absolute;    
    height:30px;
    display:inline-block;
    padding:5px;
    border-radius:5px;
    background:#a00;
    border:1px solid #a44;
    color:#fff;
    text-align:center;    
    font-weight:bolder;
    visibility:visible;
    opacity:0;
}

HTML

<center>Hello Every One!</center>
<hr>    
<center>
    <input class="inpt" placeholder="name" type="text" /><br />
    <input class="inpt" placeholder="email" type="text" /><br />
    <input class="inpt" placeholder="password" type="password" /><br />
</center>
<center>
    Just Try Focusing and Bluring the Inputs
</center>

JAVASCRIPT

$(document).ready(function() {
    $(".inpt").blur(function() {
        // Check Input for validation.
        $(".errdiv").remove(); //Remove Any Previous Error.
        var vl = $(this).val();
        var vl1 = vl.split(" ").join("");
        if (vl == "" || vl1 == "") {
            // Input is Empty Mark It red.
            $(this).addClass("err");
        }
    });
    $(".inpt").focus(function() {
        //Check Whether Input is marked Red or Not (hasClass) err?
        // $(".errdiv").remove(); //Remove Any Previous Error.
        if ($(this).hasClass("err")) {
            // Input is Marked!
            $(this).removeClass("err");
//            var tp=$(this).offset().top+12;// not needed 
//            var lf=$(this).offset().left+$(this).width()+12;// not needed
//             // Add Error Div and appropriate Message.
            $('<div class="errdiv">*This is Required.</div>').insertAfter(this);

            $(".errdiv").animate({
                "visibility": "visible",
                "opacity": "1"
            }, 1000); //Show What is The Error?
        }
    });
});

Немного модификации, которые все

Удалите верхнее и левое свойство из вашего класса .errdiv и добавьте div динамически после элемента