Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.08.2016, 20:39
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

трансформация объекта/эффект открытки
Добрый день уважаемые. Возник интерес сделать некий эффект открытки, когда при наведении курсором на див, (в зависимости от его местоположения) идет трансформация этого дива. Сверху объекта водишь- нижний край открытки "надвигаеться", снизу -верхний.
Эффект довольно часто встречал на разных сайтах.

<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
</head>
<style>
.field {
    display: block;
    position: relative;
    background: #0C0C0E no-repeat 50% 50%;
    width: 200px;
    height: 400px;
    margin: 1%;
    border-radius: 5px;
    box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.2);
    font-family: Arial, sans-serif;
    font-size: 1.2em;
    line-height: 1.5;
}
 
.field .block  {
	position: relative;
	float: left;
    width: 80px;
    height: 100px;
    margin: 5%;  
    background-color: gold;
    border-radius: 10px;
    box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.2);
	overflow: hidden;

	color: black;
	font-size: 1.5em;
	text-align: center;
}



</style>
 
<body>
    <div class="field">
     		<div class="block">1</div>
     		<div class="block">2</div>
     		<div class="block">3</div>
     		<div class="block">4</div>
     		<div class="block">5</div>
     		<div class="block">6</div>
		
     </div>
    <script>
  
 
   function BlockShow() {

var $poster = $('.block'),
     w = $(window).width(), //window width
     h = $(window).height(); //window height

$(window).on('mousemove', function(e) {
  var offsetX = 0.5 - e.pageX / w, //cursor position X
      offsetY = 0.5 - e.pageY / h, //cursor position Y
      dy = e.pageY - h / 2, //@h/2 = center of poster
      dx = e.pageX - w / 2, //@w/2 = center of poster
      theta = Math.atan2(dy, dx), //angle between cursor and center of poster in RAD
      angle = theta * 180 / Math.PI - 90, //convert rad in degrees
      offsetPoster = $poster.data('offset'),
      transformPoster = translateY('offsetX' + px) rotateX('offsetY' + deg) rotateY('offsetX' + deg); //poster transform


  //poster transform
  $poster.css('transform', transformPoster);

}BlockShow()

 
    </script>
</body>
 
</html>


Подскажите, пожалуйста, где я допускаю ошибку ?
Ответить с цитированием
  #2 (permalink)  
Старый 09.08.2016, 15:44
Профессор
Отправить личное сообщение для Manyasha Посмотреть профиль Найти все сообщения от Manyasha
 
Регистрация: 21.09.2015
Сообщений: 196

Black_Star,
здравствуйте.

Не знаю, что такое эффект открытки Может покажите пример?
У Вас скобки потеряны и 71-я строка какая-то совсем не правильная... Вот так можно поворачивать:
<!DOCTYPE html>
<html lang="en">
  
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
</head>
<style>
.field {
    display: block;
    position: relative;
    background: #0C0C0E no-repeat 50% 50%;
    width: 200px;
    height: 400px;
    margin: 1%;
    border-radius: 5px;
    box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.2);
    font-family: Arial, sans-serif;
    font-size: 1.2em;
    line-height: 1.5;
}
  
.field .block  {
    position: relative;
    float: left;
    width: 80px;
    height: 100px;
    margin: 5%; 
    background-color: gold;
    border-radius: 10px;
    box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.2);
    overflow: hidden;
 
    color: black;
    font-size: 1.5em;
    text-align: center;
}
 
 
 
</style>
  
<body>
    <div class="field">
            <div class="block" id = "div">1</div>
            <div class="block">2</div>
            <div class="block">3</div>
            <div class="block">4</div>
            <div class="block">5</div>
            <div class="block">6</div>
         
     </div>
    <script>
	$(function (){
		w = $(window).width(), //window width
		h = $(window).height(); //window height
		$('.block').on('mousemove', function(e) {
		var coords = e.target.getBoundingClientRect();
		tt = e.pageX - coords.left
			e.target.style.transform       = 'rotate('+tt+'deg)'; 
		});	
	})
    </script>
</body>
  
</html>
Ответить с цитированием
  #3 (permalink)  
Старый 09.08.2016, 21:21
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

Что то по типу вот этого http://jsfiddle.net/webref/rgbf9ne3/

