質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

4027閲覧

要素内で画像を拡大・マウス追従

y-goblin-ngy

総合スコア12

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

2グッド

2クリップ

投稿2016/07/14 16:43

初心者のため、説明が足りないこともあるかと思いますが、どうぞご教示ください。

目標は下記のサイトの横並び画像のように、画像にマウスオーバーすると、画像が要素内で拡大し、マウスについてくるようなエフェクトにしたいです。
http://www.allt.sk/

様々なサイト様が公開している記述を拝見し、どうにかテストの状態までたどり着きましたが、
下記2点どうしてもわかりません。

1)マウスアウト時の挙動がスムーズにならない
2)テキストにhoverした時に、画像拡大・マウス追従しなくなる

▼テスト
http://sample01.studio-goblin.com/
▼参考させていただいたサイト
http://memocarilog.info/jquery/5745

アドバイスいただければ幸いです。
お導きのほど、よろしくお願いします。
(当方、jsは全く初心者です)

html

1<div id="hogeHoge01" class="hogeHoge"><div id="homPanel01" class="homPanelIndex"><a href="/experience/index.html"><p><img src="assets/img/FS021_L.jpg"></p><span>テキストテキストテキスト</span></a></div></div> 2

css

1.hogeHoge { 2text-align: center; 3position: relative; 4z-index: 2; 5color: #333; 6outline: none; 7overflow: hidden; 8} 9.hogeHoge a { 10 width: 100%; 11 display: block; 12 text-align: center; 13 position: absolute; 14 color: #333; 15 font-weight: bold; 16 outline: none; 17} 18.hogeHoge:hover a, 19.hogeHoge a:hover { 20 color: #000; 21 text-decoration: none; 22 opacity: 1 !important; 23} 24 25.hogeHoge::before, 26.hogeHoge::after { 27 position: absolute; 28 z-index: -1; 29 display: block; 30 content: ''; 31} 32.hogeHoge, 33.hogeHoge::before, 34.hogeHoge::after { 35 -webkit-box-sizing: border-box; 36 -moz-box-sizing: border-box; 37 box-sizing: border-box; 38 -webkit-transition: all .5s; 39 transition: all .5s; 40} 41.hogeHoge:hover, 42.homPanelIndex a:hover, 43.homPanelIndex a img:hover { 44 color: #000; 45 opacity: 1 !important; 46} 47.hogeHoge::after { 48 top: 0; 49 left: -100%; 50 width: 100%; 51 height: 100%; 52} 53.hogeHoge:hover::after { 54 top:0; 55 left: 0; 56 background: #fff; 57} 58 59.homPanelIndex{ 60 position: relative; 61 overflow: hidden; 62} 63.homPanelIndex p { 64 position: absolute; 65 top: -15px; 66 left: -40px; 67} 68.homPanelIndex p img { 69 height: 140%; 70 width: auto; 71 position: absolute; 72 z-index: 444; 73 left: -20px; 74 top: -20px; 75 -moz-transition: -moz-transform 0.5s linear; 76 -webkit-transition: -webkit-transform 0.5s linear; 77 -o-transition: -o-transform 0.5s linear; 78 -ms-transition: -ms-transform 0.5s linear; 79 transition: transform 0.5s linear; 80} 81.homPanelIndex p:hover img { 82 -webkit-transform: scale(1.1); 83 -moz-transform: scale(1.1); 84 -o-transform: scale(1.1); 85 -ms-transform: scale(1.1); 86 transform: scale(1.1); 87 transition: all .5s; 88 -webkit-transition: all .5s; 89} 90.homPanelIndex span { 91 position: relative; 92 z-index: 555; 93}

javaScript

1$(function(){ 2var thisObj = $('#homPanel01'); 3if (thisObj.length == 0) return false; 4 var item = thisObj[0]; 5 var liWidth = $(' a > p', item).width() 6 var liHeight = $('a > p', item).height() 7 var ulWidth = thisObj.width(); 8 var ulHeight = thisObj.height(); 9 var offset_x = liWidth - ulWidth; 10 var offset_y = liHeight - ulHeight; 11 var itemLi = thisObj.find('p'); 12thisObj.mousemove(function(e){ 13 var cursorX = e.clientX - thisObj.offset().left; 14 (cursorX > ulWidth) ? cursorX = ulWidth : cursorX ; 15 var centerX = (cursorX / ulWidth * offset_x) - offset_x / 2 ; 16 var cursorY = e.clientY - thisObj.offset().top + $('html').scrollTop(); 17 (cursorY > ulHeight) ? cursorY = ulHeight : cursorY ; 18 var centerY = (cursorY / ulHeight * offset_y) - offset_y / 2; 19 // li要素を移動させるループ ======== 20for (var i=1; i<= itemLi.length; i++){ 21 var liLeft = parseFloat($(itemLi[i-1]).css('left')); 22 var newLeft = centerX * (i / itemLi.length) - offset_x / 2; 23 $(itemLi[i-1]).css('left', (newLeft + liLeft*5) / 10); 24 25// Y方向の移動処理 26 var liTop = parseFloat($(itemLi[i-1]).css('top')); 27 var newTop = centerY * (i / itemLi.length) - offset_y / 2; 28 $(itemLi[i-1]).css('top', (newTop + liTop*5) / 10); 29 } 30 }); 31 $("#homPanel01").mouseout(function(){ 32 $("#homPanel01 a > p").css('left','-' + 15 + 'px').css('top', '-' + 10 + 'px'); 33 }); 34 }); 35});

良い方法がありましたらご教示いただきたく思います。
どうぞよろしくお願いします。

NS-DOS, thrbrd👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

コードを書いてみました。

css

1figure { 2 width: 640px; 3 height: 400px; 4 overflow: hidden; 5 margin: auto; 6} 7 8figure > img { 9 /* 300msの部分や、ease-outの部分を変えるとアニメーションの仕方を変えられます */ 10 transition: 300ms ease-out; 11 transform-origin: 50% 50%; 12}

javascript

1var repositioningImage = function ($box, e) { 2 var mouseX = e.offsetX; 3 var mouseY = e.offsetY; 4 var $image = $box.find('img'); 5 var boxWidth = $box.width(); 6 var boxHeight = $box.height(); 7 var imageWidth = $image.width(); 8 var imageHeight = $image.height(); 9 var remainWidth = (imageWidth - boxWidth) / 2; 10 var remainHeight = (imageHeight - boxHeight) / 2; 11 var translateX = 0; 12 var translateY = 0; 13 14 if (mouseX > boxWidth / 2) { 15 translateX = remainWidth * ((mouseX - (boxWidth / 2)) / (boxWidth / 2)); 16 } else { 17 translateX = remainWidth * (mouseX / (boxWidth / 2)); 18 translateX -= remainWidth; 19 } 20 21 translateX *= -1; 22 23 if (mouseY > boxHeight / 2) { 24 translateY = remainHeight * ((mouseY - (boxHeight / 2)) / (boxHeight / 2)); 25 } else { 26 translateY = remainHeight * (mouseY / (boxHeight / 2)); 27 translateY -= remainHeight; 28 } 29 30 translateY *= -1; 31 32 $image.css({ 33 // scaleの値を変えれば拡大率が変わります。 34 // scaleはあまり古すぎるブラウザだと対応できないのでご注意ください。 35 // 古いブラウザの場合は、拡大も移動もしないので、特に問題になることも無いとは思います。 36 transform: 'translate(' + translateX + 'px, ' + translateY + 'px) scale(1.08)' 37 }); 38}; 39 40var resetPosition = function ($box) { 41 var $image = $box.find('img'); 42 43 $image.css({ 44 transform: 'translate(0, 0) scale(1)' 45 }); 46}; 47 48// figureはimgを囲んでいる要素なので、自由におきかえてください 49$('figure').on('mousemove', function (e) { 50 repositioningImage($(this), e); 51}); 52 53// figureはimgを囲んでいる要素なので、自由におきかえてください 54$('figure').on('mouseout', function (e) { 55 resetPosition($(this)); 56});

コメントを見てもあまりわからない場合は、コメントをいただければ回答します!
https://jsfiddle.net/heb8uj28/1/
↑ 動くものを用意しました :)

投稿2016/07/14 21:22

編集2016/07/14 21:34
thrbrd

総合スコア43

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y-goblin-ngy

2016/07/14 22:42

ありがとうございます!!! ただ、私がやると、なぜかカーソルをfigureの上部へ持って行くと、画像が下へ行きすぎて、figureがはみ出してしまったので、imgのサイズをfigureより大きくしてみました。 http://sample01.studio-goblin.com/ ★問題★ 質問には書いていなかったのですが、4つの横並びでリキッドレイアウトを想定しています。 なので、実際には、javaScriptで、 横幅:ブラウザ幅の1/4のサイズ、縦幅:横幅×0.5を親のボックスに設定しています。 それを行うとhover時にマウス追従はするのですが、画像拡大縮小がスムーズにいきません。(アニメーションされないのです><) ▼js var wClientWidth = document.documentElement.clientWidth; var wClientHeight = document.documentElement.clientHeight; var panelWidth = wClientWidth / 4; var panelHeight = panelWidth * 0.5; $('figure').css('width', panelWidth + 'px').css('height',panelHeight + 'px'); $('figure img').css('width', panelWidth + 25 + 'px').css('height',panelHeight + 10 + 'px'); ▼CSS figure { float: left; overflow: hidden; margin: auto; position: relative; } figure span { position: absolute; z-index: 1111; top: 0; width: 100%; display: block; text-align:center; top: 50%; left: 0; } figure > img { transition: 300ms ease-out; transform-origin: 50% 50%; } ▼HTML <body> <div class="clearfix"> <figure><a href="#"><img src="assets/img/FS021_L.jpg"><span>テキスト</span></a></figure> <figure><a href="#"><img src="assets/img/FS021_L.jpg"><span>テキスト</span></a></figure> <figure><a href="#"><img src="assets/img/FS021_L.jpg"><span>テキスト</span></a></figure> <figure><a href="#"><img src="assets/img/FS021_L.jpg"><span>テキスト</span></a></figure> </div> どうしたらいいものでしょうか・・・>< ご教示いただけましたら幸いです。 よろしくお願いいたします。
thrbrd

2016/07/14 22:47

``` css figure > img { transition: 300ms ease-out; transform-origin: 50% 50%; } /* ↓↓↓↓ after */ figure > a > img { transition: 300ms ease-out; transform-origin: 50% 50%; } ``` としてみてください!
y-goblin-ngy

2016/07/14 23:08

なんと!!!!素晴らしい!! できましたーーーーーーーーー!(・∀・) thrbrdさま、本当にありがとうございます!!!!!! 感謝・感謝です!!
thrbrd

2016/07/14 23:47

よかったです!頑張ってください:)
y-goblin-ngy

2016/07/15 01:03

thrbrdさん 解答済にしたのにすみません。 ▼CSSで下記にすると figure > a > img { transition: 300ms ease-out; transform-origin: 50% 50%; } Chromeはするっと動くのですが、IE11やFirefoxではカクカクになってしまいます。 以前の「figure > img 」に戻すとスムーズに動きます。 拡大・縮小がアニメーションしなくなっちゃいますが・・・ どうしたらよいでしょうか(T_T) お知恵を貸していただけたら幸いです。
thrbrd

2016/07/15 14:29

transition ベンダープリフィックス で調べてみると良いかもです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問