答えは
css
1.main_con { overflow: hidden; height: 100vh; }
2.main_r { overflow: scroll; }
です。
position などいりません。
Demo
追記:overflow: scroll
使うと上下だけではなく左右スクロールバーも出そうです。上下だけでほしいなら、overflow-y
を使ってください。左右だけでほしいなら、overflow-x
を使ってください。
追記:.main_l
の中の画像を中央に固定したい場合はこうしてください:
css
1.main_l {
2 overflow: hidden; /* width を内容に影響されないように */
3 display: flex;
4 justify-content: center;
5 align-items: center;
6}
追記:上下の余白をなくしたいと依頼されました:
css
1.main_l_box1 { height: 100vh; }
追記:ひたすら 100vh 設定したら左側他の調整が難しくなりそうなので、下記のようでは内容の高さが固定されなくても左側を満たします。flex の方向を縦にします。画像の高さが十分であれば上下に余白がなくなれます。けど、ウィンドが短くなると、左右に余白が出るので、画像に min-width を設定してください。
css
1.main_l { flex-direction: column; }
追記:コメントの実例を改めてみたら、その効果は画像の width を 100vw に固定したものです。下記のようで設定できます。
css
1.main_l img { width: 100vw; }
追記:完璧に余白ないようにするには、img 要素ではなく、background を使います。目が不自由な方のために、a 要素に role="img" をつけて、aria-label="説明文" もつけます。
html
1<ul>
2 <li style="background-image: url(images/bg01.jpg)">
3 <a href="XXX" role="img" aria-label="画像1"></a>
4 </li>
5 <li style="background-image: url(images/bg2.jpg)">
6 <a href="XXX" role="img" aria-label="画像2"></a>
7 </li>
8 <li style="background-image: url(images/bg03.jpg)">
9 <a href="XXX" role="img" aria-label="画像3"></a>
10 </li>
11 <li style="background-image: url(images/bg04.jpg)">
12 <a href="XXX" role="img" aria-label="画像4"></a>
13 </li>
14</ul>
css
1.main_l li {
2 background-position: center center;
3 background-size: cover;
4}
追記:左側で写真のスライドみたいなのを作りたいとコメントいただいたので、CSS Transition で簡単な実装を追記します。
まずは ul を捨てて、一つの a だけ残してください。
html
1<div class="main_l">
2 <a role="img"></a>
3</div>
a に main_l を満たすための CSS:
css
1.main_l { display: block; }
2.main_l a {
3 display: block;
4 width: 100%;
5 height: 100%;
6}
a の background を設定します。background-image を後で JavaScript に設定します。
css
1.main_l a {
2 background-position: center center;
3 background-size: cover;
4}
JavaScript について、まずは設定を説明しましょう:
javascript
1let config = {
2 selector: ".main_l a",
3 bgUrls: [
4 "https://placehold.jp/1000x1000.png?text=Slide%201",
5 "https://placehold.jp/1000x1000.png?text=Slide%202",
6 "https://placehold.jp/1000x1000.png?text=Slide%203",
7 "https://placehold.jp/1000x1000.png?text=Slide%204"
8 ],
9 fadeDelay: 1,
10 interval: 5,
11 onTransition: currentUrl => {
12 let mainL = document.querySelector(".main_l a");
13 mainL.setAttribute(
14 "href",
15 `#anchor_${currentUrl.substring(currentUrl.length - 1)}`
16 );
17 mainL.setAttribute(
18 "aria-label",
19 `Slide ${currentUrl.substring(currentUrl.length - 1)}`
20 );
21 }
22};
selector はスライドになる要素の CSS 選択符です。複数の要素が見つかる場合、最初の要素を使います。
bgUrls は背景画像の URL の Array です。
fadeDelay は画像の切り替えのとき fade 動画の長さです。単位は秒。
interval は画像の切り替えの間隔時間です。単位は秒。
onTransition は毎回画像切り替えの際に実行したい関数です。関連のため、切り替え後表示する画像の URL を引数で渡します。これで切り替えごとURLによってリンクを変えます。
実装は下記のようになります:
javascript
1(function(config) {
2 // background を変える要素を選択
3 let mainL = document.querySelector(config.selector);
4
5 // background 画像を事前ロード
6 // じゃないと第一回コードする際 fade-in 動画見えない
7 let bgUrls = config.bgUrls;
8 function preloadImgUrls(urlArr) {
9 for (let url of urlArr) {
10 let img = new Image();
11 img.src = url;
12 }
13 }
14 preloadImgUrls(bgUrls);
15
16 // 最初の background を設定、今の background への index を記録
17 // 次の background 循環で取得
18 let currentBg = 0;
19 mainL.style.backgroundImage = `url(${bgUrls[currentBg]})`;
20 function getNextBgUrl() {
21 currentBg = (currentBg + 1) % bgUrls.length;
22 return bgUrls[currentBg];
23 }
24
25 // fade 動画を設定
26 let fadeDelay = config.fadeDelay;
27 mainL.style.transition = `opacity ${fadeDelay}s ease-in-out`;
28 async function waitForMs(ms) {
29 return new Promise(resolve => setTimeout(resolve, ms));
30 }
31 async function fadeOut() {
32 mainL.style.opacity = 0;
33 await waitForMs(fadeDelay * 1000);
34 }
35 async function fadeIn() {
36 await waitForMs(20); // fix animation fade in
37 // ここまたないと fade-in 動画たまに見えない
38 mainL.style.opacity = "";
39 await waitForMs(fadeDelay * 1000);
40 }
41
42 // 背景画像の循環を起動
43 let onTransition = config.onTransition;
44 onTransition(bgUrls[currentBg]);
45 setInterval(async () => {
46 await fadeOut();
47 let url = getNextBgUrl();
48 mainL.style.backgroundImage = `url(${url})`;
49 onTransition(url);
50 await fadeIn();
51 }, config.interval * 1000);
52})(config);
Demo で実装の様子を見れます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。