Надеюсь так понятнее, точками отмечены положения курсора. Двигаешь сверху, задирается нижний край. Двигаешь снизу - верхний

Последний раз редактировалось Black_Star, 09.08.2016 в 21:27.
Ответить с цитированием
  #4 (permalink)  
Старый 09.08.2016, 22:49
Профессор
Отправить личное сообщение для Manyasha Посмотреть профиль Найти все сообщения от Manyasha
 
Регистрация: 21.09.2015
Сообщений: 196

Ахаха, я что-то совсем запуталась в x и y
На основе Вашего примера вроде вот так:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<style>
.doors {
    display: inline-block;
}
.block {
    width: 100px;
    height: 150px;
    display: inline-block;
    background: #e79e6d;
    border: 2px solid #333;
    transition: transform 1s;
}
</style>
<script>
$(function (){
        $('.block').on('mousemove', function(e) {
        var coords = e.target.getBoundingClientRect();
        degY = e.pageX - (coords.left + coords.width)/2
		degX = -e.pageY + (coords.top + coords.height)/2
            e.target.style.transform = 'perspective(300px) rotateX(' + degX/1.5 + 'deg) rotateY(' + degY/1.5 + 'deg)';
        });
    })

</script>
<body onload = "first()">
<div class="doors">
    <div class="block">1</div>
</div>
Ответить с цитированием
  #5 (permalink)  
Старый 09.08.2016, 23:26
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

Manyasha,
Ответить с цитированием
  #6 (permalink)  
Старый 10.08.2016, 14:47
Профессор
Отправить личное сообщение для Manyasha Посмотреть профиль Найти все сообщения от Manyasha
 
Регистрация: 21.09.2015
Сообщений: 196

рони, спасибо!
И все-таки я ошиблась, при дополнении блоков и исходных стилей все криво крутится. Исправляюсь:
https://jsfiddle.net/gk1ka3fo/1/
$(function (){
	var coords = document.querySelector(".block").getBoundingClientRect();
	var widthBlock = coords.width;
	var heightBlock = coords.height;
	$('.block').on('mousemove', function(e) {
		coords = e.target.getBoundingClientRect();
		leftBlock = coords.left;
		topBlock = coords.top;
		degY = e.pageX - leftBlock - widthBlock/2
		degX = -e.pageY + topBlock + heightBlock/2
		e.target.style.transform = 'perspective(300px) rotateX(' + degX/1.5 + 'deg) rotateY(' + degY/1.5 + 'deg)';
    });
})
Ответить с цитированием
  #7 (permalink)  
Старый 10.08.2016, 20:46
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

Manyasha, Спасибо, это интересно вышло. Осталось только разобраться с вот этой строчкой

Сообщение от Manyasha Посмотреть сообщение
e.target.style.transform = 'perspective(300px) rotateX(' + degX/1.5 + 'deg) rotateY(' + degY/1.5 + 'deg)';
    });
Если увеличивать размеры .block, то оно трансформация себя начинает вести просто загадочно)
https://jsfiddle.net/BlackStar1991/gk1ka3fo/2/
как выбирается значение свойства perspective(300px) ?

Последний раз редактировалось Black_Star, 10.08.2016 в 21:23.
Ответить с цитированием
  #8 (permalink)  
Старый 12.08.2016, 14:19
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Black_Star,
Дело не в перспективе, а в коэффициенте чувствительности, в примере Manyasha это 1.5

e.target.style.transform = 'perspective(300px) rotateX(' + degX/1.5 + 'deg) rotateY(' + degY/1.5 + 'deg)';
});

Вы увеличили размеры примерно в 10 раз, попробуйте вместо 1.5 применить 15
Перспективу оставьте 300
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
трансформация svg объектов с помощью скрола мыши docshark Элементы интерфейса 3 18.04.2014 13:01
Трансформация элемента FirstRelict Элементы интерфейса 3 24.01.2014 19:01
Открытки к Новому Году (Эксклюзив, ручная работа) f.Michail Работа 18 24.12.2013 14:14
Трансформация при закрытии блока XFrei Элементы интерфейса 1 14.10.2013 10:07
3D трансформация HTML+CSS блоков macdack Общие вопросы Javascript 4 08.07.2011 23:24