Scrolling to the left in horizontally scrollable RTL element - javascript

I have a basic slider that contains some cards styled with Tailwind CSS to scroll horizontally and two buttons for scrolling in each direction, the issue is when the document direction is RTL and I'm using any of the JavaScript methods available(Element.scroll(), Element.scrollBy(), Element.scrollTo(), and *Element.scrollLeft*) to scroll into the elements on the x-axis it only scrolls to the left whether the document has a direction of RTL/LTR(haveing maximum value for scrollLeft on RTL) and looking around, I have to use negative values conditionally to make it scroll correctly.
<script setup>
import { ref, onMounted } from 'vue'
// declare a ref to hold the element reference
// the name must match template ref value
const slider = ref(null)
onMounted(() => {
console.log('mounted', slider.value)
slider.scrollLeft = 100
window.slider = slider
})
const clicked = () => {
slider.value.scrollTo({
top: 0,
left: -1000,
behavior: 'smooth'
});
}
</script>
<template>
<section class="mt-20 px-20">
<ul class="flex gap-[15px] overflow-x-auto" ref="slider">
<li class="flex-none w-[calc(33.333333%_-_10px)] border" v-for="i in 7" :key="i">
<h2>Hello</h2>
<p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Et libero corporis veritatis nemo accusantium, recusandae inventore, animi nisi at cumque sunt excepturi exercitationem tenetur vel. Id distinctio voluptate quasi in!</p>
</li>
</ul>
<button #click.prevent="clicked" type="button" class="p-4 mt-4 bg-green-200 hover:bg-blue-200">Make me scroll to the left on RTL</button>
</section>
</template>
is there any way to make the element scroll according to the document dir attribute without adding the additional checks for JS?

Related

How to vary modal content (without bootstrap)

I have a bunch of contents that all trigger the same modal. There another way to varying modal without repeat the same code in HTML?
I tried use event.relatedTarget, but without sucess.
Also, the modal is trigger by another div with id modalBtn.
var modal = document.getElementById('modalSpeaker');
var modalBtn = document.getElementById('modalBtn');
var closeBtn = document.getElementsByClassName('closeBtn')[0];
modalBtn.addEventListener('click', openModal);
closeBtn.addEventListener('click', closeModal);
function openModal() {
modal.style.display = 'block';
}
function closeModal() {
modal.style.display = 'none';
}
<div id="modalSpeaker" class="modal">
<div class="modal-content">
<div class="modal-header">
<span class="closeBtn">×</span>
</div>
<div class="modal-body">
<div class="modal-info">
<img src="images/speakers/speaker01.png" alt="">
<h3>Title</h3>
<span>About 01</span>
<span>About 02</span>
</div>
<div class="modal-about">
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Numquam amet consequatur, asperiores blanditiis quis nobis quaerat non aperiam doloribus quae, voluptatibus fuga voluptate porro dolorum velit eaque fugiat autem. Aut.
</p>
<p>
Lorem ipsum dolor sit, amet consectetur adipisicing elit. Modi animi non odit eaque, tempora et fugit vitae officia similique quidem, officiis quisquam esse ipsa enim numquam distinctio sapiente nostrum ratione.
</p>
</div>
</div>
</div>
</div>
You can use a proxy method or a lambda expression (or anonymous function) for your event listener, and pass arguments to your modal display function in order to vary the content in the modal elements.
When you register a function as the callback for an EventListener, you must provide the function reference, but not call it directly. This is because, the EventListener will call the function once the actual event has been fired. This limits your options as far as variability goes on invoking your callback function.
If instead of passing a function reference, you pass a lambda expression, then you can invoke anything you want inside the lambda expression, and this will only be executed once the lambda is invoked when the event is fired.
This gives you the flexibility to define methods with complex argument signatures that can be executed as the result of an event being fired, but with different arguments being passed for each unique event.
There are several other ways to do this as well, but I see this as the cleanest way to accomplish your task.
The below example shows how this can be done:
const modal = document.getElementById('modal');
const title = document.querySelector('#modal .title');
function openModal(color) {
title.innerText = `Selected color: ${color}`;
modal.style.display = 'block';
}
function closeModal() {
modal.style.display = 'none';
}
document.getElementById('modal-close').addEventListener('click', closeModal);
const buttonG = document.getElementById('g-btn');
const buttonR = document.getElementById('r-btn');
const buttonB = document.getElementById('b-btn');
buttonG.addEventListener('click', () => openModal('Green'));
buttonR.addEventListener('click', () => openModal('Red'));
buttonB.addEventListener('click', () => openModal('Blue'));
div#modal {
position: absolute;
top: 0;
left: 0;
width: 300px;
height: 100px;
background: whitesmoke;
display: none;
}
<div id="container">
<span class="title">Click one of the buttons to see the effect...</span>
</div>
<div id="modal">
<div class="title"></div>
<button type="button" id="modal-close">Close</button>
</div>
<button id="g-btn" type="button">Green</button>
<button id="r-btn" type="button">Red</button>
<button id="b-btn" type="button">Blue</button>

How do I add a js/jquery animation to pull down a div on hover?

Observe before hover and after hover. Instead of instantly switching, I want to create the effect that the header is being pulled down and expanded. So basically, I want the new div to appear from the top down. The html structure is as follows:
<a href="#" id='featured-article'>
<img src="img/iraq-war.jpg" class='fluid'>
<h1 class='center-text'>Featured Article: The War In Iraq</h1>
<div class="mouse-over">
<p>The Iraq War was controversial at the time blah blah blah</p>
</div>
</a>
Is there a handy way to do this with jquery? Perhaps a library or something? Or worst comes to worst, I'd like to see the raw js. Or other suggestions. Thanks
You are looking for slideDown():
$(function () {
$(".center-text").mouseover(function () {
$(this).next().stop().slideDown();
}).mouseout(function () {
$(this).next().stop().slideUp();
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<a href="#" id='featured-article'>
<img src="http://panzura.wpengine.netdna-cdn.com/wp-content/uploads/2012/03/google-logo.png" class='fluid' />
<h1 class='center-text'>Featured Article: Article</h1>
<div class="mouse-over">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Excepturi amet accusamus saepe, velit recusandae minus deserunt natus architecto quos ex. Error, labore, sed. Unde, velit, labore. Quam qui commodi accusamus.</p>
</div>
</a>

Using Javascript to create a test environment on live website

I'm currently working in the backend of a Salesforce Desk platform, trying to code dependent dropdown menus. They use what are called Case-Themes which basically renders the layout for a client-interfacing page. The problem is, when I create my own Test Case-Theme, I can't preview it without publishing it and making it live.
My question is, if I were to use Javascript to create a conditional based on parameter values, is this a valid way to publish a live theme without messing up the front-end view/functionality.
<body>
<!-- Okay to Edit - Test Area -->
<div class="test_wrapper">
<div class="test_header">
<h1>DEVELOPMENT MODE</h1>
</div>
<hr>
<div class="test_body">
<h2>Development Header</h2>
<p>Lorem ipsum dolor sit amet, consectetur </p>
</div>
<hr>
<div class="test_footer">
<h2>Development Header</h2>
<p>Voluptate necessitatibus inventore explicabo blanditiis veniam odio.</p>
<div id="test_button">Click</div>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elitinventore eligendi.</p>
<br>
<h2>Development SubSubHeading</h2>
<p>Lorem ipsum dolor sit amet, consectetur quis veritatis.</p>
</div>
<script>
$('#test_button').click(function(){
alert('You are currently in Test Mode');
});
</script>
</div>
<!-- End Test Area -->
<!-- Don't Touch - Live Area -->
<div class="live_wrapper">
<div class="live_header">
<h1>Live Mode</h1>
</div>
<hr>
<div class="live_body">
<h2>Live Subheading </h2>
<p>Lorem nis placeat vitae in qui iste laborum sequi ea.</p>
<p>Lorem delectus possimus ipsam ex, doloribus placeat. Perspiciatis.</p>
</div>
<hr>
<div class="live_footer">
<h2>Live Subheading </h2>
<p>Lorem veniam tempore provident minima, consequuntur. Qui iure blanditiis veniam odio.</p>
<div id="live_button">Click</div>
<p>Lorem vero illum necessitatibus iste rem pariatur quos autem inventore eligendi.</p>
<br>
<h2>Live SubSubHeading </h2>
<p>Lorem tus porro eligendi autem optio facilis quis veritatis.</p>
</div>
<script>
$('#live_button').click(function(){
alert('You are currently in Live Mode');
});
</script>
</div>
<!-- End Live Area -->
<script>
$(document).ready(function(){
if (window.location.search.indexOf('mode=test') > -1) {
$('.live_wrapper').hide();
$('.test_wrapper').css('display', 'block');
} else {
$('.test_wrapper').hide();
$('.live_wrapper').css('display', 'block');
}
});
</script>
As you already know, unless the URL has ?mode=test the live code should render. Can someone please point out the dangers/drawbacks of doing something like this?
As Dark Falcon said in a comment, it will show briefly while it waits for the JavaScript to fire. I would suggest adding a class to the body tag that JS adds in test mode and then you can do something like this:
body.test .live_wrapper {
display: none;
}
body.test .test_wrapper {
display: block;
}
body .live_wrapper {
display: block;
}
body .test_wrapper {
display: none;
}
This will basically set the live mode as the default until you set the class of the body to "test"
if (window.location.search.indexOf('mode=test') > -1) {
$('body').addClass('test');
}
Of course unless you're planning on changing between these on the fly, it would probably be better to turn these on or off with server-side code, assuming you are using one.
I would just use CSS for this (using display:none on the containers you want to hide).
The only drawback for using a query parameter is that if users try, they can view your test-HTML. If that is not a problem then go for it.
Just make sure you dont expose any API's that someone can exploit.

Delete an element from the code using jquery

I'm trying Jquery and now I have a problem.
I want to remove an element from my webpage. So, when I press the delete button - the big element must disappear. Using the JQ I have written something like this
$(document).ready(function(){
$(".delete").click(function(){
$(this).parents(".block").animate({ opacity: 'hide' }, "slow");
})
});
It have worked fine until I didn't add subdiv, or answer. And how the application must works now? I press the delete button and it must remove current block.
<div class = "block">
<div class = "postbuttons">
<img src = "img/delete-icon.png" class = "delete"></a>
<img src = "img/edit-icon.png" class = "edit"></a>
</div>
<div class = "postinfo">
<span class = "author">Da Monkey wrote:</span> <span class = "date">on <span>13.13.13</span></span>
</div>
<div class = "post">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ea, voluptate, unde, impedit iste sint assumenda consequatur ipsum nesciunt</p>
<a class = "answerlink" href = "#">Answer</a>
</div>
<div class = "answer">
<div class = "postbuttons">
<img src = "img/delete-icon.png" class = "delete"></a>
<img src = "img/edit-icon.png" class = "edit"></a>
</div>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fuga, numquam, culpa, omnis explicabo ut asperiores ipsam porro alias quisquam nisi iste non a maiores! Nulla odio unde dolorum officia vero. </p>
<div class = "answerinfo">
- Macaque on <span>13.13.13</span>
</div>
</div>
If you didn't understand me here the result
Respect to the funcionality:
$(document).ready(function(){
$(".delete").click(function(){
$(this).closest(".block").animate({ opacity: 'hide' }, "slow");
});
});
you should use closest instead of parents because it stop once it has found the first math and parents travels to the root of the dom. Also if you dont need the block anymore you can remove it with the jquery method remove(), after tue animation ended with a callback function.
Also you are missing some semicolons, and tags
$(document).ready(function(){
$(".delete").click(function(){
$(this).parents(".block").animate({ opacity: 'hide' }, "slow");
}) // here needs a semicolon
});
Missing tags
<div class = "block">
<div class = "postbuttons">
<img src = "img/delete-icon.png" class = "delete"></a> <--! missing <a> -->
<img src = "img/edit-icon.png" class = "edit"></a> <--! missing <a> -->
</div>
<div class = "postinfo">
<span class = "author">Da Monkey wrote:</span> <span class = "date">on <span>13.13.13</span></span>
</div>
<div class = "post">
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ea, voluptate, unde, impedit iste sint assumenda consequatur ipsum nesciunt</p>
<a class = "answerlink" href = "#">Answer</a>
</div>
<div class = "answer">
<div class = "postbuttons">
<img src = "img/delete-icon.png" class = "delete"></a> <--! missing <a> -->
<img src = "img/edit-icon.png" class = "edit"></a> <--! missing <a> -->
</div>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fuga, numquam, culpa, omnis explicabo ut asperiores ipsam porro alias quisquam nisi iste non a maiores! Nulla odio unde dolorum officia vero. </p>
<div class = "answerinfo">
- Macaque on <span>13.13.13</span>
</div>
</div>
I hope I was Useful.
Try hiding the container of the container of the delete button, which will work regardless of its class:
$(document).ready(function(){
$(".delete").click(function(){
$(this).parents(".postbuttons").parent().animate({ opacity: 'hide' }, "slow");
})
});

jQuery plugin cycle2 caption is not animating up and down during slideshow

I cant get the animation of the caption / overlay to work. I want the caption to slide up and down from the bottom as the slides go in and out. I tried a bunch of things and I couldn't get it to work. My slides are made up of divs not images. Not sure if I put the HTML for the captions in the right place. I included the caption2 plugin.
Jsfiddle
<div class="cycle-slideshow slider"
data-cycle-slides = "> div"
data-cycle-fx="scrollHorz"
data-cycle-timeout="3000"
data-cycle-caption-plugin="caption2"
data-cycle-caption-fx-out="slideUp"
data-cycle-caption-fx-in="slideDown"
>
<div class="slide1 slide">
<div class= "innerWrapper" data-cycle-title="Spring">
<p class ="slide1text">This is a great div Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptatum, unde, vel ratione nulla illum libero fuga placeat corporis molestias quisquam.</p> <img class ="slide1img" src="http://dummyimage.com/300x150/000/fff&text=slide1" alt=""/>
<br>
Click More
</div>
<div class="cycle-overlay">The Redwoods 1</div>
</div>
<div class="slide2 slide">
<div class = "innerWrapper" data-cycle-title="Spring" data-cycle-desc="Sonnenberg Gardens">
<img class ="slide2img" src="http://dummyimage.com/250x150/000/fff&text=slide2" alt=""/>
<p class ="slide2text">Text for slide 2 Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repellendus, molestias incidunt ab voluptatibus id nemo error delectus sunt impedit illum.</p>
</div>
<div class="cycle-caption">Test</div>
<div class="cycle-overlay"></div>
</div>
</div>
Jsfiddle
Thank you for your help in advance.
Remove the "test" text from cycle-caption and put it into cycle-overlay so it is consistant with the other slides. then this javascript should get you started:
$( '.cycle-slideshow' ).on( 'cycle-after', function(event, optionHash, outgoingSlideEl, incomingSlideEl, forwardFlag) {
$(incomingSlideEl).find('.cycle-overlay').slideDown();
$(outgoingSlideEl).find('.cycle-overlay').slideUp();
});
you may have to play around with it a bit.
http://jsfiddle.net/w95ya/1/
Check this link to see what events you can listen for: http://jquery.malsup.com/cycle2/api/

Categories

Resources